如何讓 rsync 建立到來源目錄的硬鏈接,同時備份更改的檔案?

如何讓 rsync 建立到來源目錄的硬鏈接,同時備份更改的檔案?

我有兩個備份目錄位於備份伺服器上的相同檔案系統上。第一個稱為「克隆」 - 它包含我的筆記型電腦的克隆,每晚透過 rsync 遠端更新。第二個稱為“備份”,它是僅克隆重要部分的每週 rsync 快照。為了節省空間,使用 --link-dest 將「備份」建立為複製而不是副本的硬連結:

rsync -avum --link-dest=/clone /clone/ /backup

現在我還想使用 --backup 選項將已更改檔案的舊版本從備份複製到保留區域,以防我需要它們或意外刪除重要的內容。這在沒有 --link-dest 的情況下工作正常:

rsync -avumb --backup-dir=/holding/2016_10_22 /clone/ /backup

但是,這會在備份中建立已更改文件的副本,浪費空間 - 我想要硬連結。但如果我將 --link-dest parm 加回:

rsync -avumb --backup-dir=/holding/2016_10_22 --link-dest=/clone /clone/ /backup

……那麼只有已刪除文件已備份。更改的檔案會默默地硬連結。原因(我相信)是 --link-dest 共享 --copy-dest 的邏輯。即,如果來源檔案相對於複製目標(或連結目標)檔案沒有更改,則不會傳輸它,而是從複製/連結目標目錄複製/連結到目標目錄。因為我使用來源目錄作為連結目標目錄,所以所有未刪除的檔案都“不變”,並以靜默方式處理。

我可以分兩步完成此操作:首先 --backup 不帶 --link-dest,然後再次 --link-dest 不帶 --backup。 (較新版本的 rsync 將用硬連結替換相同的檔案。)但我真的更喜歡一次完成所有操作。

有沒有一種方法可以在僅建立硬連結的情況下進行 --backup ? (我真正想要的是帶有硬鏈接而不是文件傳輸的“常規”rsync。考慮到該選項的預期邏輯,我對 --link-dest 的使用似乎有點像黑客。)

額外問題:手冊頁似乎表明僅在空目標上使用 --link-dest 是首選:

當複製到空目標層次結構時,此選項效果最佳,因為現有檔案可能會調整其屬性,並且這可能會透過硬連結影響備用目標檔案。此外,逐項列出更改可能會有點混亂。

關於逐項列出「混亂」的部分有點含糊。假設我不太關心檔案屬性,在非空目標上使用 --link-dest 真的是「危險」嗎?誰能舉個例子嗎?

答案1

如上所述,我最終分兩步運行了該過程。

src = the "live" clone directory, a mirror of my laptop = primary backup
dst = the weekly snapshot of important parts clone
trashdir = the items from src that don't exist in dst, because they have since been deleted, sorted into date-stamped directories

cmd = ("rsync -avumb --stats --delete --delete-excluded --filter='merge %s' --backup-dir=%s %s %s" %
       (filterfile, trashdir, src, dst))

cmd = ("rsync -avum --stats --delete --delete-excluded --filter='merge %s' --link-dest=%s %s %s" %
       (filterfile, src, src, dst))

第一步對克隆的重要部分進行備份,並將自上次備份以來刪除的檔案儲存到trashdir。 (出於某些原因,我只希望對選定的文件進行中間備份,並且只希望每週更新一次。)

第二步將備份中的檔案轉換為指向克隆的硬連結。結果是備份佔用的實際空間為零。根據定義,trashdir 不是硬連結文件,因為它僅包含從克隆和備份中刪除的文件。

我不完全確定 --delete-excluded 標誌是否必要(特別是在第二個命令中)。我把它們留在那裡,以防我更改過濾文件,它定義了創建備份時要忽略克隆的哪些部分。

我發現五年內,trashdir 已經增長到大約克隆的大小,因此總大小 = 克隆 x2,這對我來說是可以接受的,因為我有六年的已刪除文件歷史,並且可以通過以下方式輕鬆修剪它們日期。

除了上述內容之外,我還有一個腳本,可以運行cp -al將克隆複製到大約一個月的帶有日期標記的旋轉硬連結快照中。這涵蓋了已更改而不是已刪除的檔案。一個月的總大小似乎約為克隆大小的一半。

所以總磁碟空間約為克隆的 2.5 倍,我有:

  • 克隆本身,每晚更新
  • 選定文件的備份,穩定一周
  • 一個月的版本化克隆快照
  • 六年的已刪除文件

我認為這可以很好地防止丟失原始磁碟、覆蓋文件並需要舊版本以及刪除文件並稍後需要它。

這有點複雜,可能可以透過第三方軟體來實現,但它對我有用,並且是基於低階工具構建的,這些工具不太可能消失或顯著改變功能。

(@gsl - 實際上,感謝您請求更新。我發現當我更新到 python3 時,我的一個腳本壞了,並且已經幾個月沒有運行了。我需要更多地關注我的錯誤日誌!)

不過,我仍然對簡化此操作的方法感興趣 - 因此,如果我正在做的事情可以通過某種更簡單的方式完成,請隨時發表評論。

相關內容