用於增量備份的 Linux 備份實用程序
我正在尋找具有增量備份的備份實用程序,但方式更複雜。
我嘗試了 rsync,但它似乎無法做我想做的事,或者更可能的是,我不知道如何讓它做到這一點。
所以這是我想用它實現的一個例子。我有以下文件:
testdir ├── picture1 ├── randomfile1 ├── randomfile2 └── textfile1
我想執行備份實用程序並基本上在不同的目錄中創建所有這些文件的存檔(或壓縮包):
$ mystery-command testdir/ testbak testbak └── 2020-02-16--05-10-45--testdir.tar
現在,假設第二天,我添加了一個文件,我的結構如下所示:
testdir ├── picture1 ├── randomfile1 ├── randomfile2 ├── randomfile3 └── textfile1
現在,當我執行神秘命令時,我將獲得當天的另一個 tarball:
$ mystery-command testdir/ testbak testbak ├── 2020-02-16--05-10-45--testdir.tar └── 2020-02-17--03-24-16--testdir.tar
這是踢球者:我希望備份實用程序檢測自上次備份以來沒有更改的事實,並且僅備份新/更改的文件,在這種情況下是
picture1
,例如:randomfile1``randomfile2``textfile1``randomfile3
tester@raspberrypi:~ $ tar -tf testbak/2020-02-16--05-10-45--testdir.tar testdir/ testdir/randomfile1 testdir/textfile1 testdir/randomfile2 testdir/picture1 tester@raspberrypi:~ $ tar -tf testbak/2020-02-17--03-24-16--testdir.tar testdir/randomfile3
因此,作為最後一個範例,假設第二天我更改了
textfile1
,並添加了picture2
andpicture3
:$ mystery-command testdir/ testbak testbak/ ├── 2020-02-16--05-10-45--testdir.tar ├── 2020-02-17--03-24-16--testdir.tar └── 2020-02-18--01-54-41--testdir.tar tester@raspberrypi:~ $ tar -tf testbak/2020-02-16--05-10-45--testdir.tar testdir/ testdir/randomfile1 testdir/textfile1 testdir/randomfile2 testdir/picture1 tester@raspberrypi:~ $ tar -tf testbak/2020-02-17--03-24-16--testdir.tar testdir/randomfile3 tester@raspberrypi:~ $ tar -tf testbak/2020-02-18--01-54-41--testdir.tar testdir/textfile1 testdir/picture2 testdir/picture3
使用這個系統,我將通過僅備份每個備份之間的增量更改來節省空間(顯然主備份包含所有初始文件),並且我將備份增量更改,例如,如果我進行了更改在第 2 天,並在第 3 天再次更改相同的內容,我仍然可以獲取第 2 天更改的文件,但在第 3 天更改之前。
我認為這有點像 GitHub 的工作方式 :)
我知道我可能會創建一個執行差異的腳本,然後根據結果選擇要備份的文件(或者更有效地,只需獲取校驗和並進行比較),但我想知道是否有任何實用程序可以做到這一點容易一點:)
我嘗試了 rsync,但它似乎無法做我想做的事,或者更可能的是,我不知道如何讓它做到這一點。
我知道我可能會創建一個執行差異的腳本,然後根據結果選擇要備份的文件(或者更有效地,只需獲取校驗和並進行比較),但我想知道是否有任何實用程序可以做到這一點容易一點:)
rsync
正是基於差異複製的程序。預設情況下,它僅在上次修改時間或大小存在差異時複製,但它甚至可以通過校驗和與-c
.這裡的問題是你正在
tar
備份。如果你不這樣做,這會變得更容易。我什至不知道你為什麼這樣做。如果你壓縮它們可能是有意義的,但你甚至沒有這樣做。增量備份的Wikipedia 文章有一個範例
rsync
命令,大致如下:rsync -va \ --link-dest="$dst/2020-02-16--05-10-45--testdir/" \ "$src/testdir/" \ "$dst/2020-02-17--03-24-16--testdir/"
它的作用是在源文件未更改的情況下從先前備份中硬連結文件。
--copy-dest
如果您希望它改為複制,也有($dst
在遠端或更快的驅動器上它仍然更快)。如果您使用帶有 btrfs 之類的子卷的文件系統,您也可以在 rsync 之前從以前的備份中獲取快照。快照是即時的,不佔用額外空間
$$ 1 $$.
btrfs subvolume snapshot \ "$dst/2020-02-16--05-10-45--testdir" \ "$dst/2020-02-17--03-24-16--testdir"
或者,如果您使用的是支持 reflinks 的文件系統,那麼您也可以這樣做。Reflinks 是通過創建一個新的 inode 但引用與源文件相同的塊來完成的,實現 COW 支持。它仍然比普通副本快,因為它不讀寫數據,也不佔用額外空間
$$ 1 $$.
cp --reflink -av \ "$dst/2020-02-16--05-10-45--testdir" \ "$dst/2020-02-17--03-24-16--testdir"
無論如何,一旦做了類似的事情,你就可以做一個正常
rsync
來複製差異:rsync -va \ "$src/testdir/" \ "$dst/2020-02-17--03-24-16--testdir/"
不過,您可能想要添加
--delete
,這將導致 rsync 從目標中刪除源中不再存在的文件。另一個有用的選項是
-i
or--itemize-changes
。它產生簡潔的、機器可讀的輸出,描述了 rsync 所做的更改。我通常添加該選項和管道,如:rsync -Pai --delete \ "$src/testdir/" \ "$dst/2020-02-17--03-24-16--testdir/" \ |& tee -a "$dst/2020-02-17--03-24-16--testdir.log"
通過易於使用的
grep
文件記錄更改。這|&
是通過管道傳輸標準輸出和標準錯誤。是和的
-P
縮寫。保留部分傳輸的文件,但更重要的是報告每個文件的進度。--partial``--progress``--partial``--progress
這與使用 tar 歸檔更改相比如何
上述解決方案導致目錄似乎包含所有內容。即使是這種情況,對於任何數量/頻率的備份而言,它們所佔用的空間量與僅具有更改的普通 tar 存檔所佔用的空間量大致相同。這是因為硬連結、引用連結和快照的工作方式。創建備份時頻寬的使用也是相同的。
優點是:
- 使用 rsync 可以輕鬆恢復備份並且速度更快,因為 rsync 只會傳輸備份的差異。
- 如果需要,它們更易於瀏覽和修改。
- 文件刪除可以自然地編碼為文件在新備份中的缺失。使用 tar 存檔時,必須求助於 hack,例如刪除文件
foo
、標記文件foo.DELETED
或做一些複雜的事情。例如,我從未使用過重複性,但查看它的文件,它似乎通過在新的 tar 中添加一個同名的空文件並將文件的原始簽名保存在單獨的 .sigtar 文件中來對刪除進行編碼。我想它將原始簽名與空文件的簽名進行比較,以區分文件刪除和對實際空文件的更改。如果仍然希望將每個備份設置為僅保存不同的文件(添加或修改),則可以使用上述
--link-dest
解決方案,然後使用以下內容刪除硬連結:find $new_backup -type f ! -links 1 -delete
$$ 1 $$嚴格來說,它們確實以重複元數據的形式使用了額外的空間,例如文件名等。但是,我想任何人都會認為這微不足道。
雖然
tar
確實有增量模式,但有幾個更全面的工具可以完成這項工作:它們不僅支持增量備份,而且很容易配置需要進行完整備份的計劃。例如在
duplicity
:duplicity --full-if-older-than 1M
將確保完整備份已執行。它們還支持及時返回到特定文件,使用純 tar 您必須遍歷所有增量文件,直到找到包含正確文件的文件。此外,它們確實支持加密和上傳到各種後端(如 sftp、blob 儲存等)。顯然,如果您加密,請不要忘記將您的密鑰備份到輔助備份!
另一個重要方面是您可以驗證備份的完整性,確保您可以恢復,例如使用
duplicity verify
.我會對基於 git 的備份策略提出負面建議。大型恢復需要大量時間。