rsync命令

文章來源: http://man.linuxde.net/rsync
rsync命令是linux/unix下的一個遠程數據同步的工具,可以快速同步多臺主機的文件,而且支持增量同步,而不用每次都整個目錄傳送。速度也是相當的快。
安裝:

#centos使用yum安裝
$yum -y install rsync
#ubuntu安裝
$sudo apt-get  install  rsync  
#或者編譯安裝
解壓源碼包,進入包目錄,configure --prefix=/usr ; make&&make install

新建配置文件:
主要有三個配置文件:
- rsyncd.conf(主要的配置文件,默認是沒有的,需要自己新建)
- rsyncd.secrets(這是密碼文件,後綴根據自己喜好定義,注意此文件權限屬性一定是root,一定要是600,不然會報錯的)
- rsyncd.motd(服務器的提示信息)
下面說下各文件內容:
rsyncd.motd:定義的是服務器信息的,就是用戶登錄信息,比如寫個:welcome to 192.168.1.35,此文件不是必須的,可有可無
rsyncd.secrets:這裏放的是同步的用戶名和密碼,格式爲user:pass,這裏的user不一定非得是系統的用戶,可以是隨意定義的虛擬用戶
rsyncd.conf:這是個主要的配置文件,配置項比較多

配置部署

1.首先在35機器上做配置
安裝完rsync後,新建三個配置文件(目錄自己定義,一般放在/etc下):

$echo  "Welcome to 192.168.1.35">/etc/rsyncd.motd
$echo "rsync_user:test123!@#">/etc/rsyncd.secrets
$chmod 600 /etc/rsyncd.secrets
$touch /etc/rsyncd.conf

編輯rsyncd.conf文件:
下面是我自己的例子

uid = nobody
gid = nobody
use chroot = yes
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid
#port = 874
address = 192.168.1.35
read only = no

#hosts allow =192.168.1.0/24 10.0.1.0/24
hosts allow = 192.168.1.37
hosts deny = *
motd file = /etc/rsyncd.motd
transfer logging = yes
log file = /var/log/rsyncd.log
[test_rsync]
        path = /data/test_rsync
        comment = test_dir
        auth users = rsync_user
        exclude = test2/
          ignore errors
        secrets file = /etc/rsyncd.secrets

配置文件rsyncd.conf各項說明

#全局定義
#pid文件目錄
pid file = /var/run/rsyncd.pid
#指定服務運行端口,默認端口是873
port =874
#指定服務器地址
address = 192.168.1.35
#指定運行用戶和組,
uid = nobody
gid = nobody
注意:這裏指定哪個目錄,同步的目錄就要給於這個用戶的權限,不然會遇到權限的問題
#注:用chroot,在傳輸文件之前,服務器守護程序在將chroot 到文件系統中的目錄中,這樣做的好處是可能保護系統被安裝漏洞侵襲的可能。缺點是需要超級用戶權限。另外對符號鏈接文件,將會排除在外。也就是說,你在 rsync服務器上,如果有符號鏈接,你在備份服務器上運行客戶端的同步數據時,只會把符號鏈接名同步下來,並不會同步符號鏈接的內容;這個需要自己來嘗 試
use chroot = yes
# read only 是隻讀選擇,也就是說,不讓客戶端上傳文件到服務器上。還有一個 write only選項
read only = yes 
#限制內網訪問的ip或ip段
hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
#客戶端最多連接數
max connections = 5 
#motd file 是定義服務器信息的,要自己寫 rsyncd.motd 文件內容。當用戶登錄時會看到這個信息
motd file = /etc/rsyncd/rsyncd.motd
#rsync 服務器的日誌
log file = /var/log/rsync.log
#傳輸文件的日誌
transfer logging = yes
#日誌格式
log format = %t %a %m %f %b
#日誌等級
syslog facility = local3
#超時時間  
timeout = 300 
#模塊定義
 [test_rsync]
        path = /data/test_rsync
        comment = test_dir
        auth users = test_user
        exclude = test2/
        ignore errors
        secrets file = /etc/rsyncd.secrets
#test_rsync:定義一個模塊名字
#path:指定這個模塊的目錄
#comment:模塊的描述,可以自己定義
#auth users:認證的用戶名(有說一定要是系統用戶,但我試了下,好像不是也可以)
#list = yes 反rsync服務器上的同步數據的目錄在服務器的模塊上是否顯示列出來,默認是yes,但no是比較安全的,至少別人不知道你服務器上提供了哪些目錄
#ignore errors: 忽略IO的錯誤
#scerets file:密碼文件的路徑
exclude=test2/ test3/:排除目錄,排隊test2和test3兩個目錄不同步

啓動服務:

#守護進程的啓動方式
rsync --daemon &
如果配置文件沒有在/etc下,加個--config參數
rsync --daemon --config=/usr/local/rsyncd.conf
#xinetd啓動方式
編輯/etc/services文件添加如下兩行:
rsync  873/tcp  # rsync 
rsync  873/udp  # rsync
設定 /etc/xinetd.d/rsync,比如:
# default: off
# description: The rsync server is a good addition to am ftp server, as it \
#allows crc checksumming etc.
service rsync{
    disable = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure  += USERID
}
然後service xinetd restart

語法:

rsync [OPTION]... SRC DEST 
rsync [OPTION]... SRC [USER@]host:DEST 
rsync [OPTION]... [USER@]HOST:SRC DEST 
rsync [OPTION]... [USER@]HOST::SRC DEST 
rsync [OPTION]... SRC [USER@]HOST::DEST 
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

對應於以上六種命令格式,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 root@192.168.78.192::www /databack

5.從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含”::”分隔符時啓動該模式。如:

rsync -av /databack root@192.168.78.192::www

6.列遠程機的文件列表。這類似於rsync傳輸,不過只要在命令中省略掉本地機信息即可。如:

rsync -v rsync://192.168.78.192/www

選項解釋

-v, --verbose 詳細模式輸出。 
-q, --quiet 精簡輸出模式。 
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗。 
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD。 
-r, --recursive 對子目錄以遞歸模式處理。 
-R, --relative 使用相對路徑信息。 
-b, --backup 創建備份,也就是對於目的已經存在有同樣的文件名時,將老的文件重新命名爲~filename。可以使用--suffix選項來指定不同的備份文件前綴。 
--backup-dir 將備份文件(如~filename)存放在在目錄下。 
-suffix=SUFFIX 定義備份文件前綴。 
-u, --update 僅僅進行更新,也就是跳過所有已經存在於DST,並且文件時間晚於要備份的文件,不覆蓋更新的文件。 
-l, --links 保留軟鏈結。 
-L, --copy-links 想對待常規文件一樣處理軟鏈結。 
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的鏈結。 
--safe-links 忽略指向SRC路徑目錄樹以外的鏈結。 
-H, --hard-links 保留硬鏈結。 
-p, --perms 保持文件權限。 
-o, --owner 保持文件屬主信息。 
-g, --group 保持文件屬組信息。 
-D, --devices 保持設備文件信息。 
-t, --times 保持文件時間信息。 
-S, --sparse 對稀疏文件進行特殊處理以節省DST的空間。 
-n, --dry-run現實哪些文件將被傳輸。 
-w, --whole-file 拷貝文件,不進行增量檢測。 
-x, --one-file-system 不要跨越文件系統邊界。 
-B, --block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節。 
-e, --rsh=command 指定使用rsh、ssh方式進行數據同步。 
--rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息。 
-C, --cvs-exclude 使用和CVS一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件。 
--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新創建的文件。 
--delete 刪除那些DSTSRC沒有的文件。 
--delete-excluded 同樣刪除接收端那些被該選項指定排除的文件。 
--delete-after 傳輸結束以後再刪除。 
--ignore-errors 及時出現IO錯誤也進行刪除。 
--max-delete=NUM 最多刪除NUM個文件。 
--partial 保留那些因故沒有完全傳輸的文件,以是加快隨後的再次傳輸。 
--force 強制刪除目錄,即使不爲空。 
--numeric-ids 不將數字的用戶和組id匹配爲用戶名和組名。 
--timeout=time ip超時時間,單位爲秒。 
-I, --ignore-times 不跳過那些有同樣的時間和長度的文件。 
--size-only 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間。 
--modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,默認爲0-T --temp-dir=DIRDIR中創建臨時文件。 
--compare-dest=DIR 同樣比較DIR中的文件來決定是否需要備份。 
-P 等同於 --partial。 
--progress 顯示備份過程。 
-z, --compress 對備份的文件在傳輸時進行壓縮處理。 
--exclude=PATTERN 指定排除不需要傳輸的文件模式。 
--include=PATTERN 指定不排除而需要傳輸的文件模式。 
--exclude-from=FILE 排除FILE中指定模式的文件。 
--include-from=FILE 不排除FILE指定模式匹配的文件。 
--version 打印版本信息。 
--address 綁定到特定的地址。 
--config=FILE 指定其他的配置文件,不使用默認的rsyncd.conf文件。 
--port=PORT 指定其他的rsync服務端口。 
--blocking-io 對遠程shell使用阻塞IO-stats 給出某些文件的傳輸狀態。 
--progress 在傳輸時現實傳輸過程。 
--log-format=formAT 指定日誌文件格式。 
--password-file=FILEFILE中得到密碼。 
--bwlimit=KBPS 限制I/O帶寬,KBytes per second。 -h, --help 顯示幫助信息。

使用方法:

rsync -vzrtopg --progress -e ssh --delete work@172.16.78.192:/www/* /databack/experiment/rsync

FAQ
六、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。這樣就使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 = ogroup或者其它

  Q:綁定端口873失敗是怎麼回事?
  A:如果你不是以root權限運行這一守護進程的話,因爲1024端口以下是特權端口,會出現這樣的錯誤。你可以用–port參數來改變。

  Q:爲什麼我認證失敗?
  A:從你的命令行看來:你用的是

  > bash$ rsync -a 144.16.251.213::test test
  > Password:
  > @ERROR: auth failed on module test
  >
  > I dont understand this. Can somebody explain as to how to acomplish this.
  > All suggestions are welcome.

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

  Q: 出現以下這個訊息, 是怎麼一回事?
  @ERROR: auth failed on module xxxxx
  rsync: connection unexpectedly closed (90 bytes read so far)
  rsync error: error in rsync protocol data stream (code 12) at io.c(150)

  A: 這是因爲密碼設錯了, 無法登入成功, 請再檢查一下 rsyncd.secrets 中的密碼設定, 二端是否一致?

  Q: 出現以下這個訊息, 是怎麼一回事?

  password file must not be other-accessible
  continuing without password file
  Password:

  A: 這表示 rsyncd.secrets 的檔案權限屬性不對, 應設爲 600。請下 chmod 600 rsyncd.secrets

  Q: 出現以下這個訊息, 是怎麼一回事?

  @ERROR: chroot failed
  rsync: connection unexpectedly closed (75 bytes read so far)
  rsync error: error in rsync protocol data stream (code 12) at io.c(150)

  A: 這通常是您的 rsyncd.conf 中的 path 路徑所設的那個目錄並不存在所致.請先用 mkdir開設好備份目錄.

完!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章