Skip to content

rsync

rsync是Linux系统下的数据镜像备份工具,使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cpmv命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。

1. 安装

危险

远程复制文件时,必须在两台服务器同时安装 rsync才能正常进行同步

shell
sudo yum install rsync
shell
sudo apt-get install rsync
shell
sudo pacman -S rsync
shell
进入下载页面 https://download.samba.org/pub/rsync/binaries/
[root@more ~]# tar xvf latest.tar.gz 
usr/
usr/local/
usr/local/share/
usr/local/share/man/
usr/local/share/man/man1/
usr/local/share/man/man1/rsync.1
usr/local/share/man/man1/rsyncd.conf.5
usr/local/share/man/man1/rsync-ssl.1
usr/local/share/man/man5/
usr/local/share/doc/
usr/local/share/doc/README.md
usr/local/share/doc/NEWS.md
usr/local/share/doc/COPYING
usr/local/bin/
usr/local/bin/rsync-ssl
usr/local/bin/rsync
[root@more ~]# mv ./usr/local/bin/ /usr/local/rsync
[root@more ~]# ln -s /usr/local/rsync/rsync /usr/local/bin/

2. 基本用法

首先我们需要认识一下常用的参数以及格式

格式

  • 本地同步

    shell
    rsync [OPTION]...  SRC [SRC]...  DEST
  • 上传/推送

    shell
    rsync [OPTION]...  SRC [SRC]...  [USER@]HOST:DEST
    rsync [OPTION]...  SRC [SRC]...  [USER@]HOST::DEST
    rsync [OPTION]...  SRC [SRC]...  rsync://[USER@]HOST[:PORT]/DEST
  • 下载/拉取

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

常用选项:

注意,此处选项仅个人认为常用的选项,完整请使用 rsync -h命令查看

选项作用
--verbose, -v增加输出的详细程度
--stderr=e/a/c更改标准错误输出模式(默认:错误)
--archive, -a归档模式为-rlptgoD(不包括-A,-X,-U,-N,-H)
--recursive, -r递归进入目录
--links, -l复制符号链接作为符号链接
--perms, -p保留权限
--group, -g保留组
--owner, -o保留所有者(超级用户)
--acls, -A保留ACL(隐含--perms)
--update, -u跳过接收端中更新的文件
-D保存特殊文件、保存设备文件(仅限超级用户)
--times, -t保存修改时间。
--crtimes, -N保存创建时间(新鲜度)。
--delete删除来自目标目录的多余文件
--compress, -z在传输过程中压缩文件数据--compress-choice=STR 选择压缩算法(也称为--zc)
--compress-level=NUM明确设置压缩级别(也称为--zl)
--backup, -b创建备份(请参见--suffix 和 --backup-dir)
--backup-dir=DIR在DIR目录下创建备份的层次结构
--suffix=SUFFIX备份后缀名(默认值为不带--backup-dir的~)
--itemize-changes, -i输出所有更新的变更摘要。
--progress显示传输过程中的进度
-P显示传输过程中的进度,保留部分传输的文件
--max-size=SIZE传输忽略大于SIZE的文件:--max-size='100K'
--min-size=SIZE传输忽略小于SIZE的文件:--min-size='100K'
--bwlimit=500在同步过程中限制带宽使用率为 500 KB/s
--bwlimit=KBPS限制带宽使用率,以 KB/s 为单位

3. 同步操作

3.1 模拟同步

如果不确定 rsync 执行后会产生什么结果,可以先用-n--dry-run参数模拟执行的结果。

shell
rsync -anv source/ destination

3.2 保持相同

默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用--delete参数,这将删除只存在于目标目录、不存在于源目录的文件。

shell
rsync -av --delete source/ destination

3.3 排除文件

  • *.log来排除所有以".log"结尾的文件

  • temp*/来排除以"temp"开头的目录。

  • dir1/*排除目录内所有文件,目录本身不排除

有时,我们希望同步时排除某些文件或目录,这时可以用--exclude参数指定排除模式。例如排除了所有 TXT 文件。

shell
rsync -av --exclude='*.txt' source/ destination

如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样。

shell
rsync -av --exclude 'dir1/*' source/ destination

多个排除模式,可以用多个--exclude参数

shell
rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination

多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个--exclude参数。

shell
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination

如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件。

创建exclude-file.txt文件,内容如下

txt
tmp/
logs/
*.log
shell
rsync -av --exclude-from='exclude-file.txt' source/ destination

4. 免密传输

4.1 ssh免密:

此处就不赘述了,标准的ssh免密登录即可

4.2 使用rsync服务方式进行同步免密

rsyncd.conf文件是作为 rsync 守护进程运行时的 rsync 配置文件,可控制身份验证、访问、日志记录和可用模块。

创建配置文件,例如:/usr/local/rsync/config/rsyncd.conf,配置详细说明请参考官方文档

ini
# 注释: #号开头的会被忽略
# 一行一个键值对,格式为:name=value 一行仅能写一个name=value
# 类似 ini 配置文件格式
# 布尔值表示为 yes/no、0/1 或 true/false

# 此参数允许您指定要在每次连接时向客户端显示的“每日消息”(MOTD)。这通常包含网站信息和任何法律声明。默认值为无 MOTD 文件。在启动守护进程时, --dparam=motdfile=FILE 命令行选项可以覆盖此内容。
motd file =
# 指定守护程序进程ID文件,一般可以不配置,启动守护程序时, --dparam=pidfile=FILE 命令行选项可以覆盖文件名。
pid file = 
# 您可以通过指定此值(默认为 873)来覆盖守护程序将侦听的默认端口。可被 --port 命令行选项取代。
port = 

# 您可以通过指定此值来覆盖守护程序将侦听的默认 IP 地址。如果守护进程由 inetd 运行,则会忽略此值,并被 --address 命令行选项取代。
address = 


uid = 
gid = 
max connections = 
log file = 




# 注意 上面是全局专属的部分变量,模块的变量也可以在全局定义,模块的名称不能为 [global]



# 定义一个模块,名称随便起
[Module]
# 此参数指定一个描述字符串,当客户端获取可用模块的列表时,该字符串将显示在模块名称旁边
comment = 
# 此参数指定守护进程文件系统中要在此模块中可用的目录。您必须为每个模块指定此参数
path = 
# 如果 “use chroot” 为 true,则 rsync 守护进程将在开始与客户端进行文件传输之前 chroot 到“path”。这样做的优点是可以防止可能的实现安全漏洞,但它的缺点是需要超级用户权限,无法跟踪绝对或位于新根路径之外的符号链接,以及使按名称保存用户和组变得复杂
use chroot = 

# 此参数允许您指定与连接客户端的主机名和 IP 地址匹配  空格分隔。如果所有模式都不匹配,则连接将被拒绝
# 逗号和空格分隔模式的列表
hosts allow =192.168.1.1 192.168.0/24 172.16.1.0/255.255.255.0

# 此参数允许您指定与连接客户端的主机名和 IP 地址匹配  空格分隔。如果模式匹配,则连接将被拒绝
hosts deny =
# 不存在的用户 自己定义,多个用户 空格分割
# 可以在冒号 (:) 之后指定选项。这些选项允许您“拒绝”用户或组,将访问权限设置为“ro”(只读),或将访问权限设置为“rw”(读/写) deny:拒绝所有
# 您还可以通过“@”前缀指定组名匹配。使用组名匹配时,身份验证用户名必须是系统上的真实用户,否则将假定为任何组的成员
auth users = susan:ro joe:rw sam:deny
# 用户认证文件
secrets file =

创建/etc/systemd/system/rsync.service文件

ini
[Unit]
Description=rsync service
After=network.target

[Service]
User=root
WorkingDirectory=/usr/local/rsync
ExecStart=/usr/local/rsync/rsync --daemon --no-detach --config=/usr/local/rsync/config/rsyncd.conf
Restart=on-failure
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

5. 实时同步文件inotify

安装Inotify-tools

源码下载地址

shell
sudo yum install -y  inotify-tools
shell
sudo apt-get install -y  inotify-tools
shell
yum install -y autoconf automake libtool autotools-dev
tar xvf inotify-tools-xxxx.tar.gz
cd inotify-tools-xxxx
./autogen.sh
./configure --prefix=/usr/local/inotify/
make&&make install
ln -s /usr/local/inotify/bin/inotifywait /usr/local/bin/
ln -s /usr/local/inotify/bin/inotifywatch /usr/local/bin/

用法: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

-e|--event :监听特定的事件。如果省略,则监听所有事件

Events :例如:-e modify,create,delete,move

参数作用
access访问文件或目录内容
modify文件或目录内容被写入
attrib文件或目录属性已更改
close_write文件或目录在以可写模式打开后关闭
close_nowrite文件或目录在以只读模式打开后关闭
close文件或目录关闭,无论读/写模式
open打开的文件或目录
moved_to文件或目录移动到监视目录
moved_from文件或目录从监视目录移动
move文件或目录移动到监视目录或从监视目录移除
move_self被监视的文件或目录被移动。
create在被监视目录内创建的文件或目录
delete文件或目录删除在监视目录
delete_self删除文件或目录
unmount文件系统包含文件或目录卸载

一个简单的实时监控脚本

shell
#!/bin/sh
while ! inotifywait -e modify /var/log/messages; do
  echo ""
done