介绍

Linux rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具。Rsync默认监听TCP 873端口,必须在远程和本地系统上都安装 rsync 才可以使用。

我们把使用 rsync --daemon 启动的那一端称为远程端,执行同步命令的服务器称为本地端。

同步方式包括同步到远程端和从远程端同步到本地端这两种方式。

语法

rsync -参数 用户名@同步服务器的IP::rsyncd.conf中那个方括号里的内容 本地存放路径
例如:rsync -avzP nemo@192.168.10.1::nemo /backup

-a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;

常用选项

最常用的是 ​​rsync -avz​​ ,其他常用选项说明如下(非全部):

-a 包含-rtplgoD
-r 同步目录时要加上,类似cp时的-r选项
-v 同步时显示一些信息,让我们知道同步的过程
-l 保留软连接
-L 加上该选项后,同步软链接时会把源文件给同步
-p 保持文件的权限属性
-o 保持文件的属主
-g 保持文件的属组
-D 保持设备文件信息
-t 保持文件的时间属性
--delete 删除DEST中SRC没有的文件
--exclude 过滤指定文件,如--exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步
-P 显示同步过程,比如速率,比-v更加详细
-u 加上该选项后,如果DEST中的文件比SRC新,则不同步
-z 传输时压缩

安装

1、安装 rsync 和 xinetd

yum install -y rsync xinetd

2、关闭防火墙和selinux

# 关闭防火墙
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service
# 设置 SELINUX=disabled
setenforce 0 && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

3、启动并检查 xinetd

systemctl enable xinetd.service
systemctl start xinetd.service
systemctl status xinetd.service

创建用户

创建 rsync 这个用户,不创建 home 目录,不可以登录系统

useradd -s /sbin/nologin -M rsync

配置文件

1、修改配置文件 ​​/etc/rsyncd.conf​​,如下示例

# 以rsync用户身份来传输数据
uid = rsync
# 以rsync用户组来传输数据
gid = rsync
# 监听端口默认873
port = 873
# use chroot = yes
# 最大可连接客户端数
max connections =2000
# 超时时间(秒)
timeout = 600
# rsync进程pid存放文件
pid file = /var/run/rsyncd.pid
# 锁文件
lock file = /var/run/rsync.lock
# 日志文件
log file = /var/log/rysnc.log
# 忽略错误
ignore errors
# 可读写
read only = false
# 不允许列出模块名称
list = false
# 监听内网rsync服务端地址
# address = 172.168.100.30
# 允许传输网段,默认不限制
# hosts allow = 172.168.100.0/24
# 拒绝传输网段,一般不使用
# hosts deny = 0.0.0.0/32

# 指定rsync虚拟用户,与系统用户无关,客户端同步文件时的账号
auth users = rsync_backup
# rsync 虚拟用户的密码文件,远程端文件内容为“账号:密码”,本地端的文件内容为“只有密码没有账号”
secrets file = /etc/rsync.passwd

# 设置为 yes 的意思是让 rsync daemon “模拟” super用户,在 rsync daemon 以非root用户启动时(例如本例使用rsync用户启动),即便接收到了超出自己权限的文件,也能把文件的权限 /owner/group 等信息保存下来(同步到daemon端的文件使用ll查看的文件所有者是daemon的启动用户),就是把上述属性写到文件的 xattr 里,在文件被取回的时候再还原。
fake super = yes

# 备份模块的目录配置(配置多个一直往下写即可),上面的很多属性也可以写在下面模块中,模块中的优先级高于上面的全局配置
[backup_gitlab]
path = /opt/backups/gitlab

[backup_mysql]
path = /opt/backups/mysql

2、创建账户密码配置文件 ​​/etc/rsync.passwd​​,,本地端的文件内容为“只有密码没有账号”,如下示例

a) 远程端(即daemon端)文件内容为“账号:密码”

rsync_backup:123456

b) 本地端(即执行rsync命令的)文件内容只有密码

123456

3、为密码文件设置600权限

chmod 600 /etc/rsync.passwd

注:本地端和远程端的区别有三点
1、本地端没有备份目录模块配置,就是中括号那个
2、本地端的密码文件中没有用户名(用户名在rsync命令中体现)
3、远程端需要使用 rsync --daemon 命令启动,本地端不需要启动服务直接执行命令即可

创建path指向的目录(远程端)

创建存放备份文件的目录,并授权给配置文件中的 rsync 用户

# 创建目录
mkdir -p /opt/backups/gitlab
# 设置目录的所有者(和配置文件中uid和gid一致)
chown -R rsync:rsync /opt/backups/gitlab

启动服务

远程端需要使用 ​​rsync --daemon​​ 命令启动 rsync 服务(并检查端口和服务是否正常),本地端则不需要。

[root@shanhy ~]# rsync --daemon
[root@shanhy ~]# ss -lntp |grep 873
LISTEN 0 5 *:873 *:* users:(("rsync",pid=5223,fd=3))
LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=5223,fd=5))
[root@shanhy ~]# ps aux |grep rsync
root 5223 0.0 0.0 114844 536 ? Ss 15:53 0:00 rsync --daemon
root 8863 0.0 0.0 112812 968 pts/1 S+ 17:43 0:00 grep --color=auto rsync

文件同步(在本地端服务器操作)

1、在本地端执行命令,将文件同步推送到远程端

# 使用 --delete 参数进行无差异备份数据
rsync -avz --delete --password-file=/etc/rsync.passwd /opt/fff/ttt rsync_backup@192.168.100.111::backup_gitlab

特别说明:文件发送到服务端后,文件的所有者显示的是 rsyncd.conf 上设定的用户和用户组,rsync 会记录文件的原始所有者。文件的所有者信息在客户端使用rsync取回后,在查看取回的文件信息就是同步上送前的信息了。

2、在本地端执行命令,将文件从远程端同步拉取到本地端

rsync -avz --password-file=/etc/rsync.passwd rsync_backup@192.168.100.111::backup_gitlab /opt/test/

如果你的目的只是为了一次性将A服务器的一个文件夹完整传输到B服务器,而不是备份目时,为了能保持文件所有者属性的正常传输还原,操作方式应该是:
1、A服务器是启动 rsync --daemon 的服务端。
2、B服务器作为 rsync 客户端,使用同步取回文件的方式来操作即可。

3、在本地端执行命令,将文件从一个文件夹同步到本地另外一个文件夹

rsync -avz --delete /opt/src/ /opt/dest/

参数说明:
1、-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
2、-v, --verbose 详细模式输出
3、-z, --compress 对备份的文件在传输时进行压缩处理
4、–delete 是删除DEST中SRC没有的文件,执行同步后使两边文件保持一致(无差异备份数据)

补充

可以基于 inotify + rsync 来实现两个目录的实时同步,inotify 监听文件变动来触发 rsync 同步命令的执行。


(END)