当前位置: 首页 > 工具软件 > inotify-java > 使用案例 >

rsync + inotify-tools

濮阳原
2023-12-01

rsync

什么是rsync

rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。

运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。Rsync可以搭配ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。

基本特点:

  1. 可以镜像保存整个目录树和文件系统;
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等;
  3. 无须特殊权限即可安装;
  4. 优化的流程,文件传输效率高;
  5. 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
  6. 支持匿名传输。

命令语法:
rsync的命令格式可以为以下六种:
 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有2种不同的工作模式:

  • shell模式:使用远程shell程序(如ssh或rsh)进行连接。当源路径或目的路径的主机名后面包含一个冒号分隔符时使用这种模式,rsync安装完成后就可以直接使用了,无所谓启动。(目前没有尝试过这个方法)
  • daemon模式:使用TCP直接连接rsync daemon。当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时使用这种模式,无需远程shell,但必须在一台机器上启动rsync daemon,默认端口873,这里可以通过rsync --daemon使用独立进程的方式,或者通过xinetd超级进程来管理rsync后台进程。

当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口,或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日志和lock file的权限。当rsync以daemon模式运行时,它还需要一个配置文件——rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。

我们一般把DEST远程服务器端成为rsync Server,运行rsync命令的一端SRC称为Client。

安装:

rsync在CentOS6上默认已经安装,如果没有则可以使用yum install rsync -y,服务端和客户端是同一个安装包。

# rsync -h

rsync选项:

-p:复制文件过程中,保持文件的属性不变
-v:显示复制过程信息
-a:使用归档模式(如果复制目录必须使用此选项)
-r:递归复制
-z:在传输过程中,以压缩方式进行传输
-e "ssh [-p22]":指定所使用的传输通道

模式一:local

格式:rsync [OPTION...] SRC... [DEST]
#rsync 源目录 目标目录
rsync /etc/yrz.java /tmp/
	-p:复制文件过程中,保持文件的属性不变
	-v:显示复制过程信息
	-a:使用归档模式(如果复制目录必须使用此选项)
	-z:在传输过程中,以压缩方式进行传输

模式二:Access via remote shell

格式:
	Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
	Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
	
[root@iZwz984mbcsaw10myjq9s4Z /]# mkdir /home/dir1
[root@iZwz984mbcsaw10myjq9s4Z /]# touch /home/dir1/{1..10}.txt
[root@iZwz984mbcsaw10myjq9s4Z /]# rsync -avc -e "ssh" /home/dir1/* root@10.0.0.5:/tmp/

模式三:daemon(守护进程模式)

准备:
	关闭selinux
	关闭防火墙
	配置时间同步
第一步:配置backup上的rsync,让其工作在守护进程模式(配置服务器端)
1)修改配置文件
vim /etc/rsyncd.conf

uid=root
gid=root
use chroot=yes
max connections=100
timeout=600
strict modes=yes
port=873
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
log file=/var/log/rsyncd.log

[module_test]
path=/tmp/rsync_bak2
comment=rsync test logs
auth users=sean
secrets file=/etc/rsyncd.secrets
read only=no
write only=yes
list=no

2)创建目录
[root@iZwz984mbcsaw10myjq9s4Z /]# mkdir -pv /tmp/rsync_bak2
mkdir: created directory ‘/tmp/rsync_bak2’

3)创建运行rsync的系统用户
[root@iZwz984mbcsaw10myjq9s4Z /]# grep rsync /etc/passwd
[root@iZwz984mbcsaw10myjq9s4Z /]# groupadd -r rsync 
[root@iZwz984mbcsaw10myjq9s4Z /]# useradd -r -s /sbin/nologin -g rsync rsync

4)启动rsync
rsync --daemon

5)检查rsync的端口(默认873)
ss -ntl | grep 873
LISTEN     0      5            *:873                      *:*                  
LISTEN     0      5         [::]:873                   [::]:* 

6)创建虚拟用户文件,以及相关的虚拟用户
vim /etc/rsyncd.secrets
	sean:123
	:wq
chmod 600 rsyncd.secrets

7)客户端发送文件测试
[root@node etc]# rsync -avz --password-file=/etc/rsync_client.pwd /home sean@47.106.193.187::module_test
sending incremental file list

sent 147,086 bytes  received 774 bytes  295,720.00 bytes/sec
total size is 326,311,111  speedup is 2,206.89

inotify-tools

什么是inotify

inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

CentOS6自然已经支持:
使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。

total 0
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_queued_events
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_instances
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_watches

安装inotify-tools

yum install inotify-tools -y

监控/root/tmp目录文件的变化:

/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' -e modify,delete,create,move,attrib /root/tmp/

上面的命令表示,持续监听/root/tmp目录及其子目录的文件变化,监听事件包括文件被修改、删除、创建、移动、属性更改,显示到屏幕。执行完上面的命令后,在/root/tmp下创建或修改文件都会有信息输出。

详细参数

/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' -e modify,delete,create,move,attrib /test
参数说明
-m持续监听
-r使用递归形式监视目录
-q减少冗余信息,只打印出需要的信息
-d以守护进程的方式来运行(后台)
-e指定要监视的事件,多个时间使用逗号隔开
-s将错误信息输出到系统日志中
-o file将监控到的时间输出到一个文件中
–excludei忽略文件的大小写
-e 指定要监控的事件
–timefmt时间格式
–format监听到的文件变化的信息

–timefmt 说明:Ymd分别表示年月日,H表示小时,M表示分钟

–format 说明:%w 表示发生事件的目录;%f 表示发生事件的文件;%e 表示发生的事件%Xe 事件以“X”分隔;%T 使用由–timefmt定义的时间格式

可监控的事件:

access 访问,读取文件。
modify 修改,文件内容被修改
attrib 属性,文件元数据被修改。
move 移动,对文件进行移动操作。
create 创建,生成新文件
open 打开,对文件进行打开操作
close 关闭,对文件进行关闭操作。
delete 删除,文件被删除。

客户端同步到远程的脚本rsync.sh

#!/bin/bash
#
prog="inotifywait"
events="create,delete,modify,attrib"
iopt="-mrq"

lpath="/test"

rhost="47.106.193.187"
vuser="xue"
secfile="/etc/rsyncd.sercrets"
ropt="-az"
modName="module_xue"

$prog $iopt --format "%w%f" -e $events $lpath | while read line 
do
	echo $line
	sleep 3
	rsync $line $vuser@$rhost::$modName --password-file=$secfile
done

[root@master bin]# bash rsync.sh

 类似资料: