-
Notifications
You must be signed in to change notification settings - Fork 1
HOWTO : 使用ztm共享文件
ztm在release 0.2里边引入了app,称之为ztm app。ztm app是一种可以被ztm启动、调用、和管理的独立程序,ztm app需要遵循一些接口,并且ztm app可以使用和访问到ztm所提供的一些上下文信息,比如ep和user等。可以用很多软件常见的mini-app来类比ztm-app,通过在ztm内运行ztm-app可以快速扩展ztm的应用场景。从控制进程执行的角度看,也可以用kubernetes和service/pod来类比ztm和ep和ztm app,ztm会调度ztm app在ep上的执行。在深入介绍ztm app的原理、机制和接口之前,我们先来看一个ztm内置的ztm app,称之为"cloud",代码在 https://github.com/flomesh-io/ztm/tree/main/agent/apps/ztm/cloud 。如下简称为cloud app。
cloud app实现了在不同的ep之间共享文件的能力。如下用一个例子来演示和介绍cloud app。在这个例子中,我们有两个ep,一个运行在macos上,是移动办公laptop;一个是运行在家里的Ubuntu Linux。演示如何把laptop上的文件发送到ubuntu上。
首先我们需要构建包括一个hub,两个ep(macos 和ubuntu)的ztm环境。部署hub和macOS的过程可以参考这个文档:https://github.com/flomesh-io/ztm/wiki/2.-HOWTO-:-using-ztm-for-secure-RDP-access 。在ubuntu上部署ZTM Agent非常简单,首先下载ztm,可以从github上ztm release页面下载;也可以自己动手从源码编译,编译参考文档 https://github.com/flomesh-io/ztm/blob/main/docs/Build.md 。下载或者编译出ztm可执行文件后,简单的执行如下命令就可以启动ZTM Agent:
sudo systemctl start ztm-agent
然后把ubuntu节点注册到ztm hub上,通常类似这样的命令就可以:
ztm join my-mesh --as my-ubuntu --permit root.json
注册成功后,可以用如下命令查看mesh、ep、和app:
ubuntu@ip-172-31-11-117:~$ ztm get mesh
NAME JOINED AS USER HUBS STATUS
ca-mi hub-local root 99.79.67.33:443 Connected
ubuntu@ip-172-31-11-117:~$ ztm get ep
NAME USER IP PORT STATUS
hub-local (local) root 99.79.67.33 44320 Online
macos root 175.162.13.165 49478 Online
ubuntu root 119.109.35.231 60620 Online
ubuntu@ip-172-31-11-117:~$ ztm get apps
NAME TAG STATE
root/files downloaded, published, running
ztm/cloud builtin, running
ztm/proxy builtin, running
ztm/script builtin
ztm/terminal builtin
ztm/tunnel builtin, running
如上最后一步,我们看到了ztm/cloud 的状态是running,表示cloud app已经运行了。接下来我们在macos上共享一个文件。在每个ep上,ztm使用一个独立的目录来存放需要共享的文件,这样可以保证只有目录中的文件可以被访问到,类似web server需要设置一个Root Directory一样。这个目录默认是~/ztmCloud,当然也可以自己指定这个目录,指定目录的电话,用的命令是:
ztm cloud config --local-dir /path/to/my/local
因此,共享文件的第一步是把需要共享的文件拷贝到这个目录中,我使用的演示文件叫做a.jar,这个文件大概74M。
cp ~/a.jar ~/ztmCloud/users/root/
这里,users是ztm指定的字目录;root是当前用户名,文件都是放在用户名的字目录里。然后用ztm cloud ls命令看下新加入的文件:
caishu@caishu-macair4 % ztm cloud ls /users/root
NAME STATE SIZE DATE SOURCES SHARED
a.jar new 74384901 Tue Sep 17 21:50:19 2024 0 -
注意,这里的STATE是new,表示这个文件当前在macos这个ep上。我们需要使用ztm cloud upload命令把这个文件信息上传到hub上,这样其他的ep就能看到这个文件了:
caishu@caishu-macair4 % ztm cloud upload /users/root/a.jar
File uploaded: /users/root/a.jar
此时再用ztm cloud ls命令查看,会看到STATE变成了synced:
caishu@caishu-macair4 % ztm cloud ls /users/root
NAME STATE SIZE DATE SOURCES SHARED
a.jar synced 74384901 Tue Sep 17 21:50:19 2024 1 -
接下来我们在ubuntu上下载这个文件a.jar。需要注意的是,在ztm中,ubuntu是直接从macos上下载的,文件并不会被上传到云端,因此具有很高的安全性和隐私保护能力;这个特性也是有别与网盘等web2.0共享文件机制的。在ztm中,背后的传输机制类似建立了隧道,形成一种p2p的传输能力。首先我们在ubuntu上查看这个文件:
ubuntu@ip-172-31-11-117:~$ ztm cloud ls /users/root/
NAME STATE SIZE DATE SOURCES SHARED
a.jar missing 74384901 Tue Sep 17 13:53:41 2024 1 -
可以看到STATE是missing状态,表示ubuntu本地并没有这个文件。我们使用ztm cloud download命令下载该文件:
ubuntu@ip-172-31-11-117:~$ ztm cloud download /users/root/a.jar
ubuntu@ip-172-31-11-117:~$ ztm cloud ls /users/root/
NAME STATE SIZE DATE SOURCES SHARED
a.jar synced 74384901 Tue Sep 17 13:53:41 2024 2 -
下载成功后,STATE变成了synced。此时文件被保存到了~/ztmCloud/目录中,因为我们用systemctl start ztm-agent命令启动,该命令运行在root用户下,因此文件被保存到了/root/ztmCloud 下。
ubuntu@ip-172-31-11-117:~$ sudo ls -lh /root/ztmCloud/users/root/
total 71M
-rw-r--r-- 1 root root 71M Sep 17 13:53 a.jar
到这里,我们就完成了文件共享和下载的演示。再进一步看看cloud app的能力。
在ubuntu上下载后,a.jar文件在ztm的两个ep上都有保存了,一个在macos上,一个在ubuntu上。因此,我们在macOS上再执行ztm cloud ls的时候,可以看到该文件的sources 变成了2:
caishu@caishu-macair4 files % ztm files ls /users/root
NAME STATE SIZE DATE SOURCES SHARED
a.jar synced 74384901 Tue Sep 17 21:50:19 2024 2 -
此时,如果再有用户从第三个ep下载该文件,ztm会自动尝试从这两个 source 分别下载该文件的部分内容,再组装成完成的文件。如果某个ep离线了,那么ztm会自动从剩下存活的ep下载文件。cool~