linux rsync文件备份
第1章 Rsync本地模式和远程模式
1.命令说明
纯通过rsync的命令,来实现,数据目录A 拷贝到数据目录B
也就是模拟cp的用法 很简单
1,安装
yum install rsync -y
[root@rsync-41 ~]#yum install rsync -y
语法命令,分为几个模式
本地模式
rsync 参数 源路径 目标路径
rsync -avzP /var/log /tmp
远程模式,推送方式,把自己的数据推送到另一台机器上(上传)
语法1,rsync默认走ssh协议
rsync 参数 源路径 root@ip:目标路径
rsync -avzP /var/log/ root@10.0.0.31:/opt
语法2
rsync 参数 源路径 root@ip::目标路径
远程模式,拉取方式,拉取别人机器的数据到自己机器上(下载)
rsync 参数 root@ip:源路径 目标路径
rsync 参数 root@ip::源路径目标路径
rsync -avzP root@10.0.0.31:/var/log/ /tmp/
参数解释
-v 详细模式输出
-a 归档模式,递归的方式传输文件,并保持文件的属性,等同于 -rlptgoD
-r 递归拷贝目录
-l 保留软链接
-p 保留原有权限
-t 保留原有时间(修改)
-g 保留属组权限
-o 保留属主权限
-D 等于--devices --specials 表示支持b,c,s,p类型的文件
-R 保留相对路径
-H 保留硬链接
-A 保留ACL策略
-e 指定要执行的远程shell命令
-E 保留可执行权限
-X 保留扩展属性信息 a属性
比较常用的组合参数
rsync -avzP
-a 保持文件原有属性
-v 显示传输细节情况
-z 对传输数据压缩传输
-P 显示文件传输的进度信息
你在命令行里,执行命令,喜欢看到命令的执行过程
-avzP
脚本里面?
bash xxx.sh
rsync -az
2.本地模式
linux机器本身,数据来回发送
以后cp命令可以放一边了,用rsync当cp使用就行
创建两个测试文件夹
[root@rsync-41 ~]#mkdir /666
[root@rsync-41 ~]#mkdir /777
在测试文件夹里写入测试数据 1G的文件的小
[root@rsync-41 ~]#dd bs=100M count=10 if=/dev/zero of=/666/1G.log
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 4.37126 s, 240 MB/s
[root@rsync-41 ~]#ll -h /666/
total 1000M
-rw-r--r-- 1 root root 1000M Apr 20 15:25 1G.log
# 用rsync,支持增量备份
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
./
1G.log
1,048,576,000 100% 117.57MB/s 0:00:08 (xfr#1, to-chk=0/2)
sent 1,019,848 bytes received 38 bytes 119,986.59 bytes/sec
total size is 1,048,576,000 speedup is 1,028.13
[root@rsync-41 ~]#ls /777/
1G.log
[root@rsync-41 ~]#touch /666/12.log
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
./
12.log
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=1/3)
sent 127 bytes received 38 bytes 330.00 bytes/sec
total size is 1,048,576,000 speedup is 6,355,006.06
对文件同步
[root@rsync-41 ~]#yum install rsync -y
把本地的/777/1G.log 文件 拷贝到/777下
拷贝单个文件
[root@rsync-41 ~]#rsync -avzP /666/1G.log /777
sending incremental file list
1G.log
1,048,576,000 100% 121.58MB/s 0:00:08 (xfr#1, to-chk=0/1)
sent 1,019,826 bytes received 35 bytes 107,353.79 bytes/sec
total size is 1,048,576,000 speedup is 1,028.16
拷贝单个大文件,拷贝大文件时,要注意限速,否则占用磁盘IO太多
--bwlimit=10 就是限制速度为10M每秒
生成一个2G的文件
[root@rsync-41 ~]#dd bs=100M count=20 if=/dev/zero of=/666/2G.log
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB) copied, 2.31622 s, 905 MB/s
iotop查看磁盘的读写IO情况
限制单个大文件的传输,速度只给他20M每秒
[root@rsync-41 ~]#rsync -avzP --bwlimit=20 /666/2G.log /777
sending incremental file list
2G.log
659,816,448 31% 20.16MB/s 0:01:09
对目录同步(注意语法的区别)
拷贝都得数据,是否携带该目录本身
[root@rsync-41 ~]#rsync -avzP /var/log /opt
不拷贝目录本身,拷贝目录下的数据
[root@rsync-41 ~]#rsync -avzP /var/log/ /opt
测试文件夹的增量拷贝
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
sent 108 bytes received 12 bytes 240.00 bytes/sec
total size is 3,145,728,000 speedup is 26,214,400.00
[root@rsync-41 ~]#echo "123" >/666/12.log
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
12.log
4 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=2/4)
sent 157 bytes received 35 bytes 384.00 bytes/sec
total size is 3,145,728,004 speedup is 16,384,000.02
无差异化拷贝
使用--delete参数,将目标目录数据清空,保证完全和源目录数据一致
rsync -avzP --delete /666/ /777/
[root@rsync-41 ~]#ls /666
12.log 1G.log 2G.log 作业1.log 作业2.log
[root@rsync-41 ~]#ls /777/
12.log 1G.log 2G.log
[root@rsync-41 ~]#rsync -avzP --delete /666/ /777/
sending incremental file list
./
作业1.log
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=1/6)
作业2.log
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=0/6)
sent 234 bytes received 57 bytes 582.00 bytes/sec
total size is 3,145,728,004 speedup is 10,810,061.87
[root@rsync-41 ~]#ls /666/
12.log 1G.log 2G.log 作业1.log 作业2.log
[root@rsync-41 ~]#ls /777/
12.log 1G.log 2G.log 作业1.log 作业2.log
rsync拷贝文件夹,携带目录本身
把666目录本身,连带这数据,都拷贝到777下
[root@rsync-41 ~]#rsync -avzP /666 /777/
最终会生成
/777/666/ 该文件夹的数据,和源数据目录/666是一样的
[root@rsync-41 ~]#ls /777
12.log 1G.log 2G.log 666 作业1.log 作业2.log
对rsync限速,因为rsync在传输数据时,会占用大量的磁盘IO,以及如果时网络传输的话,占用网络宽带,会导致其他程序受影响
所以rsync这样的备份服务,都是在夜里,凌晨操作,别影响其他程序
--delete
实现/666 和 /777 完全一样
[root@rsync-41 ~]#rsync -avzP --delete /666/ /777
[root@rsync-41 ~]#ls /666 /777
/666:
12.log 1G.log 2G.log 作业1.log 作业2.log
/777:
12.log 1G.log 2G.log 作业1.log 作业2.log
3.远程模式
把/666下的数据,拷贝到 /999下
把rsync-41 /666下的数据
拷贝到 nfs-31 /888下
实现如scp的作用
PUSH 推送模式 上传模式
把rsync-41 /666下的数据,拷贝到 nfs-31 /888下
登录rsync-41
用ip的形式,再用主机名的形式
添加无差异化参数,该参数,慎用!,搞清楚了你在干什么!
[root@rsync-41 ~]#rsync -avzP --delete /666/ root@172.16.1.31:/888/
输入nfs-31的密码
[root@nfs-31 ~]#ls /888/
12.log 2G.log 作业1.log 作业2.log
PULL 拉取模式(要琢磨,数据最终放在了哪里)
把rsync-41 /666下的数据,拷贝到nfs-31 /888下
[root@nfs-31 ~]#rsync -avzP root@10.0.0.41:/666/ /888/
[root@nfs-31 ~]#ls /888
12.log 2G.log 作业1.log 作业2.log
拉取rsync-41的/etc/passwd文件到 nfs-31的 /888下,使用主机名通信
[root@nfs-31 ~]#rsync -avzP root@rsync-41:/etc/passwd /888/
[root@nfs-31 ~]#ls /888
12.log 2G.log passwd 作业1.log 作业2.log
传输整个目录,包含目录本身
[root@nfs-31 ~]#rsync -avzP root@172.16.1.41:/666 /888/
只传输目录下的文件,不包含目录本身
[root@nfs-31 ~]#rsync -avzP root@172.16.1.41:/666/ /888/
不同主机之间同步数据 --delete
rsync -avzP --delete root@10.0.0.41:/root /tmp/
坑:如果和一个空目录进行完全同步,那么效果和删库,删根一样
坑:传输过程不限速导致宽带被占满,--bwlimit=30
远程传输 nfs-31下的/888/2G.log 备份到rsync-41的/777下
[root@nfs-31 ~]#rsync -avzP --bwlimit=30 /888/2G.log root@10.0.0.41:/777
root@10.0.0.41's password:
sending incremental file list
2G.log
2,097,152,000 100% 30.81MB/s 0:01:04 (xfr#1, to-chk=0/1)
sent 2,039,554 bytes received 35 bytes 28,930.34 bytes/sec
total size is 2,097,152,000 speedup is 1,028.22
[root@rsync-41 ~]#ls /777
2G.log
-a 保持文件原有属性
-v 显示传输过程
-z 压缩传输数据
-P 显示传输进度
远程备份文件,且改名
[root@nfs-31 ~]#rsync -avzP /888/作业1.log root@10.0.0.41:/777/420作业
[root@rsync-41 ~]#ls /777
2G.log 420作业
远程传输 nfs-31下的 /888/ 备份到 rsync-41的 /777下,且是无差异化备份
等于清空原有的 /777 下的数据
原有数据
[root@rsync-41 ~]#ls /777
2G.log 420作业
[root@nfs-31 ~]#ls /888
12.log 2G.log passwd 作业1.log 作业2.log
[root@nfs-31 ~]#rsync -avzP --delete /888/ root@10.0.0.41:/777
[root@rsync-41 ~]#ls /777
12.log 2G.log passwd 作业1.log 作业2.log
第2章 Rsync服务模式-服务端配置
0.为什么需要服务模式
Rsync 借助 SSH 协议同步数据存在的缺陷:
1.使用系统用户(不安全) /etc/passwd
2.使用普通用户(会导致权限不足情况)
3.守护进程传输方式: rsync 自身非常重要的功能(不使用系统用户,更加安全)
1.安装rsync
yum install rsync -y
2.修改配置文件
复制粘贴如下代码即可
[root@rsync-41 ~]#cat > /etc/rsyncd.conf << 'EOF'
> uid = www
> gid = www
> port = 873
> fake super = yes
> use chroot = no
> max connections = 200
> timeout = 600
> ignore errors
> read only = false
> list = false
> auth users = rsync_backup
> secrets file = /etc/rsync.passwd
> log file = /var/log/rsyncd.log
> #####################################
> [backup]
> comment = yuchaoit.cn about rsync
> path = /backup
>
> [data]
> comment = this is secord backup dir,to website data..
> path = /data
> EOF
3.创建用户以及数据目录
根据你的配置文件中定义的信息,创建对应的用户,备份的目录
该无法登录的用户,只是用于运行进程的账户
[root@rsync-41 ~]#useradd -u 1000 -M -s /sbin/nologin www
创建配置文件中定义的2个备份目录
[root@rsync-41 ~]#mkdir -p /data/ /backup
修改备份目录的权限
[root@rsync-41 ~]#chown -R www:www /data/
[root@rsync-41 ~]#chown -R www:www /backup/
[root@rsync-41 ~]#ll -d /data /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /data
4.创建rsync专用的账户密码(这一步很重要,有错基本也是来这里排查)
1.创建密码文件,写入账户和密码,用于和客户端连接时候的认证
[root@rsync-41 ~]#vim /etc/rsync.passwd
2.写入账户密码
[root@rsync-41 ~]#cat /etc/rsync.passwd
rsync_backup:123456
3.待会客户端向rsync服务器推送数据,就得用这个账号密码!!!
4.这一步,非常重要,rsync要求降低密码文件的权限,且必须是600
[root@rsync-41 ~]#chmod 600 /etc/rsync.passwd
[root@rsync-41 ~]#ll /etc/rsync.passwd
-rw------- 1 root root 20 Apr 20 16:58 /etc/rsync.passwd
5.加入开机自启
设置rsyncd服务,运行,且开机自启
[root@rsync-41 ~]#systemctl start rsyncd 启动
[root@rsync-41 ~]#systemctl enable rsyncd 开机自启
检查rsyncd服务是否运行,以及该服务的运行日志
先备份
[root@rsync-41 ~]#cp /etc/rsync.passwd{,.ori}
[root@rsync-41 ~]#ls /etc/rsync.passwd*
/etc/rsync.passwd /etc/rsync.passwd.ori
[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
Main PID: 2364 (rsync)
CGroup: /system.slice/rsyncd.service
└─2364 /usr/bin/rsync --daemon --no-detach
Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.
6.检查服务是否运行
[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
Main PID: 2364 (rsync)
CGroup: /system.slice/rsyncd.service
└─2364 /usr/bin/rsync --daemon --no-detach
Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.
无论是学习期间还是上班了,都养成好习惯
给别人启动了某程序后,给自己启动某程序
务必去检查,验证是否正确
[root@rsync-41 ~]#ps -ef |grep 'rsync' |grep -v 'grep'
root 2364 1 0 17:06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@rsync-41 ~]#netstat -tunlp |grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 2364/rsync
tcp6 0 0 :::873 :::* LISTEN 2364/rsync
第3章 Rsync服务模式-客户端配置
1.安装rsynv
yum install rsync -y
2.配置密码文件以及授权
此时rsync客户端,需要把数据推送到rsync服务端
但是需要账户认证,这个账户密码,是服务端指定好的
账号:rsync_backup
密码:123456
客户端需要做的操作有2个,提供密码认证
1.生成密码文件,每次连接都指定这个密码文件
2.生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量,以及变量的指,是配置文件中的密码即可
进行客户端数据发送
下载,服务端rsync-41的数据
账号:rsync_backup
密码:123456
推送,备份,发送nfs-31的数据到rsync-41
把客户端的数据,发送给服务端的backup备份模块下
语法,不一样了,注意语法的写法!!!
把客户端的 /tmp/200M.log 备份,发送到rsync-41机器上的backup模块下
rsync -avzP /tmp/200M.log 账户@主机名::模块名
默认无密码变量,也无密码文件,需要你自己输入该rsync_backup虚拟用户的密码
需要交互式的输入密码,无法在脚本中使用rsync同步命令
rsync基本都是和脚本结合使用
[root@nfs-31 ~]#rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
[root@rsync-41 ~]#ls /backup/
200M.log
非交互式密码的操作,如下2个方法
1.生成密码文件,每次连接都指定这个密码文件(在客户端生成)
[root@nfs-31 ~]#echo '123456' > /etc/my_rsync.pwd
还必须降低密码文件的权限才行,必须是600
[root@nfs-31 ~]#chmod 600 /etc/my_rsync.pwd
[root@nfs-31 ~]#ll /etc/my_rsync.pwd
-rw------- 1 root root 7 Apr 20 17:47 /etc/my_rsync.pwd
此时可以传输数据了,往data模块下传输
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data
[root@rsync-41 ~]#ls /data
200M.log
如果是脚本中的话,去掉vP显示过程的参数去掉
[root@nfs-31 ~]#rsync -az --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data
2.生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量 ,以及变量的值,是配置文件中的密码即可
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'
[root@nfs-31 ~]#rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
[root@rsync-41 ~]#ls /backup/
200M.log
下载备份服务器的数据
[root@nfs-31 ~]#rsync -avzP rsync_backup@rsync-41::backup /888/
receiving incremental file list
./
200M.log
200 100% 195.31kB/s 0:00:00 (xfr#1, to-chk=0/2)
sent 50 bytes received 141 bytes 382.00 bytes/sec
total size is 200 speedup is 1.05
[root@nfs-31 ~]#ls /888
200M.log
要输入密码
1.的确没指定密码文件
2.是否有密码变量呢?
如何需要输入密码呢
撤销这个密码变量
[root@nfs-31 ~]#unset RSYNC_PASSWORD
或者重新登录,只要密码变量失效,就必须输入密码了,或者使用密码文件
rsync -avzP rsync_backup@rsync-41::backup /tmp/
非交互式的密码认证方式
1.使用密码变量
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'
2.指定密码文件
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup /tmp/
[root@nfs-31 ~]#ls /tmp/
200M.log ks-script-U3fLGb vmware-root yum.log
错误,文件名不对,示范
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup/200M.logggggggggg /tmp/
receiving incremental file list
rsync: link_stat "200M.logggggggggg" (in backup) failed: No such file or directory (2)
sent 8 bytes received 106 bytes 228.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1651) [Receiver=3.1.2]
关于rsync的常见错误
rsync由于配置步骤比较细节,比较坑多,较多,可能会遇见各种错误
遇见问题,遇见错误
看日志
看日志
看日志
看日志
看日志
思路一:看服务指定的日志文件在哪
思路二:检查是否运行了,以及它的运行日志部分信息
检查是否开机运行
systemctl is-enabled
systemctl restart 重启服务
systemctl status 查看服务状态
systemctl start 启动服务
systemctl enable 设置服务开机自启
systemctl disable 禁止开机自启