搭建rsync服务来同步配置
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
[[email protected] ~]# 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的权限,否则会报错 [[email protected] ~]# cat /etc/rsync.passwd user:password escape:123456
- [4] 可配置环境信息 - rsyncd.motd
# 文件权限一定要是600的权限,否则会报错 [[email protected] ~]# 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 [email protected]:/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" [email protected]:/remote/dir /this/dir/