我試圖在多台電腦之間保持資料夾樹同步。目前,我正在使用unison
帶有中央遠端伺服器的星形拓撲。我希望伺服器上的資料被加密,所以在伺服器上,unison
樹(包括.unison
資料夾)保存在encfs
樹內。要執行同步,每個客戶端:
- 安裝伺服器存儲
sshfs
- 將
encfs
儲存掛載到sshfs
本地 unison
在文件的本機副本和已安裝的文件副本之間執行。
該設定有很多優點:
- 開源工具
- 可編寫腳本的命令列解決方案
- 安全通訊
ssh
- 伺服器的隱私,因為
encfs
資料夾樹永遠不會在那裡解密 - 能夠在同步期間區分修改,因為
unison
在純文字上運行
效果不太好的一件事是同步速度。由於encfs
來自伺服器的資料夾安裝在客戶端上,因此stat()
客戶端所做的每個呼叫都必須轉發ssh
到伺服器。文檔樹已經有數千個文件,並且unison
同步必須對每個文件至少執行一次stat()
呼叫(以排除對.unison
資料夾中儲存的狀態的修改)。是否有更快的替代方案可以保持上述優點?
注意:如果我要刪除最後一個條件,我可以運行unison
密文,並且只在本地掛載encfs
樹。然後unison
將在客戶端和伺服器上本地運行,因此stat()
呼叫速度會很快。但很高興能夠選擇至少查看正在同步的文件;如果unison
超過encfs
密文,檔案名稱將被加密。
我知道要解決這個問題,必須在同步期間有效地將文件元資料從伺服器傳輸到客戶端。我想知道是否有一種方法(即現有工具的組合)將元數據存儲在一個地方,以便通過僅發送一個(或幾個)數據塊來傳輸所有元數據,而不是發送數千個塊(這就是轉發stat()
呼叫正在做的事情)。
如果我要替換encfs
為儲存在伺服器上的大檔案中的ext4
over分割區,並透過over安裝在客戶端上,該怎麼辦?檔案系統是否會將檔案元資料保存在一起,以便僅透過發送幾個區塊來傳輸它?是否知道在更新期間僅發送幾個區塊,而不是重寫整個加密檔案?dm-crypt
losetup
sshfs
ext4
sshfs
答案1
我已經成功完成了ext4
over luks
over sshfs
。我發現在這種類型的坐騎上運行比 over overunison
快得多。因此,這數千個結構一定以某種方式捆綁在檔案系統中,以便它們在同步期間需要更少的網路流量。encfs
sshfs
stat()
ext4
有點煩人的一件事是檔案系統需要為每個檔案提供一個使用者 ID,並且當檔案系統本地安裝在客戶端上ext4
時,該使用者 ID 用於計算存取權限。ext4
就我而言,我選擇將本機使用者 ID 變更為特定數字全部我正在同步的客戶端。另一種方法是將檔案儲存在ext4
uid 0 的 fs 中,然後使用非 root uidbindfs
掛載fs。ext4