一篇文詳解rsync 命令

一篇文詳解rsync 命令


什麼是 Rsync

Rsync(remote synchronize)是一個遠程數據同步工具,可通過 LAN/WAN 快速同步多臺主機間的文件。Rsync 使用所謂的 “Rsync 算法” 來使本地和遠 程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。

Rsync 本來是用於替代 rcp 的一個工具,目前由 rsync.samba.org 維護,所以 rsync.conf 文件的格式類似於 Samba 的 主配置文件。Rsync 可以通過 rsh 或 ssh 使用,也能以 daemon 模式去運行,在以 daemon 方式運行時 Rsync server 會打開一個 873 端口,等待客戶端去連接。連接時,Rsync server 會檢查口令是否相符,若通過口令查核,則可以開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,以後則就只需進行增量備份。

Rsync 支持大多數的類 Unix 系統,無論是 Linux、Solaris 還是 BSD 上都經過了良好的測試。此外,它在 windows 平臺下也有相應的版本,如 cwRsync 和 Sync2NAS 等工具。

Rsync 的基本特點如下:

  1. 可以鏡像保存整個目錄樹和文件系統;
  2. 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等;
  3. 無須特殊權限即可安裝;
  4. 優化的流程,文件傳輸效率高;
  5. 可以使用 rsh、ssh 等方式來傳輸文件,當然也可以通過直接的 socket 連接;
  6. 支持匿名傳輸。

Rsync 同步算法

Rsync 只所以同步文件的速度相當快,是因為 “Rsync 同步算法” 能在很短的時間內計算出需要備份的數據,關於 Rsync 的同步算法描述如下:

假定在 1 號和 2 號兩臺計算機之間同步相似的文件 A 與 B,其中 1 號對文件 A 擁有訪問權,2 號對文件 B 擁有訪問權。並且假定主機 1 號與 2 號之間的網絡帶寬很小。那麼 rsync 算法將通過下面的五個步驟來完成:

  1. 2 號將文件 B 分割成一組不重疊的固定大小為 S 字節的數據塊,最後一塊可能會比 S 小。
  2. 2 號對每一個分割好的數據塊執行兩種校驗:一種是 32 位的滾動弱校驗,另一種是 128 位的 MD4 強校驗
  3. 2 號將這些校驗結果發給 1 號。
  4. 1 號通過搜索文件 A 的所有大小為 S 的數據塊 (偏移量可以任選,不一定非要是 S 的倍數),來尋找與文件 B 的某一塊有著相同的弱校驗碼和強校驗碼的數據塊。這項工作可以藉助滾動校驗的特性很快完成。
  5. 1 號發給 2 號一串指令來生成文件 A 在 2 號上的備份。這裡的每一條指令要麼是對文件 B 經擁有某一個數據塊而不須重傳的證明,要麼是一個數據塊,這個數據塊肯定是沒有與文件 B 的任何一個數據塊匹配上的。

Rsync 參數說明

配置文件:rsyncd.conf

全局參數

在文件中,[module]之前的所有參數都是全局參數,當然也可以在全局參數部分定義模塊參數,這時候該參數的值就是所有模塊的默認值。

port指定後臺程序使用的端口號,默認為 873。

motd file用來指定一個消息文件,當客戶連接服務器時該文件的內容顯示給客戶,默認是沒有 motd 文件的。

log file指定 rsync 的日誌文件,而不將日誌發送給 syslog。比如可指定為 “/var/log/rsyncd.log”。

pid file指定 rsync 的 pid 文件,通常指定為 “/var/run/rsyncd.pid”。

syslog facility指定 rsync 發送日誌消息給 syslog 時的消息級別,常見的消息級別是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6 和 local7。默認值是 daemon。

模塊參數

主要是定義服務器哪個目錄要被同步。其格式必須為 “[module]” 形式,這個名字就是在 rsync 客戶端看到的名字,其實有點象 Samba 服務器提供的共享名。而服務器真正同步的數據是通過 path 來指定的。我們可以根據自己的需要,來指定多個模塊,模塊中可以定義以下參數:

comment給模塊指定一個描述,該描述連同模塊名在客戶連接得到模塊列表時顯示給客戶。默認沒有描述定義。

path指定該模塊的供備份的目錄樹路徑,該參數是必須指定的。

use chroot如果指定為 true,那麼 rsync 在傳輸文件以前首先 chroot 到 path 參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要以 root 權限,並且不能備份指向外部的符號連接所指向的目錄文件。默認值為 true。

uid指定當該模塊傳輸文件時守護進程應該具有的 uid,配合 gid 選項使用可以確定哪些可以訪問怎麼樣的文件權限,默認值是”nobody”。

gid指定當該模塊傳輸文件時守護進程應該具有的 gid。默認值為”nobody”。

max connections指定該模塊的最大併發連接數量以保護服務器,超過限制的連接請求將被告知隨後再試。默認值是 0,也就是沒有限制。

list該選項設定當客戶請求可以使用的模塊列表時,該模塊是否應該被列出。如果設置該選項為 false,可以創建隱藏的模塊。默認值是 true。

read only設定是否允許客戶上載文件。如果為 true 那麼任何上載請求都會失敗,如果為 false 並且服務器目錄讀寫權限允許那麼上載是允許的。默認值為 true。

exclude用來指定多個由空格隔開的多個文件或目錄 (相對路徑),並將其添加到 exclude 列表中。這等同於在客戶端命令中使用--exclude來指定 模式,一個模塊只能指定一個 exclude 選項。但是需要注意的一點是該選項有一定的安全性問題,客戶很有可能繞過 exclude 列表,如果希望確保特定 的文件不能被訪問,那就最好結合 uid/gid 選項一起使用。

exclude from指定一個包含 exclude 模式的定義的文件名,服務器從該文件中讀取 exclude 列表定義。

include用來指定不排除符合要求的文件或目錄。這等同於在客戶端命令中使用–include 來指定模式,結合 include 和 exclude 可以定義複雜的 exclude/include 規則。

include from指定一個包含 include 模式的定義的文件名,服務器從該文件中讀取 include 列表定義。

auth users指定由空格或逗號分隔的用戶名列表,只有這些用戶才允許連接該模塊。這裡的用戶和系統用戶沒有任何關係。如果”auth users” 被設置,那麼客戶端發出對該模塊的連接請求以後會被 rsync 請求 challenged 進行驗證身份這裡使用的 challenge/response 認證協議。用戶的名和密碼以明文方式存放在”secrets file” 選項指定的文件中。默認情況下無需密碼就可以連接模塊 (也就是匿名方式)。

secrets file指定一個包含定義用戶名: 密碼對的文件。只有在”auth users” 被定義時,該文件才有作用。文件每行包含一個 username:passwd 對。一般來說密碼最好不要超過 8 個字符。沒有默認的 secures file,需要限式指定一個 (例如:/etc/rsyncd.passwd)。注意:該文件的權限一定要是 600,否則客戶端將不能連接服務器。

strict modes指定是否監測密碼文件的權限,如果該選項值為 true 那麼密碼文件只能被 rsync 服務器運行身份的用戶訪問,其他任何用戶不可以訪問該文件。默認值為 true。

hosts allow指定哪些 IP 的客戶允許連接該模塊。客戶模式定義可以是以下形式:

  • 單個 IP 地址,例如:192.167.0.1
  • 整個網段,例如:192.168.0.0/24,也可以是 192.168.0.0/255.255.255.0
  • 多個 IP 或網段需要用空格隔開,“*” 則表示所有,默認是允許所有主機連接。

hosts deny指定不允許連接 rsync 服務器的機器,可以使用 hosts allow 的定義方式來進行定義。默認是沒有 hosts deny 定義。

ignore errors指定 rsyncd 在判斷是否運行傳輸時的刪除操作時忽略 server 上的 IO 錯誤,一般來說 rsync 在出現 IO 錯誤時將將跳過--delete操作,以防止因為暫時的資源不足或其它 IO 錯誤導致的嚴重問題。

ignore nonreadable指定 rysnc 服務器完全忽略那些用戶沒有訪問權限的文件。這對於在需要備份的目錄中有些文件是不應該被備份者得到的情況是有意義的。

lock file指定支持 max connections 參數的鎖文件,默認值是 / var/run/rsyncd.lock。

transfer logging使 rsync 服務器使用 ftp 格式的文件來記錄下載和上載操作在自己單獨的日誌中。

log format通過該選項用戶在使用 transfer logging 可以自己定製日誌文件的字段。其格式是一個包含格式定義符的字符串,可以使用的格式定義符如下:

一篇文詳解rsync 命令


timeout通過該選項可以覆蓋客戶指定的 IP 超時時間。通過該選項可以確保 rsync 服務器不會永遠等待一個崩潰的客戶端。超時單位為秒鐘,0 表示沒有超時定義,這也是默認值。對於匿名 rsync 服務器來說,一個理想的數字是 600。

refuse options通過該選項可以定義一些不允許客戶對該模塊使用的命令參數列表。這裡必須使用命令全名,而不能是簡稱。但發生拒絕某個命令的情況時服務器將報告錯誤信息然後退出。如果要防止使用壓縮,應該是:dont compress = *。

dont compress用來指定那些不進行壓縮處理再傳輸的文件,默認值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

Rsync 命令

在對 rsync 服務器配置結束以後,下一步就需要在客戶端發出 rsync 命令來實現將服務器端的文件備份到客戶端來。rsync 是一個功能非常強大的工具,其命令也有很多功能特色選項,下面就對它的選項一一進行分析說明。

Rsync 的命令格式可以為以下六種:

一篇文詳解rsync 命令


對應於以上六種命令格式,rsync 有六種不同的工作模式:

  1. 拷貝本地文件。當 SRC 和 DES 路徑信息都不包含有單個冒號”:” 分隔符時就啟動這種工作模式。如:rsync -a /data /backup
  2. 使用一個遠程 shell 程序 (如 rsh、ssh) 來實現將本地機器的內容拷貝到遠程機器。當 DST 路徑地址包含單個冒號”:”分隔符時啟動該模式。如:rsync -avz *.c foo:src
  3. 使用一個遠程 shell 程序 (如 rsh、ssh) 來實現將遠程機器的內容拷貝到本地機器。當 SRC 地址路徑包含單個冒號”:”分隔符時啟動該模式。如:rsync -avz foo:src/bar /data
  4. 從遠程 rsync 服務器中拷貝文件到本地機。當 SRC 路徑信息包含”::” 分隔符時啟動該模式。如:rsync -av [email protected]::www /databack
  5. 從本地機器拷貝文件到遠程 rsync 服務器中。當 DST 路徑信息包含”::” 分隔符時啟動該模式。如:rsync -av /databack [email protected]::www
  6. 列遠程機的文件列表。這類似於 rsync 傳輸,不過只要在命令中省略掉本地機信息即可。如:rsync -v rsync://172.16.78.192/www

rsync 參數的具體解釋如下:

一篇文詳解rsync 命令

一篇文詳解rsync 命令


Rsync 使用實例

SSH 方式

在服務端啟動 ssh 服務

一篇文詳解rsync 命令


使用 rsync 進行同步

接下來就可以在客戶端使用 rsync 命令來備份服務端上的數據了,SSH 方式是通過系統用戶來進行備份的,如下:

一篇文詳解rsync 命令


上面的信息描述了整個的備份過程,以及總共備份數據的大小。

後臺服務方式

啟動 rsync 服務

編輯 / etc/xinetd.d/rsync 文件,將其中的 disable=yes 改為 disable=no,並重啟 xinetd 服務,如下:

一篇文詳解rsync 命令


或者自己手動啟動並添加自啟動:

一篇文詳解rsync 命令


創建配置文件

默認安裝好 rsync 程序後,並不會自動創建 rsync 的主配置文件,需要手工來創建,其主配置文件為 “/etc/rsyncd.conf”,創建該文件並插入如下內容:

一篇文詳解rsync 命令


創建密碼文件

採用這種方式不能使用系統用戶對客戶端進行認證,所以需要創建一個密碼文件,其格式為 “username:password”,用戶名可以和密碼可以隨便定義,最好不要和系統帳戶一致,同時要把創建的密碼文件權限設置為 600,這在前面的模塊參數做了詳細介紹。

一篇文詳解rsync 命令


備份

完成以上工作,現在就可以對數據進行備份了,如下:

一篇文詳解rsync 命令


恢復

當服務器的數據出現問題時,那麼這時就需要通過客戶端的數據對服務端進行恢復,但前提是服務端允許客戶端有寫入權限,否則也不能在客戶端直接對服務端進行恢復,使用 rsync 對數據進行恢復的方法如下:

一篇文詳解rsync 命令


示例腳本

這裡這些腳本都是 rsync 網站上的例子:

1、每隔七天將數據往中心服務器做增量備份

一篇文詳解rsync 命令


2、備份至一個空閒的硬盤

一篇文詳解rsync 命令


3、對 vger.rutgers.edu 的 cvs 樹進行鏡像

一篇文詳解rsync 命令


FAQ

Q:如何通過 ssh 進行 rsync,而且無須輸入密碼?

A:可以通過以下幾個步驟

  1. 通過 ssh-keygen 在 server A 上建立 SSH keys,不要指定密碼,你會在~/.ssh 下看到 identity 和 identity.pub 文件
  2. 在 server B 上的 home 目錄建立子目錄. ssh
  3. 將 A 的 identity.pub 拷貝到 server B 上
  4. 將 identity.pub 加到~[user b]/.ssh/authorized_keys
  5. 於是 server A 上的 A 用戶,可通過下面命令以用戶 B ssh 到 server B 上了 e.g.ssh -l userB serverB
  6. 這樣就使 server A 上的用戶 A 就可以 ssh 以用戶 B 的身份無需密碼登陸到 server B 上了。

Q:如何通過在不危害安全的情況下通過防火牆使用 rsync?

A:解答如下:

這通常有兩種情況,一種是服務器在防火牆內,一種是服務器在防火牆外。無論哪種情況,通常還是使用 ssh,這時最好新建一個備份用戶,並且配置 sshd 僅允許這個用戶通過 RSA 認證方式進入。如果服務器在防火牆內,則最好限定客戶端的 IP 地址,拒絕其它所有連接。如果客戶機在防火牆內,則可以簡 單允許防火牆打開 TCP 端口 22 的 ssh 外發連接就 ok 了。

Q:我能將更改過或者刪除的文件也備份上來嗎?

A:當然可以:

你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...這樣的命令來實現。

這樣如果源文件:/path/to/some/file.c 改變了,那麼舊的文件就會被移到./backup-2000-2-13/path/to/some/file.c,

這裡這個目錄需要自己手工建立起來

Q:我需要在防火牆上開放哪些端口以適應 rsync?

A:視情況而定

rsync 可以直接通過 873 端口的 tcp 連接傳文件,也可以通過 22 端口的 ssh 來進行文件傳遞,但你也可以通過下列命令改變它的端口:

rsync --port 8730 otherhost::

或者

rsync -e 'ssh -p 2002' otherhost:

Q:我如何通過 rsync 只複製目錄結構,忽略掉文件呢?

A:rsync -av --include '*/' --exclude '*' source-dir dest-dir

Q:為什麼我總會出現 “Read-only file system” 的錯誤呢?

A:看看是否忘了設 “read only = no” 了

Q:為什麼我會出現‘@ERROR: invalid gid’的錯誤呢?

A:rsync 使用時默認是用 uid=nobody;gid=nobody 來運行的,如果你的系統不存在 nobody 組的話,就會出現這樣的錯誤,可以試試 gid = nogroup 或者其它

Q:綁定端口 873 失敗是怎麼回事?

A:如果你不是以 root 權限運行這一守護進程的話,因為 1024 端口以下是特權端口,會出現這樣的錯誤。你可以用–port 參數來改變。

Q:為什麼我認證失敗?

A:從你的命令行看來:

一篇文詳解rsync 命令


應該是沒有以你的用戶名登陸導致的問題,試試rsync -a [email protected]::test test


分享到:


相關文章: