linux系统rsync命令
1.修改环境变量,实现免密传输
export RSYNC_PASSWORD=123
## 修改环境变量之前是这样传输
[root@web01 ~]# rsync -avz /etc/passwd wzh_bak@10.0.0.41::wzh --password-file=/etc/rsync.pass
## 修改环境变量之后就变成了这样
[root@web01 ~]# rsync -avz /etc/passwd
wzh_bak@10.0.0.41::wzh
2.无差别同步
## 需要用到--delete选项
#首先创建出一个目录,里面加入文件
[root@web01 ~]# mkdir /222
[root@web01 ~]# mv 1.txt /222/
[root@web01 ~]# ll /222
total 4
-rw-r--r-- 1 root root 4 May 7 22:23 1.txt
##把backup服务器无差异同步到创建出的目录里
[root@web01 ~]# rsync -avz --delete wzh_bak@10.0.0.41::wzh /222
receiving incremental file list
deleting 1.txt
./
passwd
nfs_172.16.1.31_2020-05-25/
nfs_172.16.1.31_2020-05-25/2020-05-25_etc.tar.gz
nfs_172.16.1.31_2020-05-25/jy.md5
web02_172.16.1.8_2020-05-07/
web02_172.16.1.8_2020-05-07/2020-05-07_etc.tar.gz
web02_172.16.1.8_2020-05-07/jy.md5
sent 146 bytes received 19,928,843 bytes 7,971,595.60 bytes/sec
total size is 20,325,848 speedup is 1.02
[root@web01 ~]# ll /222/
total 4
drwxr-xr-x 2 root root 49 May 25 2020 nfs_172.16.1.31_2020-05-25
-rw-r--r-- 1 root root 1022 May 7 17:58 passwd
drwxr-xr-x 2 root root 49 May 7 20:47 web02_172.16.1.8_2020-05-07
##同步完成后可以看到之前客户端目录中的1.txt文件没有了,这是因为服务端的目录里面没有这个文件,我们和服务端同步所以里面的内容就和服务端一样,1.txt数据丢失了
3.限制I/O读写速度,可以理解为限速
##主要是用到了--bwlimit=选项
[root@web01 ~]# rsync -avz --bwlimit=1 wzh_bak@10.0.0.41::wzh /222
4.脚本执行(客户端)
## 脚本开头 #!/bin/bash作用是解释器告诉我们这个脚本使用/bin/bash解释执行
#设置环境变量
export RSYNC_PASSWORD=123
#设置普通变量
D=$(date +%F)
IP=$(ifconfig eth1|awk 'NR==2 {print $2}')
H=$(hostname)
bk_dir=/backup
local_dir=/backup/${H}_${IP}_${D}
#判断目录存在如果不存在则创建
if [ ! -d $local_dir ] ; then
mkdir -p $local_dir
fi
#客户端本地打包备份至上面创建的目录下
tar zcPf ${local_dir}/${D}_etc.tar.gz /etc
#生成校验码
md5sum ${local_dir}/${D}_etc.tar.gz
>${local_dir}/jy.md5
#将备份的数据推送到本地服务器目录
rsync -avz $local_dir wzh_bak@10.0.0.41::wzh
#只保留七天内的备份数据其他删除
cd / && \
find /backup/ -type d ! -mtime -7 ! -name 'backup' |xargs rm -rf
5.加入定时任务(客户端)
#每天凌晨一点打包/etc目录并传输到backup服务器 by:王张行
00 1 * * * /bin/sh /root/bf.sh &>/dev/null
6.服务端配置
1.邮箱配置
## 下载mailx
[root@backup backup]# yum install -y mailx
下载完成修改配置文件并手机打开邮箱账户通过手机短信方式
获取授权码
#发件人
set from=714845658@qq.com
#邮件服务器
set smtp=smtp.qq.com
#发件人用户名
set smtp-auth-user=714845658@qq.com
#发件人密码(QQ邮箱不可以使用密码,只能使用授权码)
set smtp-auth-password=xxx
#登录方式
set smtp-auth=login
#邮件服务器协议及端口
set smtp=smtps://smtp.qq.com:465
#忽略证书
set ssl-verify=ignore
#指定证书位置
set nss-config-dir=/root/.certs
##########下面是获取证书############
第一步:mkdir -p /root/.certs
第二步:cd ./.certs/
第三步: echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
第四步:certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
第五步: certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
第六步: certutil -L -d /root/.certs
第七步:certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs -i ~/.certs/qq.crt
########获取证书之后发测试邮件#########
echo wzh |mail -s '测试邮件' 714845658@qq.com
2.服务端配置文件
安装rsync
yun install -y rsync
## 安装完成修改配置文件,一般配置文件是以.conf 或 .cnf 或 .cfg结尾
[root@backup ~]# vim /etc/rsyncd.conf
## 指定进程启动uid
uid = rsync
## 指定进程启动gid
gid = rsync
## rsync服务的端口
port = 873
## 无需让rsync以root身份运行,允许接收文件的完整属性
fake super = yes
## 禁锢指定的目录
use chroot = no
## 最大连接数
max connections = 200
## 超时时间
timeout = 600
## 忽略错误
ignore errors
## 不只读(可读可写)
read only = false
## 不允许别人查看模块名
list = false
## 传输文件的用户
auth users = wzh_bak
## 传输文件的用户和密码文件
secrets file = /etc/rsync.passwd
## 日志文件
log file = /var/log/rsyncd.log
#####################################
## 模块名
[wzh]
## 注释,没啥用
comment = 123
## 备份的目录
path = /backup
# 3.根据配置文件内容,创建出来需要的用户,目录,密码文件...
# 3.1 创建用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M
# 3.2 创建备份目录
[root@backup ~]# mkdir /backup
# 3.3 修改属组和属主
[root@backup ~]# chown -R rsync.rsync /backup/
# 3.4 创建用户名和密码存放的文件
[root@backup ~]# vim /etc/rsync.passwd
wzh_bak:123
[root@backup ~]# echo 'wzh_bak:123' > /etc/rsync.passwd
# 3.5 修改密码文件的权限为600
[root@backup ~]# chmod 600 /etc/rsync.passwd
# 4.启动服务并且加入开机自启
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
# 5.检测端口
[root@backup ~]# netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 18373/rsync
tcp6 0 0 :::873 :::* LISTEN 18373/rsync
# 6.检测进程
[root@backup ~]# ps -ef|grep [r]sync
root 18373 1 0 20:48 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
3.服务端脚本(校验)
[root@backup ~]# cat md5sum.sh
#!/bin/bash
#设置普通变量
D=$(date +%F)
IP=$(ifconfig eth1|awk 'NR==2 {print $2}')
H=$(hostname)
bk_dir=/backup
local_dir=/backup/${H}_${IP}_${D}
#将校验结果发送到管理员邮箱
md5sum -c ${bk_dir}/*/jy.md5 |mail -s "$(date +%F)_$(hostname)_rsync备份校验结果" 714845658@qq.com
#保留六个月的备份结果其它的删除
find /backup/ -type d ! -mtime -180 ! -name 'backup' |xargs rm -rf
4.定时任务(服务端)
[root@backup ~]# crontab -l
#将/backup目录下的md5校验结果发送管理员邮箱 by王张行
05 1 * * * /bin/sh /root/md5sum.sh &>/dev/mull
Rsync备份案例
使用3台服务器主机名分别为web01、backup 、nfs主机信息见下表:
角色 | 外网IP | 内网IP | 主机名 |
---|---|---|---|
WEB | 10.0.0.7 | 172.16.1.7 | web01 |
NFS | 10.0.0.31 | 172.16.1.31 | nfs01 |
Rsync | 10.0.0.41 | 172.16.1.41 | backup |
WEB | 10.0.0.8 | 172.16.1.41 | web02 |
客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除
脚本解决
##客户端需求
1.1首先在客户端编辑一个备份的脚本
[root@nfs ~]# vim bf.sh
注意:编辑脚本的时候一定要现在命令行实现,成功之后再加入到脚本里面,写一步实验一步,及时找到错误并改正。
1.2每天凌晨一点把备份目录传输到backup服务器
## 服务端需求
1.1:配置邮箱
下载mailx
[root@backup backup]# yum install -y mailx
下载完成修改配置文件并手机打开邮箱账户通过手机短信方式
获取授权码
#发件人
set from=714845658@qq.com
#邮件服务器
set smtp=smtp.qq.com
#发件人用户名
set smtp-auth-user=714845658@qq.com
#发件人密码(QQ邮箱不可以使用密码,只能使用授权码)
set smtp-auth-password=xxx
#登录方式
set smtp-auth=login
#邮件服务器协议及端口
set smtp=smtps://smtp.qq.com:465
#忽略证书
set ssl-verify=ignore
#指定证书位置
set nss-config-dir=/root/.certs
##########下面是获取证书############
第一步:mkdir -p /root/.certs
第二步:cd ./.certs/
第三步: echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
第四步:certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
第五步: certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
第六步: certutil -L -d /root/.certs
第七步:certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs -i ~/.certs/qq.crt
########获取证书之后发测试邮件#########
echo wzh |mail -s '测试邮件' 714845658@qq.com
OK,测试成功
1.2:测试校验结果,因为在客户端的脚本里已经写了校验部分,所以传输过来的文件是有检验文件的
测试结果也是OK的,那这样就可以把测试文件写进脚本l,根据要求
需要保留6个月的备份数据,其余的删除
1.3:测试脚本是否成功
命令行输入sh md5.sh
1.4:最后添加到定时任务,因为客户端是每天凌晨一点发送备份数据,那在服务端就把时间向后推迟五分钟