用 rsnapshot 備份
這份指引會協助你在你的網絡上建立一台 rsnapshot 備份伺服器。它會簡短地解釋如何設置 rsync 以 SSH 金鑰來進行不須密碼的 SSH 登入。我利用 Synbak 這個工具程式自動將家用筆記型電腦備份至我的桌上電腦已經有一段時間。在這之先,一個簡單的 rsync 腳本擔當了這個重任。雖然 Synbak 是個簡化在家中備份的得力助手,它卻不及 rsnapshot 般有彈性。(Synbak 的強項在於它的簡易安裝及操作。)這份指南假設你會按照本作者的文檔、把 RPM 套件安裝在 CentOS/Fedora 上。
1. 系統:
CentOS 4.x/5.x 及 Fedora 7(應該適用於任何 RHEL/Fedora 操作系統)
2. 參考:
rsnapshot 網站
rsnapshot 文檔
CentOS 上安裝
3. 系統設置
在 Fedora 與在 CentOS 上運用 yum 及 RPM 來安裝 rsnapshot 的步驟並不相同,但差異很微。
3.1. 1)CentOS 4.x/5.x
在 CentOS 4.x/5.x 上安裝時,你必須安裝及啟用 RPMForge 的第三方軟件庫。我亦建議設置 yum-priorities。幸好 CentOS 的 wiki 內已經收錄了這篇簡單易用的 RPMForge 指南。當你將一切設置妥當後,請由指令行安裝 rsnapshot。
# yum install rsnapshot
這樣做會引入一些你仍未安裝的 Perl 依賴套件。有些套件將會來自 base,其餘的會來自 rpmforge 的軟件庫。
3.2. 2)Fedora
我在 Fedora 7 桌面電腦上安裝時並不需要任何特別的軟件庫設定。它只須透過指令行進行安裝。
# yum install rsnapshot
4. 預備設定環境
安裝後,一個範例設定檔將會被放在 /etc/rsnapshot.conf,但你多數不止把一台主機備份,因此我們不會採用它。取而代之,請建立一個目錄來放置你的主機設定檔。請按你的喜好來更改路徑名稱。
# mkdir /etc/rsnapshot
你也需要一個地方來安置備份,所以請建立一個地方來儲存那些檔案。
# mkdir /srv/backups/snapshots
最後,你將會需要一個地方來放置 rsnapshot 所建立、稍後要設置的日誌。請建立一個目錄。
# mkdir /var/log/rsnapshot
5. 設置不須密碼的 SSH 登入
5.1. 1)rsnapshot 伺服器端
在 rsnapshot 伺服器上,你須要建立一對 SSH 金鑰。你可以利用 ssh-keygen 來達至這個目的。
# ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. The key fingerprint is: snip
5.2. 2)在主機上安裝金鑰
如果你已經有 SSH 存取權,當你在 rsnapshot 伺服器上建立了金鑰後,你可以輕易地將公鑰加進遠端的適當檔案內。切勿加入那條非公開的金鑰。請從 rsnapshot 伺服器執行以下的指令到你要備份的遠端系統。
# cat ~/.ssh/id_dsa.pub | ssh root@remote_host "cat >> ~/.ssh/authorized_keys2"
也許此刻你會想在遠端系統停用 SSH 的密碼登入,但這是你的決定。假若你想這樣做,編輯 /etc/ssh/sshd_config。請確定 PasswordAuthentication 及 PermitEmptyPasswords 都是 no。另外,縱使我不是位安全性專家,但你應該把你的 .ssh 目錄及檔案的存取權好下面般更改。假若我所列出的存取權有錯誤,請矯正我。
# chmod 700 .ssh; chmod 400 .ssh/authorized_keys2
6. 設定 rsnapshot 主機
既然你已經初步有一個地方放置設定檔、一個地方放置備份、及能夠不須密碼存取遠端系統,現在你可以建立主機設安檔。我會利用家中的筆記型電腦備份作為範例。
6.1. 1)主機的 .conf 檔
請為你要備份的主機建立一個檔案來收藏 rsnapshot 專用的設定。請按你的情況取代主機名稱及檔案名稱。
# vim /etc/rsnapshot/laptop.rsnapshot.conf
需要解釋的選項為數不少,但下面是我的設定檔。請輸入以下選項,接下來便是它們的解釋。
config_version 1.2 snapshot_root /srv/backups/snapshots/laptop/ cmd_cp /bin/cp cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger cmd_du /usr/bin/du interval daily 7 interval weekly 4 interval monthly 3 verbose 2 loglevel 4 logfile /var/log/rsnapshot/laptop.log exclude_file /etc/rsnapshot/laptop.exclude rsync_long_args --delete --numeric-ids --delete-excluded lockfile /var/run/rsnapshot.pid backup root@laptop:/ laptop/ backup_script /etc/rsnapshot/laptop.dump_databases.sh laptop_databases/
註:請留意選項數值之間的空位。它們不是空格,而是 tab。此外,目錄必須有後置的斜線。這一切都在 /etc/rsnapshot.conf 範例檔的頂部有所解釋。
你可以在範例設定檔內查閱所有選項。下面是各個參數值的解釋:
config_version 1.2 = 設定檔版本
snapshot_root = 儲存備份的目標位置
cmd_cp = 「複製」指命的路徑
cmd_rm = 「刪除」指命的路徑
cmd_rsync = rsync 指命的路徑
cmd_ssh = SSH 的路徑
cmd_logger = 與 syslog 溝通的指命的路徑
cmd_du = 「查詢磁碟用量」指命的路徑
interval hourly = 須保留的每小時備份數量
interval daily = 須保留的每日備份數量
interval weekly = 須保留的每週備份數量
interval monthly = 須保留的每月備份數量
verbose = 不言自明
loglevel = 不言自明
logfile = 日誌的路徑
ssh_args = 附加的 SSH 選項,例如不同的連接埠(-p)
exclude_file = 排除檔的路徑(將會有更詳盡解釋)
rsync_long_args = 傳給 rsync 的冗長參數
lockfile = 不言自明
backup = 備份來源的完整路徑,接著是擺放位置的相對路徑
backup_script = 執行腳本的完整路徑,接著是擺放位置的相對路徑
現在你已經有一個可用的主機設定範例,讓我們繼續看排除檔。
6.2. 2)主機的 .exclude 檔
我會選擇先排除一切,然後特別指定我需要備份的東西。這樣做的原因是要確保我們只批准所須的東西,及自動拒絕以外的事物。我知道這樣似乎很落後,但它確實可行。
請建立這個檔案:
# vim /etc/rsnapshot/laptop.exclude
由於迴遞的原故,採用排除檔可以是件難對付的事。我不會假裝對 rsync 的迴遞完全理解,因此我的範例也許會不合你心意。它容許你刻意指定所須的東西,然後排除其它一切。基於 rsync 採用迴遞的方式,與及你擺設架構的樣式(即是 * 與 ** 所配對的有差別),你也許要先列舉目錄。
當你列出了所須的東西後,請加入 - * 來排除其它一切。這樣只有你列舉的東西才會獲備份。我的排除檔是這樣的:
+ /boot + /etc + /home + /opt + /root + /usr + /usr/java + /usr/local - /usr/* - /var/cache + /var + /srv - /*
對我來說,有一個好的參考就是閱讀這篇在 kurup.org 內的博客文章。另外,請閱讀 rsync 的使用手冊來增進對於樣式配對及迴遞的理解。假如你是位迴遞的專家,請加插一個解釋的備註或修正我的錯處。
6.3. 3)主機備份腳本
最後要解釋的設定選項是我用來傾印資料庫的執行腳本。這個選項讓你在 rsync 結束後執行腳本來加入檔案在備份中。譬如你可以連線到遠端系統並傾印 MySQL 及/或 PostgreSQL 的資料庫。請建立所需的資料庫傾印腳本。
# vim /etc/rsnapshot/laptop.dump_databases.sh
請加入適當的資料。以下的腳本會傾印我的筆記型電腦上的兩個 MySQL 資料庫及一個 PostgreSQL 資料庫。
#MySQL 資料庫 for db in wordpress testpress do ssh root@laptop "mysqldump --opt $db" > $db.mysqldump done #PostgreSQL 資料庫 for db in docmgr do ssh root@laptop "pg_dump $db" > $db.pgsqldump done
請確定這個腳本是個執行檔。如果你不想將執行檔放在 /etc 內,你也可選擇把這個腳本放到其它位置,例如 /usr/local/bin 或 /usr/local/sbin。
# chmod +x /etc/rsnapshot/laptop.dump_databases.sh
在上述的 laptop.rsnapshot.conf 檔案裡,我以這個方法指定了一個備份腳本,請留意採用 tab:
backup_script /etc/rsnapshot/laptop.dump_databases.sh laptop_databases/
如此資料庫便會裡傾印到 laptop_databases 目錄中的每日、每週、及每月備份裡。這樣便完成了一個基本的主機設定。接下來你可以設置自動化操作。
7. 建立一個 crontab
自動化操作可以透過簡單的 crontab 項目來達成。請開啟 crontab 並加入以下內容:
# crontab -e #MAILTO="" ##Supresses output MAILTO=me ################################################################### #minute (0-59), # #| hour (0-23), # #| | day of the month (1-31), # #| | | month of the year (1-12), # #| | | | day of the week (0-6 with 0=Sunday)# #| | | | | commands # ################################################################### 15 02 * * * /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf daily 15 03 * * Sun /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf weekly 30 03 1 * * /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf monthly
假若你不想收到任何電郵,請將 MAILTO 改為 MAILTO="",又或者乖乖地閱讀 crontab 的使用手冊。以上的設置會在上午 2:15 進行每日備份、在上午 3:15 進行每週備份、及在每月頭一日上午 3:30 進行每月備份。
當一切完成後,你的目錄架構將會如下。由於 rsnapshot 及 rsync 採用硬連結,你將會在每個備份中看見一個完整的檔案系統,但事實並非如此。它會很聰明地應用磁碟的空間。這樣聽起來好像資料並不齊全,然而它們都齊備。
# ll /srv/backups/snapshots/laptop drwxr-xr-x 4 root root 4096 Jan 3 01:47 daily.0 drwxr-xr-x 4 root root 4096 Dec 7 01:46 daily.1 drwxr-xr-x 4 root root 4096 Dec 6 01:48 daily.2 drwxr-xr-x 4 root root 4096 Dec 5 01:46 daily.3 drwxr-xr-x 4 root root 4096 Dec 4 01:46 daily.4 drwxr-xr-x 4 root root 4096 Dec 3 01:46 daily.5 drwxr-xr-x 4 root root 4096 Dec 2 01:46 daily.6 drwxr-xr-x 4 root root 4096 Oct 28 01:46 monthly.0 drwxr-xr-x 4 root root 4096 Sep 30 01:46 monthly.1 drwxr-xr-x 4 root root 4096 Sep 1 01:46 monthly.2 drwxr-xr-x 4 root root 4096 Nov 25 01:46 weekly.0 drwxr-xr-x 4 root root 4096 Nov 18 01:46 weekly.1 drwxr-xr-x 4 root root 4096 Nov 11 01:46 weekly.2 drwxr-xr-x 4 root root 4096 Nov 4 01:46 weekly.3
如果你傾印了資料庫,你將會在上述每個目錄內找到一個 laptop_databases 目錄。例如:
# cd /srv/backups/snapshots/laptop/daily.0/laptop_databases # ll -rw-r--r-- 1 root root 692310 2008-01-04 02:15 wordpress.mysqldump -rw-r--r-- 4 root root 291379 2008-01-02 22:49 testpress.mysqldump -rw-r--r-- 2 root root 842345 2008-01-03 21:12 docmgr.pgsqldump
此外,假若你極度關注資料的安全性,你也可以透過 hourly 這個選項為目錄及資料庫每小時備份。這對我沒有用途,但閱讀過這份指南後,相信你有需要的話,必定能夠找出如何加入 hourly 這個參數。
要加入更多主機,請遵照這份指南重複同樣的步驟,並在新增檔案內改用新的主機名稱。
8. 人手執行 rsnapshot
要以人手方式建立備份,你可以在指令行配合適當的參數直接執行 rsnapshot。
# /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf {hourly,daily,weekly,monthly}
9. rsnapshot 的報告
若果你有與趣收到更多訊息,rsnapshot 有一個輕巧實用、容易設置的報告腳本。它會透過一封簡單的電郵向你匯報備份過程。這個報告很精簡。首先,請複製該腳本到 /usr/local/bin 或某個地方,然後將它設為執行檔。
# cp /usr/share/doc/rsnapshot-1.3.0/utils/rsnapreport.pl /usr/local/bin # chmod +x /usr/local/bin/rsnapreport.pl
接著,在你的主機的 rsnapshot 檔的「rsync 冗長參數」欄加入 --stats。請留意用 tab 而不是空白字元來隔格。
# vim /etc/rsnapshot/laptop.rsnapshot.conf rsync_long_args --stats --delete --numeric-ids --delete-excluded
最後,編輯先前在 crontab 內新增的項目,並將 rsnapshot 所傳回的結果遞給 rsnapreport.pl 這個腳本來處理。
# crontab -e #MAILTO="" ########################################################## #minute (0-59), # #| hour (0-23), # #| | day of the month (1-31), # #| | | month of the year (1-12), # #| | | | day of the week (0-6 with 0=Sunday) # #| | | | | commands # ########################################################## 15 02 * * * /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf daily 2>&1 | \ /usr/local/bin/rsnapreport.pl | mail -s "laptop daily" me@myemail.com 15 03 * * Sun /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf weekly 2>&1 | \ /usr/local/bin/rsnapreport.pl | mail -s "laptop weekly" me@myemail.com 15 04 1 * * /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf monthly 2>&1 | \ /usr/local/bin/rsnapreport.pl | mail -s "laptop monthly" me@myemail.com
切勿忘記 2>&1(標準錯誤檔)這個重新定向,否則它們便會流失在 stderr。這個重新定向的意思是把標準錯誤轉送到標準輸出檔。這樣報告便大功告成了。當 rsnapshot 下次執行時,你便應該在你的電郵地址收到一個報告。它會看似以下的輸出:
SOURCE TOTAL FILES FILES TRANS TOTAL MB MB TRANS LIST GEN TIME FILE XFER TIME ----------------------------------------------------------------------------------------------------- laptop:/ 59076 1353 17279.45 7169.38 20.361 second 0.000 seconds
10. 後語
在家裡,我的桌面電腦採用 2 個以 RAID1 鏡像運作的 200G 硬盤。我利用它來備份我的筆記型電腦及一台 asterisk 系統。假如你聰明的話,你便會同樣地利用一個 RAID1 鏡像或某類型的冗餘磁碟架構作為你的 rsnapshot 伺服器。祝你好運。
Translation of revision 8