Linux

“硬連結”大文件的部分,其中只有一小部分發生了變化

  • October 15, 2016

我使用 rsync 進行備份:

rsync -a --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP

這樣,由於使用了硬連結,我節省了空間。

當我需要備份一個不斷變化的大文件(虛擬機映像)時,就會出現問題。

是否可以硬連結不是整個圖像,而只是更改部分?有什麼工具可以解決這個問題嗎?

這裡可以做很多事情。請注意,它們實際上都沒有使用硬連結,因為它們只能指向一個完整的文件。使用btrfs文件系統在這裡開闢了一些非常有用的可能性。請注意,btrfs目前(最新版本是 v3.13)仍處於試驗階段。但是,它的COW(寫時複製)能力非常適合這種事情(當然前提是可以在同一文件系統上進行備份)。考慮btrfs安裝在 上的文件系統/mnt,您可以使用以下命令製作整個文件系統的原子快照:

btrfs subvolume snapshot /mnt /mnt/snapshot

要允許部分快照,您必須將要備份的文件放在一個subvolume而不是目錄中。例如:

btrfs subvolume create /mnt/subvol
mv stuff /mnt/subvol
btrfs subvolume snapshot /mnt/subvol /mnt/subvol_snapshot

除了使用之外btfrs,您還可以考慮將虛擬機映像掛載在備份的一側或兩側,並rsync在兩個掛載點之間使用。

此部落格展示瞭如何.vdi使用qemu-utils. 以 root 身份執行的命令(未經測試):

modprobe nbd
qemu-nbd -c /dev/nbd0 <vdi-file>
mount /dev/nbd0p1 /mnt
...
umount /mnt
qemu-nbd -d /dev/nbd0

最後,可能有用的最簡單方法--inplacersync. 從手冊頁:

--inplace
         This option changes how rsync transfers a file when its data needs to
         be updated: instead of the default method of creating a new copy of the
         file and moving it into place when it is complete, rsync instead writes
         the updated data directly to the destination file.
...
         This option is useful for transferring large files with block-based
         changes or appended data, and also on systems that are disk bound, not
         network bound.

當然,這裡的問題是,將它與--link-dest(在rsync<2.6.4 版本中,兩者完全不兼容)結合使用沒有任何好處,因為仍然必須在目的地創建文件的副本。

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