rsync+inotify 實現兩個服務端數據實時同步

一、rsync服務端部署

兩個服務端 192.168.1.234、172.16.8.85。在此192.168.1.234作爲數據運行的客戶端,172.16.8.85作爲數據備份的服務端。
而rsync服務端則放在172.16.8.85上,用以不斷的從192.168.1.234上接收數據進行備份。在此我把192.168.1.234叫做客戶端,172.16.8.85叫做服務端。

1、查看服務端rsync版本
在這裏插入圖片描述
2、創建配置文件
默認安裝rsync程序後,不會自動創建rsync的主配置文件,需要手工創建,在 /etc 下創建rsyncd.conf文件,並配置如下內容:

#rsync server 爲 rsyncd 服務編輯配置文件,默認沒有,需自己編輯
#create by sherwin 13:41 2019-3-29
##rsyncd.conf start##

#rsync運行權限爲sherwin
uid = sherwin

#rsync運行權限爲sherwin
gid = sherwin

#是否讓進程離開工作目錄
use chroot = no

#客戶端最大併發連接數 ,0爲不限制
max connections = 2000 

#連接超時
timeout = 600   

#指定rsync的pid存放路徑
pid file = /var/run/rsyncd.pid   

#指定rsync的鎖文件存放路徑
lock file = /var/run/rsyncd.lock

#指定rsync的日誌存放路徑
log file = /var/log/rsyncd.log

#忽略一些無關的I/O錯誤
ignore errors

#客戶端可以上傳
read only = false

#客戶端可以下載
#write only = false 
list = false

#允許連接的客戶端主機ip
hosts allow = 192.168.1.0/24

#黑名單,*表示任何主機
hosts deny = 0.0.0.0/23

#認證此模塊的用戶名/#授權遠程連接的用戶
auth users = sherwin

#存放用戶和密碼的文件 "user:pwd"格式
secrets file = /etc/rsync.password

###############################################
[backup]#backup是模塊的名稱,後面傳遞過程中使用
comment = backup by sherwin 13:41 2019-3-29
#該模塊存放文件的基礎路徑
path = /home/sherwin/backup

3、啓動服務
創建好配置文件後,使用如下命令啓動與查看

[root@servicel06 /]# rsync --daemon
failed to create pid file /var/run/rsyncd.pid: File exists	//這是已經有一個rsync服務起來
[root@servicel06 /]# pkill rsync	//使用pkill命令殺死進程
[root@servicel06 /]# 
[root@servicel06 /]# 
[root@servicel06 /]# rsync --daemon	//啓動服務
[root@servicel06 /]# ps -ef | grep rsync	//查看rsync進程
root     11321     1  0 16:22 ?        00:00:00 rsync --daemon
root     11341 20836  0 16:22 pts/3    00:00:00 grep rsync
[root@servicel06 /]#
[root@servicel06 /]# netstat -lntup | grep rsync	//查看rsync對應的端口有無起來
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      11321/rsync         
tcp        0      0 :::873                      :::*                        LISTEN      11321/rsync         
[root@servicel06 /]# lsof -i :873
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
rsync   11321 root    3u  IPv6 45884134      0t0  TCP *:rsync (LISTEN)
rsync   11321 root    5u  IPv4 45884135      0t0  TCP *:rsync (LISTEN)

4、創建rsync配套的虛擬用戶
檢查在配置文件中所寫的用戶是否存在,如果不存在則創建一個

#rsync運行權限爲sherwin							--配置文件中
uid = sherwin
#rsync運行權限爲sherwin
gid = sherwin
[root@servicel06 /]# useradd sherwin	 //使用useradd命令創建用戶;或者創建虛擬用戶 useradd sherwin 	-s /sbin/nologin
useradd: user sherwin exists
[root@servicel06 /]# id sherwin
uid=511(sherwin) gid=511(sherwin) groups=511(sherwin)
[root@servicel06 /]# 
[root@servicel06 /]# 

5、創建backup目錄(也就是要備份文件的目錄),並且修改目錄的所屬用戶爲sherwin,與配置文件中的uid、gid相同。

[root@servicel06 sherwin]# mkdir backup
[root@servicel06 sherwin]# ls -ld backup/
drwxr-xr-x 2 root root 4096 Apr  4 16:37 backup/
[root@servicel06 sherwin]#
[root@servicel06 sherwin]# chown -R sherwin backup/
[root@servicel06 sherwin]# ls -ld backup/
drwxr-xr-x 2 sherwin root 4096 Apr  4 16:37 backup/
[root@servicel06 sherwin]#
[root@servicel06 sherwin]# chgrp -R sherwin backup/
[root@servicel06 sherwin]# ls -ld backup/
drwxr-xr-x 2 sherwin sherwin 4096 Apr  4 16:37 backup/

6、配置客戶端登錄的用戶名跟密碼,並修改存儲密碼的文件權限爲600。(這個用戶名就是配置文件中 auth users)

#認證此模塊的用戶名/#授權遠程連接的用戶
auth users = sherwin
[root@servicel06 sherwin]# echo "sherwin:sherwin">>/etc/rsync.password //配置客戶端登錄用戶和密碼
[root@servicel06 sherwin]# cat /etc/rsync.password 
sherwin:sherwin
[root@servicel06 sherwin]# ll /etc/rsync.password 
-rw-r--r-- 1 root root 16 Apr  4 16:44 /etc/rsync.password
[root@servicel06 sherwin]# chmod 600 /etc/rsync.password //修改/etc/rsync.password密碼文件的權限爲600, 只允許root訪問
[root@servicel06 sherwin]# ll /etc/rsync.password 
-rw------- 1 root root 16 Apr  4 16:44 /etc/rsync.password
[root@servicel06 sherwin]# 

7、將“rsync --daemon”加入開機自啓動,修改/etc/rc.local文件

[root@servicel06 sherwin]# echo "rsync --daemon" >>/etc/rc.local
[root@servicel06 sherwin]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
/sbin/service crond start
touch /var/lock/subsys/local
echo deadline > /sys/block/sda/queue/scheduler
rsync --daemon --address=172.16.8.85  //綁定製定IP:172.16.8.85提供服務
rsync --daemon
[root@servicel06 sherwin]# 

8、同步安全優化(可選)

[root@servicel06 sherwin]# lsof -i :873	//查看873端口是否起來
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
rsync   11321 root    3u  IPv6 45884134      0t0  TCP *:rsync (LISTEN)
rsync   11321 root    5u  IPv4 45884135      0t0  TCP *:rsync (LISTEN)
[root@servicel06 sherwin]# netstat -lntup | grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      15038/rsync         
tcp        0      0 :::873                      :::*                        LISTEN      15038/rsync         
[root@servicel06 sherwin]# pkill rsync	//殺進程
[root@servicel06 sherwin]# rsync --daemon --address=172.16.8.85	//綁定指定IP:192.168.1.17提供服務
[root@servicel06 sherwin]# lsof -i :873
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
rsync   15113 root    3u  IPv4 45995034      0t0  TCP ssdb.readwrite.host:rsync (LISTEN)
[root@servicel06 sherwin]# netstat -lntup | grep rsync
tcp        0      0 172.16.8.85:873             0.0.0.0:*                   LISTEN      15113/rsync         
[root@servicel06 sherwin]# 

二、inotify + rsync 客戶端部署

1、配置客戶端密碼(登陸到rsync服務端的密碼)
就是在服務端配置密碼文件中的用戶名與密碼,後面在同步時直接使用文件,不需要再次輸入密碼。

[root@DF-Svr234 sherwin]# echo "sherwin">>/etc/rsync.password
[root@DF-Svr234 sherwin]# cat /etc/rsync.password 
sherwin
[root@DF-Svr234 sherwin]# chmod 600 /etc/rsync.password 
[root@DF-Svr234 sherwin]# ls -ld /etc/rsync.password 
-rw------- 1 root root 8 Apr  4 17:42 /etc/rsync.password
[root@DF-Svr234 sherwin]#

2、備份/home/sherwin/tmp/目錄下所有文件到服務端的backup/目錄下

[root@DF-Svr234 sherwin]# ll tmp/
total 0
[root@DF-Svr234 sherwin]# touch tmp/{a..f}
[root@DF-Svr234 sherwin]# ll tmp/
total 0
-rw-r--r-- 1 root root 0 Apr  4 17:49 a
-rw-r--r-- 1 root root 0 Apr  4 17:49 b
-rw-r--r-- 1 root root 0 Apr  4 17:49 c
-rw-r--r-- 1 root root 0 Apr  4 17:49 d
-rw-r--r-- 1 root root 0 Apr  4 17:49 e
-rw-r--r-- 1 root root 0 Apr  4 17:49 f
[root@DF-Svr234 sherwin]#  rsync -avz ./tmp/ [email protected]::backup --password-file=/etc/rsync.password	//push備份
sending incremental file list
./
a
b
c
d
e
f

sent 281 bytes  received 125 bytes  270.67 bytes/sec
total size is 0  speedup is 0.00
[root@DF-Svr234 sherwin]# 

3、檢查服務端backup目錄下的文件

[root@servicel06 backup]# ll
total 0
-rw-r--r-- 1 sherwin sherwin 0 Apr  4  2019 a
-rw-r--r-- 1 sherwin sherwin 0 Apr  4  2019 b
-rw-r--r-- 1 sherwin sherwin 0 Apr  4  2019 c
-rw-r--r-- 1 sherwin sherwin 0 Apr  4  2019 d
-rw-r--r-- 1 sherwin sherwin 0 Apr  4  2019 e
-rw-r--r-- 1 sherwin sherwin 0 Apr  4  2019 f
[root@servicel06 backup]# 

4、安裝inotify工具
inotify-tools下載地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
查看當前系統是否支持inotify

[root@DF-Svr234 sherwin]# uname -r	//內核版本,從kernel 12.6.13開始支持
2.6.18-409.el5
[root@DF-Svr234 sherwin]# ls -l /proc/sys/fs/inotify/		//查看是否支持
total 0
-rw-r--r-- 1 root root 0 Apr  8 09:17 max_queued_events
-rw-r--r-- 1 root root 0 Apr  8 09:17 max_user_instances
-rw-r--r-- 1 root root 0 Apr  8 09:17 max_user_watches
[root@DF-Svr234 sherwin]# 	//顯示當前三個文件表示支持

5、編譯安裝inotify

[root@DF-Svr234 sherwin]# ls -ld inotify-tools-3.14.tar.gz 
-rw-r--r-- 1 root root 358772 Mar 29 10:53 inotify-tools-3.14.tar.gz
[root@DF-Svr234 sherwin]# tar -zxvf inotify-tools-3.14.tar.gz 
[root@DF-Svr234 sherwin]# 
[root@DF-Svr234 sherwin]# cd inotify-tools-3.14
[root@DF-Svr234 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14
[root@DF-Svr234 inotify-tools-3.14]# make & make install
[root@DF-Svr234 inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify-tools	//創建軟連接
[root@DF-Svr234 inotify-tools-3.14]# ll /usr/local/
total 112
drwxr-xr-x 17 root root 4096 May 17  2016 anaconda2
drwxr-xr-x 17 root root 4096 May 16  2016 anaconda3
drwxr-xr-x  2 root root 4096 Nov  8 17:03 bin
drwxr-xr-x  2 root root 4096 May 11  2011 etc
drwxr-xr-x  2 root root 4096 May 11  2011 games
drwxr-xr-x  4 root root 4096 Nov  8 16:22 include
lrwxrwxrwx  1 root root   30 Mar 29 10:58 inotify-tools -> /usr/local/inotify-tools-3.14/
drwxr-xr-x  6 root root 4096 Apr  8 09:26 inotify-tools-3.14
drwxr-xr-x  6 root root 4096 Nov  8 17:03 lib
drwxr-xr-x  2 root root 4096 Jan 22  2018 lib64
drwxr-xr-x  3 root root 4096 Nov  8 15:42 libexec
drwxr-xr-x  3 root root 4096 Sep  5  2016 man
drwxr-xr-x  2 root root 4096 May 11  2011 sbin
drwxr-xr-x 11 root root 4096 Nov  8 17:03 share
drwxr-xr-x  2 root root 4096 May 11  2011 src
drwxr-xr-x  3 root root 4096 Nov  8 17:03 var
[root@DF-Svr234 inotify-tools-3.14]# 

提示編譯成功後生成4個目錄,分別是:

[root@DF-Svr234 local]# cd inotify-tools
[root@DF-Svr234 inotify-tools]# ll
total 16
drwxr-xr-x 2 root root 4096 Mar 29 10:57 bin		//inotify執行命令(二進制)
drwxr-xr-x 3 root root 4096 Mar 29 10:57 include 	//inotify程序所需要的頭文件
drwxr-xr-x 2 root root 4096 Mar 29 10:57 lib	//動態鏈接的庫文件
drwxr-xr-x 4 root root 4096 Mar 29 10:57 share	//幫助文檔
[root@DF-Svr234 inotify-tools]# 

工具集和介紹:
一共安裝了2個工具(命令),即inotifywait和inotifywatch
inotifywait:在被監控的文件或目錄上等待特定文件系統事件(open、close、delete等)發生,執行後處於阻塞狀態,適合在shell腳本中使用
inotifywatch:收集被監視的文件系統使用統計數據,指定文件系統事件發生的次數統計

6、一般工作中使用到:

[root@DF-Svr234 sherwin]# ./inotifywait  -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,create,move,delete,attrib,close_write /home/sherwin/tmp

“%y %m %d %H %M”----“年 月 日 小時 分鐘”
“%T %w %f”-----“時間 路徑 文件名” (%w%f 表達的是路徑+文件名,也就是絕對路徑)

通過腳本實時同步:

#!/bin/bash
inotify=/usr/local/inotify-tools/bin/inotifywait
$inotify  -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,create,move,delete,attrib,close_write /home/sherwin/tmp | while read events
do
        cd /home/sherwin/ &&
        rsync -avzP ./tmp/ --delete [email protected]::backup --password-file=/etc/rsync.password
        echo "'date + '%F%T'' new events: $events" >> /home/sherwin/rsync.log 2>&1
done

腳本作如下修改改進(可略過):

#!/bin/bash

inotify=/usr/local/inotify-tools/bin/inotifywait
path=/home/sherwin/tmp
backup_server=172.16.8.85

$inotify  -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,close_write $path | while read events

do
        cd $path &&\
        rsync -avzP ./ --delete sherwin@$backup_server::backup --password-file=/etc/rsync.password

        echo "new events: $events" >> /home/sherwin/rsync.log 2>&1
done

腳本改進,結合rsync的特性,分開判斷來實現一個目錄的增刪改查對應的操作:

#!/bin/bash
src=/home/sherwin/tmp                         	# 需要同步的源路徑
dst=backup                             			# 目標服務器上 rsync --daemon 發佈的名稱,rsync --daemon這裏就不做介紹了,網上搜一下,比較簡單。
rsync_passwd_file=/etc/rsync.password           # rsync驗證的密碼文件
ip1=172.16.8.85                 				# 目標服務器1
#ip2=192.168.0.19                		 		# 目標服務器2
user=sherwin                            		# rsync --daemon定義的驗證用戶名
inotify=/usr/local/inotify-tools/bin/inotifywait	# inotify目錄

cd ${src}                              			# 此方法中,由於rsync同步的特性,這裏必須要先cd到源目錄,inotify再監聽 ./ 才能rsync同步後目錄結構一致

$inotify -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # 把監控到有發生更改的"文件路徑列表"循環

do
        INO_EVENT=$(echo $file | awk '{print $3}')      # 把inotify輸出切割 把事件類型部分賦值給INO_EVENT
        INO_FILE=$(echo $file | awk '{print $4}')       # 把inotify輸出切割 把文件路徑部分賦值給INO_FILE
        echo "-------------------------------$(date)------------------------------------"
        echo $file
        #增加、修改、寫入完成、移動進事件
        #增、改放在同一個判斷,因爲他們都肯定是針對文件的操作,即使是新建目錄,要同步的也只是一個空目錄,不會影響速度。
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判斷事件類型
        then 
				echo "'date + '%F%T'' new events: $file" >> /home/sherwin/rsync.log 2>&1
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${dst}         # INO_FILE變量代表路徑哦  -c校驗文件內容
                 #仔細看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})變量 即每次只針對性的同步發生改變的文件的目錄(只同步目標文件的方法在生產環境的某些極端環境下會漏文件 現在可以在不漏文件下也有不錯的速度 做到平衡) 然後用-R參數把源的目錄結構遞歸到目標後面 保證目錄結構一致性
        fi
        #刪除、移動出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo "'date + '%F%T'' new events: $file" >> /home/sherwin/rsync.log 2>&1
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${dst}
                #看rsync命令 如果直接同步已刪除的路徑${INO_FILE}會報no such or directory錯誤 所以這裏同步的源是被刪文件或目錄的上一級路徑,並加上--delete來刪除目標上有而源中沒有的文件,這裏不能做到指定文件刪除,如果刪除的路徑越靠近根,則同步的目錄月多,同步刪除的操作就越花時間。這裏有更好方法的同學,歡迎交流。
        fi
        #修改屬性事件 指 touch chgrp chmod chown等操作
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo "'date + '%F%T'' new events: $file" >> /home/sherwin/rsync.log 2>&1
                if [ ! -d "$INO_FILE" ]                 # 如果修改屬性的是目錄 則不同步,因爲同步目錄會發生遞歸掃描,等此目錄下的文件發生同步時,rsync會順帶更新此目錄。
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${dst}            
                fi
        fi
done

腳本開機可以加入啓動:

[root@DF-Svr234 sherwin]# cat /etc/rc.local 
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/opt/sumscope/data-service/qpid/qpidd.sh
~                                                                                                          
[root@DF-Svr234 sherwin]# echo "/bin/sh /home/sherwin/inotify.sh &" >> /etc/rc.local
[root@DF-Svr234 sherwin]# 
提示:
一個& 代表從後臺開始運行該條命令。

關鍵參數調整優化:
在/proc/sys/fs/inotify目錄下有三個文件,對inotify機制有一定的限制
max_user_watches:設置inotifywait或inotifywatch命令可以監視的文件數量(單進程)
max_user_instances:設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數
max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。

[root@DF-Svr234 test]# cat /proc/sys/fs/inotify/max_user_watches 
8192
[root@DF-Svr234 test]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches 
[root@DF-Svr234 test]# cat /proc/sys/fs/inotify/max_user_watches              
50000000
[root@DF-Svr234 test]# cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@DF-Svr234 test]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events 
[root@DF-Svr234 test]# cat /proc/sys/fs/inotify/max_queued_events              
50000000
[root@DF-Svr234 test]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
[root@DF-Svr234 test]# 

7、測試:
客戶端:

腳本屬於開啓狀態:
[root@DF-Svr234 sherwin]# sh -x inotify.sh 
+ inotify=/usr/local/inotify-tools/bin/inotifywait
+ /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,create,move,delete,attrib,close_write /home/sherwin/tmp
+ read events
+ cd /home/sherwin/
+ rsync -avzP ./tmp/ --delete [email protected]::backup --password-file=/etc/rsync.password
sending incremental file list
./
deleting f
deleting e
deleting d
deleting c
deleting b
deleting a
1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=3/5)
2
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=2/5)
3
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=1/5)
4
           0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=0/5)

sent 201 bytes  received 87 bytes  192.00 bytes/sec
total size is 0  speedup is 0.00
+ echo ''\''date + '\''%F%T'\'''\'' new events: 08/04/19 09:55 /home/sherwin/tmp/1'
+ read events
+ cd /home/sherwin/
+ rsync -avzP ./tmp/ --delete [email protected]::backup --password-file=/etc/rsync.password
sending incremental file list

sent 54 bytes  received 8 bytes  124.00 bytes/sec
total size is 0  speedup is 0.00
+ echo ''\''date + '\''%F%T'\'''\'' new events: 08/04/19 09:55 /home/sherwin/tmp/1'
+ read events
+ cd /home/sherwin/
+ rsync -avzP ./tmp/ --delete [email protected]::backup --password-file=/etc/rsync.password
sending incremental file list
新打開客戶端的一個窗口,新建幾個目錄:
[root@DF-Svr234 sherwin]# cd tmp/
[root@DF-Svr234 tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Apr  4 17:49 a
-rw-r--r-- 1 root root 0 Apr  4 17:49 b
-rw-r--r-- 1 root root 0 Apr  4 17:49 c
-rw-r--r-- 1 root root 0 Apr  4 17:49 d
-rw-r--r-- 1 root root 0 Apr  4 17:49 e
-rw-r--r-- 1 root root 0 Apr  4 17:49 f
[root@DF-Svr234 tmp]# touch {1..4}
[root@DF-Svr234 tmp]# 

服務端:

服務端顯示如下:
[root@servicel06 backup]# ll
total 0
-rw-r--r-- 1 sherwin sherwin 0 Apr  8  2019 1
-rw-r--r-- 1 sherwin sherwin 0 Apr  8  2019 2
-rw-r--r-- 1 sherwin sherwin 0 Apr  8  2019 3
-rw-r--r-- 1 sherwin sherwin 0 Apr  8  2019 4
[root@servicel06 backup]# 

三、參考文檔

inotify+rsync實現實時同步部署
rsync同步架構
rsync 簡介
linux inotify-tools 安裝
Rsync 故障排查整理
真正的inotify+rsync實時同步 徹底告別同步慢

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