??
目錄
一、rsync介紹
rsync的安裝
二、rsync的語法
三、rsync命令使用
1. 本機同步
2. 遠程同步
四、rsync作為服務使用
1、嘗試啟動rsync程序
2、rsync的配置文件介紹
注意事項:
3. rsync+inotify實時同步
3.依賴服務托管xinetd(CentOS 6中rsync)
一、rsync介紹
- rsync的好姐妹
- sync 同步:刷新文件系統緩存,強制將修改過的數據塊寫入磁盤,并且更新超級塊。
- async 異步:將數據先放到緩沖區,再周期性(一般是30s)的去同步到磁盤。
- rsync 遠程同步:remote synchronous。
- rsync的特點
可以鏡像保存整個目錄樹和文件系統
可以保留原有的權限(permission,mode),owner,group,時間(修改時間,modify time),軟硬鏈接,文件acl,文件屬性(attributes)信息等
傳輸效率高,使用同步算法,只比較變化的(增量備份)
file1.txt file2.txt file3.txt(A服務器)
file1.txt file2.txt(B服務器)
rsync實現數據同步 => 只同步file3.txt => 增量備份
支持匿名傳輸,方便網站鏡像;也可以做驗證,加強安全
rsync與scp區別?
????????兩者都可以實現遠程同步,但是相對比而言,rsync能力更強。表現在:① 支持增量備份;② 數據同步時保持文件的原有屬性。
rsync的安裝
yum install rsync -y
#在這里我比較推薦yum安裝,比較方便
rsync認證方式
????????rsync有兩種常用的認證方式,一種是rsync-daemon方式(客戶端連接873端口,實現數據傳輸, 傳輸過程不加密),另外一種是ssh方式(走ssh加密通道)。在 rsync 命令中,如果使用單個冒號(:),則默認使用 ssh 協議; 反之,如果使用兩個冒號(::),則使用 rsync 協議。 在平時使用過程,我們使用最多的是rsync-daemon方式。 注意:(1)在使用rsync時,服務器和客戶端都必須安裝rsync程序。?(2)、rsync-daemon認證方式,需要服務器和客戶端都安裝rsync服務并且只需要rsync服務器端啟動rsync,同時配置rsync配置文件。 客戶端啟動不啟動rsync服務,都不影響同步的正常進行。(3)ssh認證方式,不需要服務器和客戶端配置rsync配置文件 只需要雙方都安裝rsync服務,并且也不需要雙方啟動rsync。
????????兩種認證方式的本質區別:(1)、ssh 協議認證連接的兩端是通過管道完成通信和數據傳輸的,當連接到遠程主機時,將在遠程主 機 fork 出 rsync 進程使其成為 rsync server;(2)、而 rsync 協議認證是事先在遠程主機上運行 rsync 守護進 程,監聽套接字等待客戶端的連接,建立連接后所有通信方式都是通過套接字完成的。
二、rsync的語法
- man rsync
NAMErsync — a fast, versatile, remote (and local) file-copying tool//一種快速、通用、遠程(和本地)的文件復制工具SYNOPSISLocal: rsync [OPTION...] SRC... [DEST]Access via remote shell://通過遠程shell訪問(命令)Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]Push: rsync [OPTION...] SRC... [USER@]HOST:DESTAccess via rsync daemon://通過后臺程序訪問(作為服務)Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]Push: rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
- rsync命令參數
-v 詳細模式輸出-a 歸檔模式,遞歸的方式傳輸文件,并保持文件的屬性,equals -rlptgoD-r 遞歸拷貝目錄-l 保留軟鏈接-p 保留原有權限-t 保留原有時間(修改)-g 保留屬組權限-o 保留屬主權限-D 等于--devices --specials 表示支持b,c,s,p類型的文件-R 保留相對路徑-H 保留硬鏈接-A 保留ACL策略-e 指定要執行的遠程shell命令-E 保留可執行權限-X 保留擴展屬性信息 a屬性
三、rsync命令使用
1. 本機同步
注意:
1. 本地數據同步的時候,源目錄后面的“/”會影響同步的結果# rsync -av /dir1/ /dir3 //只同步dir1目錄下面的文件到指定的路徑# rsync -av /dir1 /dir2 //將當前目錄dir1和目錄下的所有文件一起同步2. -R:不管加不加"/",都會將源數據的絕對路徑一起同步# rsync -avR /dir1/ /dir2/
3. --delete:刪除目標目錄里多余的文件# rsync -avR --delete /dir1/ /dir2/
2. 遠程同步
pull: rsync -av user@host:/path local/path
# rsync -av root@10.1.1.1:/etc/hosts /dir1/
# rsync -av root@10.1.1.1:/backup /dir1
push: rsync -av local/path user@host:/path
# rsync -av /dir1/aa1 code@10.1.1.1:/home/code
思考:
rsync遠程同步數據時,默認情況下為什么需要密碼?如果不想要密碼同步怎么實現?
因為兩臺Linux服務器在連接時,默認使用的還是SSH協議。由于沒有做免密登錄,所以還是需要輸入對方服務器的密碼。
如果不想輸入密碼,可以使用免密登錄來實現。
# ssh-keygen
# ssh-copy-id root@10.1.1.250
四、rsync作為服務使用
思路:
對外提供服務——>端口監聽——>啟動服務——>啟動腳本(沒有)——>配置文件(修改需求)
1、嘗試啟動rsync程序
[root@jumper ~]# rsync --daemon
Failed to parse config file: /etc/rsyncd.conf
說明:先嘗試以后臺程序的方式啟動它
原因:沒有配置文件(默認沒有)
解決:創建配置文件
[root@jumper ~]# touch /etc/rsyncd.conf
[root@jumper ~]# rsync --daemon
[root@jumper ~]# ps -ef|grep rsync
root 3814 1 0 11:43 ? 00:00:00 rsync --daemon
root 3817 2826 0 11:44 pts/0 00:00:00 grep rsync
[root@jumper ~]# netstat -nltup|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3814/rsync
tcp 0 0 :::873 :::* LISTEN 3814/rsync
結論:
1. rsync啟動時必須要讀取配置文件,如果沒有報錯
2. rsync默認情況下,端口是873,協議tcp#或者啟動rsyncd服務(CentOS6中沒有,CentOS7中有這個服務)
# systemctl start rsyncd
2、rsync的配置文件介紹
man 5 rsyncd.conf
全局的參數port = xxxpid file = xxx...
局部模塊
[模塊名1]path = /dir1uid = xxxgid = xxxlog file = xxxmax connections =4.....
[模塊名2]path = /dir2uid =xxxgid = xxx.....# 以 rsync 用戶啟動進程
# 傳輸文件使用的用戶和用戶組,如果是從服務器=>客戶端,要保證rsync用戶對文件有讀取的權限;如果是
從客戶端=>服務端,要保證rsync對文件有寫權限。
uid = rsync
gid?=?rsync
# uid和gid表明同步上來的文件寫入的時候是使用哪個用戶身份進行寫入的。所以,這個用戶必須要對
path 定義的目錄有寫入權限。否則會在客戶端報:rsync: xxx failed: Permission denied (13)
fake super = yes ? ?
# 如果設置為yes,那么文件的所有者和所屬組信息變成rsync虛擬用戶的UID,GID,想要所有者和所屬組信
息不變可以設置fake super ?
use?chroot?=?yes
# 禁錮推送的數據至某個目錄, 不允許跳出該目錄
#允許chroot,提升安全性,客戶端連接模塊,首先chroot到模塊path參數指定的目錄下,chroot為yes時
必須使用root權限,且不能備份path路徑外的鏈接文件max?connections?=?200 ? ? ? ? ? ? ? ? ? # 最大連接數
timeout?=?300 ? ? ? ? ? ? ? ? ? ? ? ? ? # 超時時間
pid?file?=?/var/run/rsyncd.pid ? ? ? ? ?# pid文件路徑
lock?file?=?/var/run/rsync.lock ? ? ? ? # 鎖文件路徑
exclude = lost+found/ ? ? ? ? ? ? ? ? ? # 剔除某些文件或目錄,不同步
transfer logging = yes ? ? ? ? ? ? ? ? ?# 記錄傳輸文件日志
log?file?=?/var/log/rsyncd.log ? ? ? ? ?# 指定日志文件
log format = %t %a %m %f %b ? ? ? ? ? ? # 日志文件格式
ignore?errors ? ? ? ? ? ? ? ? ? ? ? ? ? # 忽略錯誤信息
list?=?false ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 不允許查看模塊信息
hosts?allow?=?192.168.42.0/24 ? ? ? ? ? # 只允許192.168.42.0/24段ip連接
hosts?deny?=?* ? ? ? ? ? ? ? ? ? ? ? ? ?# 不允許所有網段ip連接
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 設置不需要壓縮的文件
path = /home/nebula/backup ? ? ? ? ? ? ?# 上傳的文件存儲的目錄,下載文件的讀目錄
comment = nebula userdata backup #共享給客戶端看到的名字,可以自己定義
read?only?=?false ? ? ? ? ? ? ? ? ? ? ? # backup這個模塊兒,是否可以被寫入。
auth users = youyou ? ? ? ? ? ? ? ? ? ? # 虛擬用戶名,即就是上傳時rsync命令書寫中寫的。
secrets file = /etc/rsync.password #密碼文件,服務端書寫格式為虛擬用戶名:密碼 客戶端的書寫格式為 虛擬用戶所對應的密碼# 以下為安全配置,請按照具體的生產環境需求配置。如:上傳到服務端上的文件,并不希望被客戶端同步
刪除refuse options = delete delete-delay delete-before delete-excluded deleteaftermax-delete force partial P
# pre-xfer 用于可以在rsync傳送之前,執行一些操作,如建立鎖定文件,保證每次只有一個鏈接進行
數據傳輸,
# post-xfer 可以保證數據傳輸完畢之后可以自動執行后續動作。
pre-xfer exec = sh /root/.rsync_pre.sh
post-xfer exec = rm -f /var/rsync.lock
日志文件格式補充:
注意事項:
- 不論是在服務端還是客戶端,密碼文件的權限都必須是600,否則就會報錯。服務端rsync服務是以什么用戶運行,則必須保證secrets file文件擁有者必須是同一個。假設root運行rsync --daemon,則secrets file的owner也必須是root;secrets file權限必須是600。
- 在服務器端端盡量將所同步的文件的屬主和屬組改為rsyncd.conf文件中對應的uid和gid對應的用戶和用戶組。避面上傳和下載的時候發生不必要的錯誤。
- 要想給服務端的模塊下上傳文件,就必須要在服務端的配置文件中對相應的模塊中添加 read only=false,否則上傳文件就會失敗。
- auter users中的用戶是不用在服務端創建的(只是虛擬存在而已),而uid和gid對應的用戶和用戶組必須是存在的(一般我們把uid指定為useradd -r系統用戶或useradd -M不創建家目錄,并且會指定shell為/sbin/nologin);雖然我們在遠程上傳和本地下載的時候用的是對應的虛擬用戶,但是在rsync在驗證的是時候是這里uid和gid。
- 沒有密碼有好處也有壞處,好處是不需要密碼方便寫腳本做遠程同步;壞處就是不安全,但你可以使用防火墻等來加強安全。
- 同步可能出現的問題:
- 如果同步報permission denied這種,可能是服務端selinux沒有關閉
- 同步時間慢:解決方法——綁定對方主機名
- 如果你希望有密碼,可以用rsyncd本身自帶的secrets file來做用戶驗證
3. rsync+inotify實時同步
需求:app1-server服務器上的/app/java_project目錄的文件和backup主機上的/backup目錄實時同步
分析:rsync本身不可以做到數據的實時同步,需要借助第三方工具,intotify工具。實現線上環境目錄發生改變立馬同步到backup主機,是單向同步。參考-------備份端的rsyncd.conf的配置如下:
[my_java] path=/root/java comment=my_java.bak log file=/var/log/rsyncd.log uid=java_user gid=java_user auth users=xiaowang secrets file=/etc/rsyncd.secrets read only=false ignore errors
服務端得創建用戶 useradd -s /sbin/nologin -M java_user 服務端的密碼文件 echo "xiaowang:123456" >> /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets 客戶端的密碼文件 echo "123456" >> /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets
步驟:
1. 在服務器端上安裝inotify工具
- 原碼安裝或者結合epel源使用yum 進行安裝
- 安裝完后,就會產生下面兩個命令
/usr/local/bin/inotifywait ?????等待? 、/usr/local/bin/inotifywatch ????看守
2. 查看命令如何使用,然后編寫腳本來實現目錄的監控
- 注意:該腳本應該在備份服務器運行,該服務器是往備份服務器上進行推送
# inotifywait --help
- -m 保持監控狀態
- -r 遞歸監控
- -q 只打印事件
- -e 指定事件
事件:
- move?? ?移動、delete?? ?刪除、create?? ?創建、modify?? ?修改、attrib?? ?屬性信息
- 編寫腳本-----實時監控要鏡像備份的目錄(腳本我們后面會講到)
vim /root/inotify.sh#!/bin/bash /usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /root/java.bak | while read events dorsync -av --delete --password-file=/etc/rsyncd.secrets /root/java.bak/ xiaowang@192.168.17.3::my_java/ &> /dev/nullecho "`date +%F\ %T`出現事件$events" >> /var/log/rsyncd.log 2>&1 done# chmod +x inotify.sh?? ??? ?增加可執行權限 # ./inotify.sh ?&?? ??? ??? ?將腳本放到后臺去運行
注意:
????????如果單純使用命令去推的話,正常情況下需要密碼,不利于腳本編寫,在這里提供2中解決方案:1)設置免密碼登錄;2)在backup服務器上將rsync作為后臺程序運行3. 測試驗證
[root@localhost java.bak]# touch file.c [root@localhost java.bak]# rm -rf file.c [root@localhost java.bak]# cat /var/log/rsyncd.log 2025-06-01 22:25:54出現事件/root/java.bak/ CREATE file.c 2025-06-01 22:25:55出現事件/root/java.bak/ ATTRIB file.c 2025-06-01 22:25:56出現事件/root/java.bak/ DELETE file.c
3.依賴服務托管xinetd(CentOS 6中rsync)
獨立服務:獨立啟動腳本 ssh ftp nfs dns …
依賴服務: 沒有獨立的啟動腳本? 依賴xinetd服務(獨立服務)
- 平時不占用系統的運行資源
- xinetd服務管理依賴服務
- 一些輕量級服務會托管給xinetd服務
如何將rsync托管給xinetd服務去管理?
1. 安裝相應的軟件
?yum -y install xinetd
2. 查看軟件類別
rpm -ql xinetd /etc/rc.d/init.d/xinetd /etc/xinetd.conf /etc/xinetd.d ? xinetd服務管理的所有輕量級服務的目錄 /usr/sbin/xinetd /usr/share/man/man5/xinetd.conf.5.gz
3. 查看rsync軟件列表
rpm -ql rsync /etc/xinetd.d/rsync /usr/bin/rsync
4. 了解配置文件
- 1)xinetd服務的配置文件
man 5 xinetd.conf only_from?? ??? ?只允許訪問 no_access?? ??? ?拒絕訪問 access_times?? ?控制訪問服務的時間段 log_type?? ??? ??? ?指定日志類型 interface?? ??? ?并發連接數 per_source?? ??? ?每個IP的最大連接數
- 2)rsync配置文件 /etc/xinetd.d/rsync
service rsync {disable?? ?= no?? ??? ?//開關;no表示開啟該服務;yes表示關閉服務flags?? ??? ?= IPv6socket_type ? ? = streamwait ? ? ? ? ? ?= nouser ? ? ? ? ? ?= rootserver ? ? ? ? ?= /usr/bin/rsyncserver_args ? ? = --daemonlog_on_failure ?+= USERID }
5. 把rsync服務的開關打開
6. 啟動xinetd服務service xinetd restart [root@jumper ~]# netstat -nltp|grep 873 tcp ? ? ? ?0 ? ? ?0 :::873 ? ? ? ? ? ? ? ? ? ? ?:::* ? ? ? ? ? ? ? ? ? ? ? ?LISTEN ? ? ?6209/xinetd ? ?
到此,rsync服務就托管給了xinetd服務管理;后續需要有些需求,修改配置文件:
/etc/rsyncd.conf、/etc/xinetd.d/rsync
?本? ?篇? ?完? ?結? ?…? …
持? ? ?續? ? ?更? ? ?新? ? ?中???…? ? …?