Zfs

ZFS:使用滾動快照發送/接收

  • April 10, 2018

我的小型家庭伺服器在具有 ZFS 的發行版上執行。在那個系統上,我實現了一個滾動快照方案:

  • 每小時創建一個快照
  • 每天一次,鏈變細,這樣我就有了一組每小時/每天/每週/每月的快照

我想在我辦公室的 USB 驅動器上儲存一些文件系統的異地備份。計劃是每隔一周更新一次驅動器。但是,由於滾動快照方案,我在實現增量快照時遇到了麻煩。

為了給你一個例子,這是我想要的程序:

  1. 初始快照:zfs snap tank/fs@snap0
  2. 傳輸初始快照:zfs send tank/fs@snap0 | zfs recv -Fduv backup_tank
  3. backup_tank異地儲存
  4. 拍幾張快照: zfs snap tank/fs@snap1, zfs snap tank/fs@snap2
  5. 細化鏈條: zfs destroy tank/fs@snap0
  6. 返回backup_tank並對文件系統進行增量更新
  7. 顯然,zfs send -I snap0 tank/fs@snap2 | zfs recv -Fduv backup_tank失敗,因為snap0不再存在tank

長話短說:

是否有一個巧妙的解決方案可以將快照鏈的細化和增量send/結合起來recv?每次我連接驅動器並執行一些命令時,我都想在那個時間點擁有文件系統的副本。在此範例中,backup_tank應包含快照fs@snap1fs@snap2.

你不能完全按照你的意願去做。

每當您創建zfs send流時,該流都會創建為兩個快照之間的增量。(這是目前實現 ZFS 的唯一方法。)為了將該流應用到不同的數據集,目標數據集必須包含流的起始快照;如果不是,則兩者沒有共同的參考點。當您銷毀源數據集上的 @snap0 快照時,您會造成 ZFS 無法協調的情況。

執行您要求的方法是始終在兩個數據集之間保持一個共同的快照,並將該共同快照用作下一個發送流的起點。

因此,您可以在第 1 步中創建一個快照 @backup0,然後在第 6 步附近的某個時間創建並使用快照 @backup1 來更新異地備份。然後,您傳輸作為 @backup0 和 @backup1 之間的增量的流(這將包括所有中間快照),然後刪除 @backup0但保留@backup1(它成為新的公分母)。下次刷新備份時,您可能會創建@backup2(而不是@backup1)並在@backup1 和@backup2(而不是@backup0 和@backup1)之間傳輸增量,然後刪除@backup1(而不是@backup0),並且很快。

引用自:https://unix.stackexchange.com/questions/289127