備份一直是 Linux 世界的熱門話題。回到 2017,David Both 爲 Opensource.com 的讀者在使用 rsync 備份 Linux 系統方面提了一些建議,在這年的更早時候,他發起了一項問卷調查詢問你們,在 Linux 中你的 /home 目錄的主要備份策略是什麼,在今年的另外一個問卷調查中,Don Watkins 問到,你使用哪一種開源備份解決方案。linux
個人回覆是 rsync。我真的很是喜歡 rsync!市場上有大量大而複雜的工具,對於管理磁帶機或者存儲庫設備,這些多是必要的,可是可能你須要的只是一個簡單的開源命令行工具。網絡
我爲一個大概擁有 35,000 開發者並有着幾十 TB 文件的全球性機構管理二進制倉庫。我常常一次移動或者歸檔上百 GB 的數據。使用的是 rsync。這種經歷使我對這個簡單的工具充滿信心。(因此,是的,我在家使用它來備份個人 Linux 系統)工具
基礎的 rsync 命令很簡單。性能
rsync -av 源目錄 目的地目錄
實際上,在各類指南中教的 rsync 命令在大多數通用狀況下都運行的很好。然而,假設咱們須要備份大量的數據。例如包含 2,000 個子目錄的目錄,每一個包含 50GB 到 700GB 的數據。在這個目錄運行 rsync 可能須要大量時間,尤爲是當你使用校驗選項時(我傾向使用)。遞歸
當咱們試圖同步大量數據或者經過慢的網絡鏈接時,可能遇到性能問題。讓我給你展現一些我使用的方法來確保好的性能和可靠性。開發
rsync 運行時出現的第一行是:「正在發送增量文件列表。」 若是你在網上搜索這一行,你將看到不少相似的問題:爲何它一直運行,或者爲何它彷佛掛起了。get
這裏是一個基於這個場景的例子。假設咱們有一個 /storage 的目錄,咱們想要備份到一個外部 USB 磁盤,咱們可使用下面的命令:同步
rsync -cav /storage /media/WDPassport
-c 選項告訴 rsync 使用文件校驗和而不是時間戳來決定改變的文件,這一般消耗的時間更久。爲了分解 /storage 目錄,我經過子目錄同步,使用 find 命令。這是一個例子:it
find /storage -type d -exec rsync -cav {} /media/WDPassport \;
這看起來能夠,可是若是 /storage 目錄有任何文件,它們將被跳過。所以,咱們如何同步 /storage 目錄中的文件呢?一樣有一個細微的差異是這些選項將形成 rsync 會同步 . 目錄,該目錄是源目錄自身;這意味着它會同步子目錄兩次,這並非咱們想要的。基礎
長話短說,個人解決方案是一個 「雙-遞增」腳本。這容許我分解一個目錄,例如,當你的家目錄有多個大的目錄,例如音樂或者家庭照片時,分解 /home 目錄爲單個的用戶家目錄。
這是個人腳本的一個例子:
HOMES="alan" DRIVE="/media/WDPassport" for HOME in $HOMES; do cd /home/$HOME rsync -cdlptgov --delete . /$DRIVE/$HOME find . -maxdepth 1 -type d -not -name "." -exec rsync -crlptgov --delete {} /$DRIVE/$HOME \; done
第一個 rsync 命令拷貝它在源目錄中發現的文件和目錄。然而,它將目錄留着不處理,所以咱們可以經過 find 命令迭代它們。這經過傳遞 -d 參數來完成,它告訴 rsync 不要遞歸目錄。
-d, --dirs 傳輸目錄而不遞歸
而後 find 命令傳遞每一個目錄來單獨運行 rsync。以後 rsync 拷貝目錄的內容。這經過傳遞 -r 參數來完成,它告訴 rsync 要遞歸目錄。
-r, --recursive 遞歸進入目錄
這使得 rsync 使用的增量文件保持在一個合理的大小。
大多數 rsync 指南爲了簡便使用 -a (或者 archive) 參數。這實際是一個複合參數。
-a, --archive 歸檔模式;等價於 -rlptgoD(沒有 -H,-A,-X)
我傳遞的其餘參數包含在 a 中;這些是 -l、-p、-t、-g和 -o。
-l, --links 複製符號連接做爲符號連接 -p, --perms 保留權限 -t, --times 保留修改時間 -g, --group 保留組 -o, --owner 保留擁有者(只適用於超級管理員)
--delete 選項告訴 rsync 刪除目的地目錄中全部在源目錄不存在的任意文件。這種方式,運行的結果僅僅是複製。你一樣能夠排除 .Trash 目錄或者 MacOS 建立的 .DS_Store 文件。
-not -name ".Trash*" -not -name ".DS_Store"
最後一條建議: rsync 能夠是破壞性的命令。幸運的是,它的睿智的創造者提供了 「空運行」 的能力。若是咱們加入 n 選項,rsync 會顯示預期的輸出但不寫任何數據。
`rsync -cdlptgovn --delete . /$DRIVE/$HOME`
這個腳本適用於很是大的存儲規模和高延遲或者慢連接的狀況。一如既往,我確信仍有提高的空間。若是你有任何建議,請在下方評論中分享。