我正在尝试在多台计算机之间保持文件夹树同步。目前,我使用的unison
是星型拓扑,带有中央远程服务器。我希望服务器上的数据被加密,因此在服务器上,树unison
(包括.unison
文件夹)保存在encfs
树内。要执行同步,每个客户端:
- 使用以下方式安装服务器存储
sshfs
encfs
在sshfs
本地安装存储unison
在文档的本地副本和已安装的文档之间执行。
该设置有许多优点:
- 开源工具
- 可编写脚本的命令行解决方案
- 安全通信
ssh
- 服务器隐私,因为
encfs
文件夹树从未在服务器上解密 unison
由于是在纯文本上运行,因此能够在同步期间区分修改
有一件事不太好,那就是同步速度。由于encfs
服务器上的文件夹安装在客户端上,因此stat()
客户端的每次调用都必须转发ssh
到服务器。文档树已经有数千个文件,同步unison
必须对每个文件执行至少一次stat()
调用(以排除对.unison
文件夹中存储的状态的修改)。有没有更快的替代方案可以保留上面列出的优点?
注意:如果我要删除最后一个条件,我可以unison
通过密文运行,并且只在encfs
本地安装树。然后unison
将在客户端和服务器上本地运行,因此stat()
调用会很快。但最好至少可以选择查看正在同步哪些文件;使用unison
密encfs
文,文件名将被加密。
我理解,要解决这个问题,必须在同步期间高效地将文件元数据从服务器传输到客户端。我想知道是否有办法(即现有工具的组合)将元数据存储在一个地方,这样只需发送一个(或几个)数据块就可以传输所有数据,而不是发送数千个数据块(这就是转发stat()
调用所做的)。
如果我要替换存储在服务器上一个大文件内的 over 分区,并通过 over 安装在客户端上,会怎么样encfs
?文件ext4
系统是否会将文件元数据保存在一起,以便仅通过发送几个块即可传输?在更新期间是否知道只发送几个块,而不是重写整个加密文件?dm-crypt
losetup
sshfs
ext4
sshfs
答案1
我曾成功使用ext4
over luks
over sshfs
。我发现在这种类型的挂载上运行比 over overunison
要快得多。因此,一定是这些数千个结构以某种方式捆绑在fs 中,这样它们在同步期间需要的网络流量就更少了。encfs
sshfs
stat()
ext4
有一点有点烦人,那就是ext4
文件系统需要每个文件都有一个用户 ID,当文件系统在客户端本地挂载时,这个用户 ID 用于计算访问权限ext4
。就我而言,我选择将本地用户 ID 更改为特定数字全部我正在同步的客户端。另一种方法是将文件存储在ext4
具有 uid 0 的 fs 中,然后使用非 root uidbindfs
挂载fs。ext4