David's Blog

[Ubuntu] 用rsync+ssh+crontab做主機自動同步備份

| 2 留言

假設我們有兩台機器,一台是Server主機,就叫她Server,一台是儲存Server資料備份下來的機器,我們就叫她Client吧,隨便取啦~~ 現在我們要做的就是利用rsync將Server上的資料同步備份到Client機器上

1. 安裝rsync

先檢查是否裝了rsync,client和server都要裝
$ dpkg -l | grep rsync
ii rsync 3.0.7-1ubuntu1.1 fast remote file copy program (like rcp)

沒有的話,就給它安裝起來
$ sudo apt-get install rsync

2. 製作不需詢問密碼就可以登入的ssh用戶

接下來我們要讓client透過ssh登入server時不再詢問密碼,這樣當我們用rsync透過ssh將資料同步備份到client時,就能全自動進行,不會卡在詢問密碼那裡

首先在client端製作公鑰和私鑰
$ ssh-keygen -t rsa
這中間會問你鑰匙要放在哪個目錄,還有passphrase,按三次Enter採用預設值
Generating public/private rsa key pair.
Enter file in which to save the key (/home/davidpai/.ssh/id_rsa):
Created directory '/home/davidpai/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/davidpai/.ssh/id_rsa.
Your public key has been saved in /home/davidpai/.ssh/id_rsa.pub.

最後鑰匙會產生在家目錄的.ssh目錄下,id_rsa.pub是公鑰,id_rsa就是私鑰,把公鑰傳到server上,然後到server上,將公鑰加入authorized_keys
authorised_keys放在家目錄的.ssh目錄下,如果還沒有這個目錄,手動把它建立起來
$ mkdir .ssh
第一次還沒有authorized_keys,直接用cat把id_rsa.pub的內容加進去
$ cat id_rsa.pub >> authorized_keys
以後要加其他的公鑰,也是用cat附加到該檔案後面就可以

回到client端,試試看是否不需要詢問密碼就能登入
$ ssh xxx@xxx.xxx.xxx

3. rsync同步備份

再來我們就可以用rsync來同步備份server端的資料

在client端輸入以下指令
$ rsync -av --delete -e ssh xxx@xxx.xxx.xxx:/var/www /home/backup
這樣就是把遠端server主機上的/var/www目錄全部資料同步備份到client端的/home/backup目錄裡,之後server端有任何異動,只會同步備份異動的部份,這就是所謂的差異備份。

那個-e參數後面要空一個寫ssh,表示傳輸過程我們要使用ssh通道加密。

那個–delete參數的意思是說,server端檔案如果刪除,client端也會刪除,如果不加這個參數,client端檔案就會留著不刪除,這個參數加不加可以自己斟酌。

4. 設定cron讓備份自動執行

最後我們想要讓server端的資料可以定時自動同步備份到client端,這就輪到crontab上場了
在client端把上述指令寫到crontab裡
$ crontab -e
2 4 * * * rsync -av --delete -e ssh xxx@xxx.xxx.xxx:/var/www /home/backup

這樣就是在每天凌晨04:02自動同步備份遠端server的/var/www目錄到/home/backup

參考來源
[ubuntu]rsync 同步備份
以 rsync 進行同步鏡像備份
製作不用密碼可立即登入的 ssh 用戶

2 則留言

  1. 感謝格主分享教學,我按照指示做到第三步驟都可以成功,但是把指令放進
    crontab去就不動了@@

    我猜可能跟帳號權限有關? 講一下我的情況

    我登入client 都是用X帳號,在server也有一個X帳號(兩個同名權限應該也是一樣)

    然後我在rsync 這邊就是寫 X@123.455.789.101(server ip)

    在client 端要拿來放備份的檔案夾owner也是X

    當我用X帳號登入client 直接執行那個rsync 時,東西可以正常的被備份過來

    但是放進crontab之後就不動了@@

    我通常都是用 sudo vi crontab去改內容,不曉得這樣有沒有差

    還麻煩你指導了.. 感恩

  2. 可否請教
    在這個步驟:回到client端,試試看是否不需要詢問密碼就能登入
    ssh xxx@xxx.xxx.xxx
    為什麼我還是需要輸入密碼呢?
    謝謝

發佈留言

Required fields are marked *.