這裡小弟將簡單紀錄,最基礎的異地同步備份方法:
—如何使用 rsync + ssh + crontab 製作 mirror Files。
因為示範的關係,所以採用一般 User 來進行,
實際狀況下,如果採用 root 進行 ssh 遠端同步時,
必須修改:/etc/ssh/sshd_config。
並設定:
PermitRootLogin no
PermitRootLogin forced-commands-only
另外也必須注意,備份檔案的相關權限問題。
########################################
rsync + ssh 基本同步化
########################################
$ sudo apt-get install rsync ssh
$ man rsync
-a, --archive (archive mode)
-v, --verbose (increase verbosity)
-z, --compress (compress file data)
-e, --rsh=COMMAND (specify rsh replacement)
--rsync-path=PATH (specify path to rsync on the remote machine)
透過 ssh 將 yenjinc.info 的 ~/backup,備份至本地端 /backup。
$ rsync -avz -e ssh yenjinc@yenjinc.info:~/backup/ /backup/
yenjinc@yenjinc.info's password: ←(輸入密碼)
如果需要 mirror 遠端與本地端的資料,請加上 --delete 選項。
$ rsync -avz -e ssh --delete yenjinc@yenjinc.info:~/backup/ /backup/
yenjinc@yenjinc.info's password: ←(輸入密碼)
以上僅適合一般同步作業,因為 ssh 必須提示輸入密碼才能進行同步化,
如果放在 Crontab 的話,會因為沒有辦法 key in password 而整個 hang 在那。
########################################
產生 ssh 公開金鑰與私密金鑰
########################################
rsync 會利用 ssh 登入到遠端主機,需要帳號與密碼。
若要在 crontab 中不需要輸入密碼就登入,必須製作 public / private keys。
$ ssh-keygen -t dsa -b 1024 -f yenjinc.info-key ←(file name 可自訂)
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): ←(不需輸入,直接按 Enter)
Enter same passphrase again: ←(不需輸入,直接按 Enter)
Your identification has been saved in yenjinc.info-key.
Your public key has been saved in yenjinc.info-key.pub.
The key fingerprint is:
41:29:60:49:40:c3:a0:8f:2f:74:4e:40:64:a5:42:db Denny@PowerBook-G4.local
(公開金鑰與私密金鑰製作完成)
這時候目錄下會產生兩個檔案:
yenjinc.info-key
yenjinc.info-key.pub ←(必須放置到遠端的主機裡)
必須將 yenjinc.info-key.pub 放到遠端 ~/.ssh/authorized_keys 裡。
$ scp yenjinc.info-key.pub yenjinc@yenjinc.info:~/.ssh/
yenjinc@yenjinc.info's password: ←(輸入密碼)
yenjinc.info-key.pub 100% 614 0.6KB/s 00:00
登入到遠端的主機,把 pub key 加入 authorized_keys 中。
$ ssh yenjinc@yenjinc.info
yenjinc@yenjinc.info's password: ←(輸入密碼)
yenjinc@~$ cd .ssh/
yenjinc@~/.ssh$ cat yenjinc.info-key.pub >> authorized_keys
yenjinc@~/.ssh$ chmod 600 authorized_keys
完成之後,離開遠端主機,並且測試一下,是否已經可以不需密碼即 ssh login。
$ ssh -i yenjinc.info-key yenjinc@yenjinc.info ←(使用 -i 指定剛才的私密金鑰)
yenjinc@~$ ←(順利完成!不需密碼即可登入。)
########################################
rsync + ssh + No Password 基本同步化。
########################################
接著下來,即可利用 Rsync 透過 SSH 來同步本地與遠端的資料,而不需輸入密碼。
不用密碼的好處是,可以把 rsync 同步備份指令,寫在 Crontab 下自動執行。
透過 ssh 將 yenjinc.info 的 ~/backup,備份至本地端 /backup。
$ rsync -avz -e "ssh -i yenjinc.info-key" yenjinc@yenjinc.info:~/backup/ /backup/
←(順利完成!不需密碼,即可將遠端資料備份過來。)
如果需要 mirror 遠端與本地端的資料,請加上 --delete 選項。
$ rsync -avz -e "ssh -i yenjinc.info-key" --delete yenjinc@yenjinc.info:~/backup/ /backup/
←(順利完成!不需密碼,即可將將遠端的資料製作一份 mirror 到本地端。)
########################################
rsync + ssh + No Password + Crontab 基本同步化。
########################################
基本上,如果上面那一個步驟已經順利成功的話,在加上 Crontab 就不會出錯了。
只要將剛才那串指令,加到 crontab 指令中就行啦!
以下的 Script 是在我的 OSX + Fink 的環境,若是 Linux 則需要另做修改。
#!/bin/bash
RSYNC=/sw/bin/rsync
SSH=/usr/bin/ssh
KEY=/Users/Denny/yenjinc.info-key
USER=yenjinc
HOST=yenjinc.info
REMOTE_DIR=/home/yenjinc/backup/
LOCAL_DIR=/Users/Denny/backup/
# rsync+ssh+crontab command
$RSYNC -avz -e "$SSH -i $KEY" --delete $USER@$HOST:$REMOTE_DIR $LOCAL_DIR
將以上 script 內容,儲存為 /Users/Denny/crontab-file。
完成後,即可設定 Crontab。
$ crontab -e
*/2 * * * * /Users/Denny/crontab-file
大功告成,每兩分鐘就執行異地同步備份一次。
########################################
後記 (備註):
########################################
以上所有內容,僅是基本的 rsync+ssh+crontab 示範與練習。
如果是 Server 的環境,詳細的內容就更為繁複啦!
若想延伸閱讀,可參考以下。
—製作不用密碼可立即登入的 ssh 用戶
—以 rsync 進行同步鏡相備份
—使用 rsync (全自動網路備份法)
—[分享] rsync遠端備份
—Using Rsync and SSH Keys, Validating, and Automation
在 Google 敲入:rsync ssh crontab 等相關 keyword 可以找到更多哦!