Rsync 是一个远程数据同步工具,使用 Rsync 算法同步本地和远程主机之间的文件。
1. 服务介绍
Rsync
本来是用于替代 scp
的一个非常有名的同步工具,目前是由 samba
软件基金会来维护和管理的,所以其配置文件 rsync.conf
的格式非常类似于 samba
的主配置文件格式。该同步工具可以通过 rsh
或 ssh
协议来使用,也能以 daemon
模式去运行,在以daemon
方式运行时 rsync server
会打开并监听一个 873
端口,等待客户端去连接。连接时,rsync server
会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
Rsync
的几大特性如下:
- 可以镜像保存整个目录树和文件系统
- 可以很容易做到保持原来文件的权限、软硬链接等信息
- 无需特殊权限即可安装,非常方便和快捷
- 支持匿名传输,以方便进行网站镜象
- 可以使用
scp
、ssh
等方式来传输文件,当然也可以通过socket
连接 - 在传输数据的过程中实行压缩及解压缩操作节省带宽,同时也支持增量同步
Rsync
支持大多数的类 Unix
系统,无论是 Linux
、Solaris
还是 BSD
上都经过了良好的测试。此外,它在 windows
平台下也有相应的版本,如 cwrsync
和 Sync2NAS
等工具。
# 配置文件
/etc/rsyncd.conf
# 授权用户信息
/etc/rsync.passwd
# 配置文件模板路径(有可能没有)
/usr/share/doc/rsync-3.1.2/example/rsyncd.conf
2. 服务端配置
- [1] 服务配置文件 - rsyncd.conf
[root@b8013bede7b9 ~]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# 运行rsync守护进程的用户和组
uid = root
gid = root
# 不使用chroot功能
use chroot = yes
# 设置最大连接数
max connections = 4
# 是否检查口令文件的权限
strict modes = yes
# 设置rsync守护进程运行的端口,默认为873端口
port = 873
# 设置PID/锁文件/日志文件的存放位置
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
# 超时时间,单位为秒
timeout = 900
# 同步的时候排错那些文件,多个有空格分隔即可
exclude = lost+found/
# 使服务器使用记录下载和上载操作在自己单独的日志中
transfer logging = yes
# 设定日志格式
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
# 设定rysnc服务器忽略那些没有访问文件权限的用户
ignore nonreadable = yes
# 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# 设置模块名称,用于同步的时候使用
[backup]
# 指定共享文件路径、注释信息、权限、是否可列出
path = /data/app/backup
comment = "backup export area"
# 同步的时候需要将其修改为no,否则无法上传同步操作
read only = yes
list = yes
# 密码和用户名对比表,密码文件自己生成
secrets file = /etc/rsync.passwd
# 认证的用户名,服务器必须存在这个系统用户,多个由逗号或者空格分隔
# 如果没有这行则表明是匿名,此用户与系统无关
auth users = escape
# 可以忽略一些无关的IO错误
ignore errors
# 允许主机
hosts allow = 192.168.1.1,10.10.10.10
# 禁止主机
hosts deny = 0.0.0.0/0
transfer logging = yes
- [2] 服务运行方式 - xinetd
# 方式一
/usr/local/rsync/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
# 方式二
配合将其添加到xinet服务列表中,集中进行管理
# 安装rsync和xinetd服务
$ sudo apt install rsync xinetd
# 修改xinetd管理rsync的配置文件
$ cat /etc/xinetd.d/rsync
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon --config=/etc/rsyncd/rsynd.conf
log_on_failure += USERID
}
# 生效配置
$ sudo service xinetd start
$ /etc/init.d/xinetd reload
# 启动服务与自启动
$ sudo chkconfig rsync on
- [3] 服务端密码文件 - rsync.passwd
# 文件权限一定要是600的权限,否则会报错
[root@b8013bede7b9 ~]# cat /etc/rsync.passwd
user:password
escape:123456
- [4] 可配置环境信息 - rsyncd.motd
# 文件权限一定要是600的权限,否则会报错
[root@b8013bede7b9 ~]# cat /etc/rsyncd.motd
Welcome to escape the rsync services!
3. 同步配置方式
- [1] 客户端设置密码
# 设置密码
echo 123456 > /etc/rsync.password
# 文件的权限必须为 600
chmod 600 /etc/rsync.password
- [2] 从服务端获取配置文件
# 会删除/homt/app下的所有文件
$ rsync -vzrtopg --progress \
--delete --password-file=/etc/rsync.password \
[email protected]::backup /home/app
# 使用ssh协议进行文件的传输
$ rsync -avz --progress \
-e 'ssh -p 1234' --delete \
--password-file=/etc/rsync.password \
[email protected]:/www/data /home/nginx/data
- [3] 向服务端上传配置文件
# 目录带有/的话,表示备份该目录下的所有文件但不会创建该目录
# 目录带有/的话,则表示会创建该目录
$ rsync -vzrtopg --progress \
--password-file=/etc/rsync.password \
/home/app [email protected]::backup
# 使用ssh协议进行文件的传输
$ rsync -avz --progress \
-e 'ssh -p 1234' /home/nginx/data
--password-file=/etc/rsync.password \
[email protected]:/www/data --exclude nginx/logs
- [4] 添加防火墙规则
# 开启防火墙873端口的外部访问
$ iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
# 重启防火墙使得设置生效
$ systemctl reload iptables
# 开启防火墙873端口的外部访问
$ firewall-cmd --zone=public --add-port=873/tcp --permanent
# 重启防火墙使得设置生效
$ firewall-cmd --reload
4. 设置 SSH 无密码同步
- [1] 本地服务器
# 本地指定用户创建SSH的公私秘钥
$ ssh-keygen -t rsa -b 2048 -f /home/thisuser/cron/thishost-rsync-key
# 复制对应用户的公钥到远程主机上
$ scp /home/thisuser/cron/thishost-rsync-key.pub remoteuser@remotehost:/home/remoteuser/
- [2] 远程服务器
# 将复制的用户公钥加入信任列表中
$ if [ ! -d .ssh ];then mkdir .ssh; chmod 700 .ssh; fi
$ mv thishost-rsync-key.pub .ssh/
$ cd .ssh/
$ if [ ! -f authorized_keys ];then touch authorized_keys; chmod 600 authorized_keys; fi
$ cat thishost-rsync-key.pub >> authorized_keys
- [3] 文件同步命令
# 可以将其加入crontab列表中定是执行
$ rsync -avz -e \
"ssh -i /home/thisuser/cron/thishost-rsync-key" \
remoteuser@remotehost:/remote/dir /this/dir/