常用rsync命令操作梳理

吞吞吐吐的發表於2017-10-11

作為一個運維工程師,經常可能會面對幾十臺、幾百臺甚至上千臺伺服器,除了批量操作外,環境同步、資料同步也是必不可少的技能。

說到“同步”,不得不提的利器就是rsync。rsync不但可以在本機進行檔案同步,也可以作為遠端同步工具。

前面提到了rsync+inotify實時同步方案部署,下面結合本人近幾年運維工作中對這一工具使用的經驗,簡單在此梳理下:

rsync同步命令中常用的幾個引數說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-a, --archive 歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性,等於-rlptgoD
-v, --verbose 詳細模式輸出
-p, --perms 保持檔案許可權
-g, --group 保持檔案屬組資訊
-o, --owner 保持檔案屬主資訊
-r, --recursive 對子目錄以遞迴模式處理。同步目錄的時候要加上這個引數
-l, --links 保留軟鏈結,加上這個引數,同步過來的檔案會保持之前的軟連結屬性不變
-H, --hard-links 保留硬鏈結
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行資料同步
-z, --compress 對備份的檔案在傳輸時進行壓縮處理
--stats 給出某些檔案的傳輸狀態
--progress 列印同步的過程
--timeout=TIME 同步過程中,IP超時時間,單位為秒
--delete 刪除那些目標目錄中有而源目錄中沒有的多餘檔案。這個是rsync做增量方式的全備份的最佳選擇方案!!!!!!
--delete-before 接受者在輸出之前進行刪除操作。即先將目標目錄中檔案全部刪除,再將源目錄檔案拷貝過去。這是rsync保持目標目錄跟源目錄一致的方案!!!
--delete-after 在同步操作之後做比較,刪除那些目標目錄中有而源目錄中沒有的多餘檔案
--delete-excluded 刪除目標目錄中那些被該選項指定排除的檔案
--ignore-errors 即使出現IO錯誤也進行刪除,忽略錯誤
--exclude 指定同步時需要過濾掉的檔案或子目錄(即不需要同步過去的),後面直接跟不需要同步的單個檔名或子目錄(不需要跟路徑) ,過濾多個檔案或子目錄,就使用多個--exclude
--exclude-from 指定同步時需要過濾掉的檔案或子目錄,後面跟檔案(比如/root/exclue.txt),然後將不需要同步的檔案和子目錄放到/root/exclue.txt下。
--version 列印版本資訊
--port=PORT 指定其他的rsync服務埠
--log-format=formAT 指定日誌檔案格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O頻寬,KBytes per second

通常用到的rsync同步命令,如下:

25791是ssh埠

[root@bastion-IDC ~]# rsycn -e “ssh -p 25791” -avpgolr  php5.5.1 192.168.1.22:/Data/app/

==========================rsync常規錯誤=======================

1
2
3
4
5
6
7
8
9
10
rsync: failed to set times on "." (in test_upload): Permission denied (13)
rsync: opendir "." (in test_upload) failed: Permission denied (13)
 
原因是由於selinux沒有關閉導致的,關閉它即可!
[root@test ~]# getenforce
Enforcing
[root@test ~]# setenforce 0
[root@test ~]# getenforce
Permissive
[root@test ~]# sed -i `s/SELINUX=enforcing/SELINUX=disabled/g` /etc/sysconfig/selinux

rsync如何實現同步目標路徑下的目錄,不同步路徑下的檔案 ,只想同步目錄結構

[root@bastion-IDC ~]# rsync -av –delete -f `+ */` -f `- *` SRC/ DEST/

rsync在遠端同步的時候,要求目標目錄要和源目錄保持同步,目標目錄中多餘的檔案都要刪除
這就需要用到了引數–delete,如下:

[root@bastion-IDC ~]# /usr/bin/rsync -vlzrtogp –progress –delete root@192.168.1.120::test –password-file=/root/192.168.1.115 /root/2013/
但是這個–delete加上去就是一個危險的命令,因為它是在同步之前先將目標目錄中的檔案刪除,然後再將源目錄中的檔案同步過去。
如果目標目錄比較大,在刪除過程中出現當機事故就不好了。所以最好還是用–delete-before或–delete-after比較溫柔點,靠譜點。

———————————————————————————————————-
rsync遠端拷貝的時候,過濾某些某個檔案或多個檔案就用“–exclude 檔名”
要是過濾多個檔案或子目錄,就把過濾的檔案或目錄名的關鍵字放在一個檔案裡,如下的exclude_file檔案
然後使用–exclude-from exclude—-file檔案進行過濾

[root@bastion-IDC ~]# cat /root/lxp/exclude_file         //即rsync同步的時候,過濾掉含有下面字樣名的檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.svn
.git
.DS_Store
*.sql
*.bak
.project
main.php
environment.php
main/upload         //這個過濾的是rsync同步目錄下的main/upload目錄
main/temp/runtime
fangff              //過濾的目錄
hqtime              //過濾的目錄
apiConfig.php
consoleConfig.php
tpl_c
consoleConfig.php

[root@bastion-IDC ~]# cat rsync_code.sh         //提前做本機與192.168.1.57的ssh無密碼登陸的信任關係

1
2
3
4
5
#!/bin/sh
EXCLUDE_FILE="/root/lxp/exclude_file"
/usr/bin/rsync -avpgolr -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} /var/www/vhosts/www.wangshibo.com/httpdocs/ root@192.168.1.57:/var/www/vhosts/www.wangshibo.com/httpdocs/
/usr/bin/rsync -avpgolr -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} /var/www/vhosts/fanghu.xqshijie.com/httpdocs/ root@192.168.1.57:/var/www/vhosts/fanghu.xqshijie.com/httpdocs/
/usr/bin/rsync -avpgolr -e "ssh -p 25791" --exclude-from ${EXCLUDE_FILE} /Data/fanghu_temp/ root@192.168.1.57:/Data/fanghu_temp/

例如:同步本機目錄到遠端伺服器上,過濾到同步目錄中的個別檔案

下面指令碼說明:同步過程中,同步目錄中凡是main-local.php和params-local.php檔案都不覆蓋!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@huanqiu ~]# cat /Data/webroot_svncode/exclude
main-local.php
params-local.php
 
[root@huanqiu ~]# vim rsync.sh
#!/bin/bash
EXCLUDE_FILE="/Data/webroot_svncode/exclude"
SOURCE_DIR=/srv/apache-tomcat-7.0.67/webapps/jenkins/jobs/apihuanqiu}/workspace/
DEST_DIR=/var/www/vhosts/apihuanqiu/
REMOTE_IP=192.168.19.19
 
/usr/bin/rsync -e "ssh -p22" -avpgolr --exclude-from ${EXCLUDE_FILE} $SOURCE_DIR $REMOTE_IP:$DEST_DIR
/usr/bin/ssh -p22 $REMOTE_IP "chmod a+w -R /var/www/vhosts/apihuanqiu/frontend/web/assets/"
/usr/bin/ssh -p22 $REMOTE_IP "chmod a+w -R /var/www/vhosts/apihuanqiu/frontend/runtime/"

1)排除單獨的資料夾和檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
比如要排除sources資料夾,我們可以新增 `--exclude` 選項:
--exclude `sources`
命令是這樣的:
[root@bastion-IDC ~]# rsync -e `ssh -p 30000` -avl --delete --stats --progress --exclude `sources` demo@192.168.1.120:/home/demo /backup/
 
比如要排除 "public_html" 資料夾下的 "database.txt" 檔案:
--exclude `public_html/database.txt`
命令是這樣的:
[root@bastion-IDC ~]# rsync -e `ssh -p 30000` -avl --delete --stats --progress --exclude `sources` --exclude `public_html/database.txt` demo@192.168.1.120:/home/demo /backup/
 
比如排除掉同步目錄中的類似*-prod.properties檔案(比如global-prod.properties等)
命令是這樣的:
[root@bastion-IDC ~]# /usr/bin/rsync -av -e "/usr/bin/ssh -p25791" --rsync-path="/usr/bin/rsync" --exclude=*-prod.properties --progress /opt/tomcat/webapps/awaken_beta/ 192.168.1.20:/Data/app/apache-tomcat-8/awakenweb/ROOT/

2)使用 `–exclude-from` 排除多個資料夾和檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
建立檔案:
[root@bastion-IDC ~]# touch /home/backup/exclude.txt
 
在裡面定義要排除的資料夾和檔案
[root@bastion-IDC ~]# vim /home/backup/exclude.txt
sources
public_html/database.*
downloads/test/*
 
使用指令:
--exclude-from `/home/backup/exclude.txt`
 
最後的命令如下:
[root@bastion-IDC ~]# rsync -e `ssh -p 30000` -avl --delete --stats --progress --exclude-from `/home/backup/exclude.txt` demo@192.168.1.120:/home/demo /backup/

————————————————-用rsync命令和scp命令實現本機帶進度條提示拷貝———————————–

rsync和scp拷貝時顯示進度條提示

1)rsync命令

[root@dbtest bak]# rsync -e “ssh -p22222” -avpgolr –progress db170630.tar.gz 192.168.1.198:/data/upload/

root@192.168.1.198`s password: 

sending incremental file list

db170630.tar.gz

702087168 4% 5.60MB/s 0:41:47

–progress 可以實現本機帶進度條提示拷貝,可以實現不同機器帶進度條提示拷貝,可以拷貝多個檔案

2)scp命令

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz /usr/local/src/ 

[以上命令] 本機拷貝無法顯示進度

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@192.168.1.1:/usr/local/src/ 

[以上命令] 不同機器拷貝可以顯示進度條,即使不帶”-v”引數也可以顯示進度條

[root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@127.0.0.1:/usr/local/src/ 

[以上命令] 變相實現本機帶進度條提示拷貝,可以不帶”-v”引數

3) cp命令

暫時沒有找到帶進度條提示拷貝

—————————————————– rsync同步時候的限流操作—————————————————- 

# rsync -auvz –progress –delete –bwlimit=1000 遠端檔案 本地檔案 //限制為1000kBytes/s

# rsync -auvz –progress –delete –bwlimit=2048 遠端檔案 本地檔案 //限制為2M/s

——–scp同步時的限流(-l引數)——–

# scp -l 1024 file root@192.168.1.100 //限制為1M Bytes/s

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/5689491.html,如需轉載請自行聯絡原作者


相關文章