Zfs
ZFS:使用滾動快照發送/接收
我的小型家庭伺服器在具有 ZFS 的發行版上執行。在那個系統上,我實現了一個滾動快照方案:
- 每小時創建一個快照
- 每天一次,鏈變細,這樣我就有了一組每小時/每天/每週/每月的快照
我想在我辦公室的 USB 驅動器上儲存一些文件系統的異地備份。計劃是每隔一周更新一次驅動器。但是,由於滾動快照方案,我在實現增量快照時遇到了麻煩。
為了給你一個例子,這是我想要的程序:
- 初始快照:
zfs snap tank/fs@snap0
- 傳輸初始快照:
zfs send tank/fs@snap0 | zfs recv -Fduv backup_tank
backup_tank
異地儲存- 拍幾張快照:
zfs snap tank/fs@snap1
,zfs snap tank/fs@snap2
- 細化鏈條:
zfs destroy tank/fs@snap0
- 返回
backup_tank
並對文件系統進行增量更新- 顯然,
zfs send -I snap0 tank/fs@snap2 | zfs recv -Fduv backup_tank
失敗,因為snap0
不再存在tank
。長話短說:
是否有一個巧妙的解決方案可以將快照鏈的細化和增量
send
/結合起來recv
?每次我連接驅動器並執行一些命令時,我都想在那個時間點擁有文件系統的副本。在此範例中,backup_tank
應包含快照fs@snap1
和fs@snap2
.
你不能完全按照你的意願去做。
每當您創建
zfs send
流時,該流都會創建為兩個快照之間的增量。(這是目前實現 ZFS 的唯一方法。)為了將該流應用到不同的數據集,目標數據集必須包含流的起始快照;如果不是,則兩者沒有共同的參考點。當您銷毀源數據集上的 @snap0 快照時,您會造成 ZFS 無法協調的情況。執行您要求的方法是始終在兩個數據集之間保持一個共同的快照,並將該共同快照用作下一個發送流的起點。
因此,您可以在第 1 步中創建一個快照 @backup0,然後在第 6 步附近的某個時間創建並使用快照 @backup1 來更新異地備份。然後,您傳輸作為 @backup0 和 @backup1 之間的增量的流(這將包括所有中間快照),然後刪除 @backup0但保留@backup1(它成為新的公分母)。下次刷新備份時,您可能會創建@backup2(而不是@backup1)並在@backup1 和@backup2(而不是@backup0 和@backup1)之間傳輸增量,然後刪除@backup1(而不是@backup0),並且很快。