使用 rsync 來備份 Linux 系統

1 贊 回覆發表於2017-02-24
作者: David Both 譯者: LCTT trnhoe

| 2017-02-24 16:26   評論: 3 收藏: 7    

探索 rsync 在備份方案中的作用。

在系統管理員的工作中備份無疑是一個重要的部分。當沒有完整備份或者良好規劃的備份和實施時,就可能或早或晚不可挽回地丟失重要的資料。

所有公司,無論大小,都運營在資料之上。考慮到丟失業務資料造成的經濟和業務損失,從最小的個人公司到最大的跨國企業,沒有一個公司能在丟失大部分資料以後得以倖存。你的辦公室可以透過保險賠償重建,但是你的資料就不可能再恢復了。

這裡提到的丟失是指資料的完全損壞。而不是指資料被偷走,那是另一種災難。我這裡說的是資料被完全摧毀。

即使你只是個人使用者而不是一個企業,備份你自己的資料也是非常重要的,我有二十年來的個人財務資料和我現在已經關閉的企業的資料,以及大量的電子發票。也包括近年來我創作的大量不同型別的文件、報告和資料包表。我不想失去任何這些資料。

所以備份是我資料長期安全的必要保障。

備份軟體選擇

有許多軟體可以執行備份。大多數 Linux 發行版提供至少一種開源的備份軟體。同時也有許多商業備份軟體,但是這些都不符合我的需求,所以我決定使用基礎的 Linux 工具來進行備份。

在我為 Open Source Yearbook 寫的文章, 最佳搭檔之 2015:tar 和 ssh 中,我說明了昂貴的商業備份軟體在設計實施可行的備份計劃中並不是必要的。

從去年開始我嘗試了另一種選擇, rsync 命令,它有許多我已經從中受益的有趣特性。我的主要需求是所建立的備份,使用者不需要解壓備份壓縮包就能定位和恢復檔案,以便節約建立備份的時間。

這篇文章的目的只是為了說明 rsync 在我的備份方案中的作用。並不是 rsync 的全部能力或者它的各種適用場景的概覽。

rsync 命令

Andrew Tridgell 和 Paul Mackerras 編寫了 rsync ,首次釋出於 1996 年。它的目標是向另一臺電腦同步檔案。你注意到了他們為什麼取這個名字了嗎(remotely synchronize)?它是大多數發行版都提供的開源軟體。

rsync 能夠用於同步兩個目錄或目錄樹,無論它們是在同一個計算機上還是不同的計算機上,而且不僅如此,它還能做到更多。它建立或者更新的目錄與源目錄完全一樣。新的目錄不是以 tar 或 zip 等打包儲存,而是普通的目錄和檔案,常見的 Linux 工具都能輕鬆訪問,而這正是我所需要的。

rsync 的最重要的特性之一是它處理源目錄被修改的已有檔案的方式。它使用分塊校驗來比較原始檔和目標檔案,而不是從源把整個檔案複製過去。如果兩個檔案所有塊的校驗和都相同,那麼就不用傳輸資料。否則只有被改變的塊被傳輸。這樣節約了遠端同步消耗的大量時間和頻寬。比如,我第一次使用 rsync 指令碼來把我所有的主機備份到一個外接的大型 usb 硬碟上需要三個小時,因為所有的資料都需要傳輸過去。而接下來的備份需要的時間就只是 3 到 8 分鐘,這取決於上次備份以來建立和改變了多少檔案。我使用 time 命令來記錄實際花費的時間。昨天晚上,我只花了三分鐘來從六個遠端系統和本地工作站備份大概 750 Gb 資料。實際上只有在白天改變的幾百 Mb 資料需要備份。

下面的命令可以用來同步兩個目錄及其任意子目錄的內容。也就是說,在新目錄的內容和源目錄同步完之後,它們的內容完全一樣。

rsync -aH sourcedir targetdir

-a 選項表示歸檔模式,它會保持許可權、所有關係和符號(軟)連結。-H 選項用來保持硬連結。注意源目錄和目標目錄都可以在遠端主機上。

假設昨天我們使用 rsync 同步了兩個目錄。今天我們想再同步一次,但是我們從源目錄刪除了一些檔案。rsync 預設只複製新的和改變過的檔案到新目錄裡,而不去改變新目錄裡被我們刪除的檔案,但是如果你想讓那些在源目錄裡被刪除的檔案在新目錄裡也被刪除,那麼你可以加上 --delete 選項來刪除。

另一個有趣的選項,也是我個人最喜歡的選項是 --link-dest,因為它極大地增加了 rsync 的能力和靈活性。--link-dest 使每日備份只花費很少的額外空間和很短的時間。

用這個選項指定前一天的備份目錄,以及今天的備份目錄,然後 rsync 會建立今天的新備份目錄,並將昨天備份目錄裡的每一個檔案在今天的備份目錄中建立硬連結。現在我們在今天的備份目錄中有一大堆指向昨天備份的硬連結。檔案沒有被重複建立,而是建立了一些硬連結。對於硬連結,在 Wikipedia 中有非常詳細的描述。而在用昨天的備份目錄檔案的硬連結建立了今天的備份之後,rsync 和平常一樣進行備份,如果在檔案中檢測到了變化,就不會做硬連結,而是從昨天的備份目錄裡複製一個檔案的副本,再把原始檔中變化的部分複製過去。(LCTT 譯註:此處疑似原文表述不清,參見 generator.ctry_dests_reg 函式,先根據 match_level 選擇複製或者硬連結,而不是建立硬連結後再判斷 match_level

現在我們的命令類似於下面這樣。

rsync -aH --delete --link-dest=yesterdaystargetdir sourcedir todaystargetdir

你也可能想要排除一些不想要備份的目錄或者檔案。那麼就可以使用 --exclude 選項。用這個選項加上你想排除檔案或目錄的模式。你可以用下面的新命令來排除瀏覽器的快取。

rsync -aH --delete --exclude Cache --link-dest=yesterdaystargetdir sourcedir todaystargetdir

注意:你想排除的每一個檔案的模式前面都分別需要加上 --exclude 選項。

rsync 可以同步遠端主機,無論是作為同步源頭還是目標。再舉一個例子,我們假設想要把名為 remote1 的遠端主機的目錄同步到本地。因為 ssh 作為與遠端主機交換資料的預設協議,我一直使用 ssh 選項。現在命令類似於下面這樣。

rsync -aH -e ssh --delete --exclude Cache --link-dest=yesterdaystargetdir remote1:sourcedir todaystargetdir

這就是我的 rsync 備份命令的最終版本。

你可以依靠 rsync 的大量選項來定製你的同步過程。大多數情況而言,我剛剛描述的簡單命令就足以勝任我的個人需要。你可以閱讀 rsync 豐富的文件來了解它的其他能力。

部署備份

我的備份自動執行因為—“萬物皆可自動化”。我寫了一個 BASH 指令碼使用 rsync 建立每天的備份。包括確保備份介質被掛載,生成每天的備份目錄的名字,以及在備份介質中建立合適的目錄結構,最後執行真正的備份再解除安裝備份介質。

我用 cron 每天早晨執行指令碼確保我永遠不會忘記備份。

我的指令碼 rsbu 和配置檔案 rsbu.conf 可以在 GitHub 上獲取。

恢復測試

所有沒有經過測試的備份計劃都不完整的。你可以透過測試恢復某個檔案或者整個目錄,以確保備份在照常工作並且可以透過它來在資料全部丟失後恢復。我見過太多備份由於種種理由失敗,以及由於缺乏測試忽略的問題導致寶貴的資料被丟失。

選擇一個檔案恢復到比如 /tmp 的測試目錄,這樣你就不會覆蓋任何備份後被更新的檔案。驗證檔案的內容是否是你預期的。恢復用 rsync 備份的檔案僅僅只是找到你的備份檔案然後把它複製到你想恢復的地方去那樣簡單。

我有幾次不得不恢復我的個人檔案,偶爾是整個目錄。大多數是自己意外刪除了檔案或者目錄。有幾次是因為硬碟崩潰。這些備份遲早會派上用場。

最後一步

但僅僅建立備份並不能拯救你的業務,你需要定期的地建立備份,使最近的一次備份儲存在另一臺遠端機器上,如果有可能,放在另外一個建築物中或幾英里之外。這樣可以確保大規模的災難不會摧毀你的所有備份。

對於小型企業的一個合理選擇是在可移動介質上做每日備份,晚上把最新的備份帶回家裡,第二天早上把更早的備份帶到辦公室。你就會有幾個輪流的複製。甚至可以把最新的備份帶到銀行並放到你的保管箱裡,然後帶回之前的備份。


作者簡介:

David Both - 他居住在北卡羅來納州的羅列,是 Linux 和開源提倡者。他已經從事 IT 行業 40 多年。在 IBM 教授了二十多年 OS/2。在 IBM 的時候,他在 1981 年為最初的 IBM 個人電腦編寫了第一門培訓課程。他為紅帽教授 RHCE 課程,並曾在世通公司、思科、北卡羅來納州政府工作。他使用 Linux 和開源軟體已經有二十年左右了。


via: https://opensource.com/article/17/1/rsync-backup-linux

作者:David Both 譯者:trnhoe 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

使用 rsync 來備份 Linux 系統

相關文章