對於 btrfs 子卷,我透過兩個階段建立了一個簡單的增量備份:
btrfs send old/@ > base.btrfs
btrfs send new/@ -p old/@ > update.btrfs
這兩個來源子磁碟區是在不同時間從同一個主動安裝的子磁碟區擷取的快照。
在目標上,我嘗試恢復:
btrfs receive ./ < base.btrfs
btrfs receive ./ < update.btrfs
預期先前的命令將建立初始備份階段的復原快照,而後者將套用進一步的增量階段。
前一個命令成功,但後一個命令失敗:
ERROR: creating snapshot ./@ -> @ failed: File exists
由於很明顯,我無法將後一階段有效地應用於不存在的目標,因此我對進程執行此檢查的原因以及成功應用更新的預期感到困惑。
如何將更新階段應用於透過恢復初始階段所產生的目標?
答案1
您不能(如在傳送端)擁有多個同名的子磁碟區。
您可以mv
在目標系統上建立基本快照/子磁碟區:
mv @ @.old
btrfs receive ./ < update.btrfs
答案2
自從發布這個問題以來,我已經學到了足夠的知識來回答這個問題。
答案分為兩部分。
首先,receive
子指令總是在目標目錄中建立與原始子磁碟區同名的新項目,無論新子磁碟區是從子流還是父流建立。因此,目標目錄必須為空,至少具有與原始子磁碟區相同的名稱。一個簡單的技巧是為父子捲和每個子子磁碟區分別建立一個新的空目錄。
其次,儘管對子卷的子命令的呼叫沒有給出對父卷的引用,但只要父卷已恢復到同一分區的子卷,它就可以利用來自父卷的必要資料。也就是說,receive
只要先前已在父流的同一分區上呼叫過該子命令,該子命令就會對子流產生所需的效果。
一旦父項和子項被恢復,任何父項都可以被刪除而不會傷害子項。
因此,以下將是實現原始目標的有效命令序列:
mkdir _tmp
btrfs receive _tmp/ < base.btrfs
btrfs receive ./ < update.btrfs
btrfs subvolume delete _tmp/@
rmdir _tmp
然後可以透過 獲得子流的全部內容./@
。
base.btrfs
當然,如果要保存的子流有多個祖先(例如,有自己的父流),則需要進一步的命令。