備份 Xen 域
我目前正在開發 Xen 備份系統,但是我遇到了以下問題:
我有兩種備份方法:
dd
從 LVM 快照做,然後tar
響起來,然後遠端同步它- 掛載 LVM 快照並將所有內容同步到遠端位置
現在第二個選項允許我使用,
rdiff-backup
所以我可以保存增量備份並節省大量空間,而第一個選項確實很重。現在,我有兩個問題:
- 有沒有辦法在使用時沒有“空白”
dd
?假設我有一個 50GB 的 LVM 卷並且只使用了 3GB,使用dd
它時會創建一個 50GB 的映像(因此浪費了 47GB)。tar
可以解決這個問題,但需要很多額外的時間(我基本上沒有)- 這些
img
文件可以通過dd
某種方式增量保存嗎?
壓縮空格
讓我們從您的快照中回歸基礎。首先,我要請你看看你為什麼要壓縮一個文件。停下來想想 tar 做了什麼以及為什麼要這樣做。
$ dd if=/dev/zero of=zero bs=$((1024*1024)) count=2048 2048+0 records in 2048+0 records out 2147483648 bytes transferred in 46.748718 secs (45936739 bytes/sec) $ time gzip zero real 1m0.333s user 0m37.838s sys 0m1.778s $ ls -l zero.gz -rw-r--r-- 1 user group 2084110 Mar 11 16:18 zero.gz
鑑於此,我們可以看到壓縮在其他空白空間上為我們提供了大約 1000:1 的優勢。無論系統對稀疏文件的支持如何,壓縮都有效。還有其他算法會更加收緊它,但對於原始的整體性能,
gzip
獲勝。Unix 實用程序和稀疏文件
給定一個支持稀疏文件的系統,
dd
有時可以選擇節省空間。奇怪的是,我的 mac 包含一個帶有標誌的版本dd
,conv=sparse
但 HFS+ 文件系統不支持它。相反,我用於測試的全新 Debian 安裝支持 ext4 中的稀疏文件,但該安裝dd
沒有標誌。去搞清楚。因此,另一個練習:
我將 /dev/zero 複製到與上面相同的文件中。它在文件系統上佔用了 2G 空間,如
du
、df
和ls
. 然後我使用cp
它,發現自己有 2 個文件使用 4GB 空間。所以,是時候嘗試另一個標誌了:`cp --sparse=always sparse sparse2`
使用它會強制 cp 在看到一長串零時採用正常文件並使用稀疏分配。現在我有 2 個文件根據 和 報告佔用 4GB
ls
,但根據du
和僅佔用 2GBdf
。現在我有一個稀疏文件,cp 會表現嗎?是的。
cp sparse2 sparse
結果ls
顯示每個文件消耗了 2GB 的空間,但du
顯示它們在文件系統上佔用了零塊。結論:一些實用程序會尊重已經稀疏的文件,但大多數會寫回整個文件。除非你強迫它的手嘗試,否則甚至cp
不知道將寫入的文件變回稀疏。接下來,我創建了一個 1MB 的文件並將其設為稀疏條目,然後嘗試在
vim
. 儘管只輸入了幾個字元,我們又回到了使用整個東西。快速搜尋發現類似的展示:https ://unix.stackexchange.com/questions/17572/what-is-the-interaction-of-the-rsync-size-only-and-sparse-options稀疏的結論
所以我的想法給出了這一切:
- 使用 LVM 的快照
- 對快照執行zerofree
- 用於
rsync -S
複製產生的稀疏文件- 如果您不能使用 rsync,如果您正在通過網路傳輸,請 gzip 快照,然後
cp --sparse=always
針對未擴展的圖像執行以創建稀疏副本。差異備份
塊設備上差異備份的問題是,事情可能會稍微移動並產生大而笨拙的差異。關於 StackOverflow 的一些討論:https ://stackoverflow.com/questions/4731035/binary-diff-and-patch-utility-for-a-virtual-machine-image 得出的結論是最好的使用是 xdelta。如果您要這樣做,請再次嘗試先將您的空白空間歸零。