相关参数
| 参数 | 说明 |
|---|---|
| -r, --recursive | 递归到目录 |
| -p, --perms | 保留文件权限信息不变 |
| -t, --times | 保留时间信息不变(修改时间) |
| -o, owner | 保持文件属主信息不变(仅限超级用户,修改uid,gid为root, 并且对fake super参数进行注释) |
| -g, --group | 保持文件属组信息不变 |
| -D | 保持设备文件信息不变(仅限超级用户,修改uid,gid为root, 并且对fake super参数进行注释) |
| -l, --links | 只传输软链接 |
| -L, copy-links | 将链接对应文件进行传输 |
| -H,--hard-links | 保持硬链接文件数据信息不变 |
| -P, --progress | 显示数据传输的进度信息 |
| -a | 命令归档参数 包括rtopgDl |
| -z | 传输时压缩数据 |
| -v, --verbose | 显示详细信息 |
| --exclude=PATTERN | 排除指定数据不被传输 |
| --exclude-from=file | 排除指定数据不被传输(批量排除) |
| --bwlimit=RATE | 限制传输带宽 |
| --delete | 无差异同步, 在目的目录同步文件, 如果本地目录为空, 则可用于清空目录, 比rm高效 |
本地备份方式:
#将本地 src目录中内容复制到dst目录 替代cp scp
$ sudo rsync -rp src /dst #会将src目录及其文件都拷贝
$ sudo rsync -rp src/ /dst #只会拷贝src里的文件
#如果backup目录不存在 则会自动创建, 但只支持创建1级目录
$ sudo rsync -rp src/ dst/1 #如果src/1 不存在会自动创建,但其父目录dst必须存在,否则报错
rsync: mkdir "...dst/1" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(682) [Receiver=3.1.3]
--delete 快速删除海量文件
#--delete参数 在目的目录同步文件
#分别为src, dst目录创建3个文件
$ touch src/a{1..3}.txt
$ touch dst/b{1..3}.txt
#使用--delete
$ rsync -avz --delete src/ dst/ #dst目录多余的文件被删除, 同时增加了src目录的所有
sending incremental file list
deleting b3.txt
deleting b2.txt
deleting b1.txt
./
a1.txt
a2.txt
a3.txt
sent 222 bytes received 106 bytes 656.00 bytes/sec
total size is 0 speedup is 0.00
#清空dst目录 /tmp/empty为空目录 替代rm
$ rsync -avz --delete /tmp/empty/ dst/
sending incremental file list
deleting a3.txt
deleting a2.txt
deleting a1.txt
./
sent 59 bytes received 49 bytes 216.00 bytes/sec
total size is 0 speedup is 0.00
远程备份方式
Pull
rsync -avz -e 'ssh -p 2222' 127.0.0.1:/backup /tmp/pull
root@127.0.0.1's password:
receiving incremental file list
created directory /tmp/pull
backup/
backup/hosts
sent 47 bytes received 301 bytes 232.00 bytes/sec
total size is 261 speedup is 0.75
Push
$ rsync -avz -e 'ssh -p 2222' src/ root@127.0.0.1:/backup
root@127.0.0.1's password:
sending incremental file list
created directory /backup
./
a1.txt
a2.txt
a3.txt
sent 222 bytes received 106 bytes 131.20 bytes/sec
total size is 0 speedup is 0.00
守护进程方式
服务端配置
1. 编写配置文件 **/etc/rsyncd.conf**
uid = rsync --- 指定管理备份目录的用户
gid = rsync --- 指定管理备份目录的用户组
port = 873 --- 定义rsync备份服务的网络端口号
fake super = yes --- 将rsync虚拟用户伪装成为一个超级管理员用户
use chroot = no --- 和安全相关的配置
max connections = 200 --- 最大连接数 同时只能有200个客户端连接到备份服务器
timeout = 300 --- 超时时间(单位秒)
pid file = /var/run/rsyncd.pid --- 记录进程号码信息 1.让程序快速停止进程 2. 判断一个服务是 否正在运行
lock file = /var/run/rsync.lock --- 锁文件
log file = /var/log/rsyncd.logvar/run/rsync.log --- rsync服务的日志文件 用于排错分析问题
ignore errors --- 忽略传输中的简单错误
read only = false --- 指定备份目录是可读可写
list = false --- 使客户端可以查看服务端的模块信息
hosts allow = 192.168.80.0/24 --- 允许传输备份数据的主机(白名单)
hosts deny = 0.0.0.0/32 --- 禁止传输备份数据的主机(黑名单)
auth users = rsync_backup --- 指定认证用户
secrets file = /etc/rsync.password --- 指定认证用户密码文件 用户名称:密码信息
[backup] --- 模块信息
comment = "backup dir"
path = /backup --- 模块中配置参数 指定备份目录
2. 创建rsync服务的虚拟用户
```bash
# useradd rsync -M -s /sbin/nologin
```
-
创建备份服务认证密码文件
# echo "rsync_backup:oldboy123" >/etc/rsync.password # chmod 600 /etc/rsync.password -
创建备份目录并修改属主属组信息
# kdir /backup # chown rsync.rsync /backup/ -
启动备份服务
# systemctl start rsyncd # systemctl enable rsyncd # systemctl status rsyncd
客户端配置
-
创建秘密文件
echo '1929' >/etc/rsync.password chmod 600 /etc/rsync.password -
进行免交互配置 追加 --password-file=/etc/rsync.password
$ rsync -avz /etc/hosts rsync_backup@192.168.80.10::backup --password-file=/etc/rsync.password
Rsync 常见问题
-
rsync客户端的错误现象:No route to host
rsync: failed to connect to 192.168.80.10 (192.168.80.10): No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]s原因: 防火墙有安全策略, 服务端rsync端口没有开启
解决:在rsync服务端开启873/tcp 端口
# firewall-cmd --permanent --add-port=873/tcp # firewall-cmd --reload -
ERROR: The remote path must start with a module name not a /
# rsync -avz /etc/hosts rsync_backup@192.168.80.10::/backup ERROR: The remote path must start with a module name not a / rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]原因: rsync备份地址语法不正确,::后应该为模块名 ::backup
解决:将/backup 换为 backup
# rsync -avz /etc/hosts rsync_backup@192.168.80.10::backup password: -
@ERROR: auth failed on module backup
# rsync -avz /etc/hosts rsync_backup@192.168.80.10::backup Password: @ERROR: auth failed on module backup rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]原因:
- 密码输入错误, 里的密码是设置的在 secret file=/etc/rsync.password中的rsync密码,而非登录密码
- /etc/rsync_password 文件权限不是600
- rsync_backup:xxx 密码配置文件后面注意不要有空格
- rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称
解决: 查看权限,密码是否正确
排查空格方式: cat -A /etc/rsync.password vim中输入 :set list vim中搜索空格 :/ @ERROR Unknown module 'backup'
原因: 模块名称不对
解决: 检查 /etc/rsyncd.conf中定义的模块名称
- Permission denied
原因:
1. 备份目录的属主和属组不正确, 不是uid/gid: rsync
2. 备份目录权限不正确: 不是755
-
chdir failed
原因: 备份目录没有建立或与配置文件中定义的不一致
解决: 建立备份目录并修改权限和所属主/组
-
invalid uid rsync
原因: 没有虚拟用户rsync
解决: useradd rsync -M -s /sbin/nologin
-
客户端连接缓慢
原因: 解析未知主机或服务器名称时的耗时消耗
解决: 查看日志 /var/log/rsync.log
发现客户端地址未知/没有解析, 耗时10s
2021/04/14 12:03:10 [3932] params.c:Parameter() - Ignoring badly formed line in config file: ignore errors 2021/04/14 12:03:20 [3932] name lookup failed for 192.168.80.20: Name or service not known 2021/04/14 12:03:20 [3932] connect from UNKNOWN (192.168.80.20) 2021/04/14 12:03:25 [3932] rsync to backup/ from rsync_backup@UNKNOWN (192.168.80.20) 2021/04/14 12:03:25 [3932] receiving file list 2021/04/14 12:03:26 [3932] sent 25 bytes received 56 bytes total size 396在服务端编写hosts解析文件:追加客户端主机信息
#echo '192.168.80.20 nfs01' >> /etc/hosts2021/04/14 12:09:45 [3963] params.c:Parameter() - Ignoring badly formed line in config file: ignore errors 2021/04/14 12:09:45 [3963] connect from nfs01 (192.168.80.20) 2021/04/14 12:09:46 [3963] rsync to backup/ from rsync_backup@nfs01 (192.168.80.20) 2021/04/14 12:09:46 [3963] receiving file list 2021/04/14 12:09:46 [3963] sent 54 bytes received 97 bytes total size 396 Connection refused(111)
```bash
rsync: failed to connect to 192.168.80.10 (192.168.80.10): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
```
原因: rsync服务没有开启
守护进程服务企业应用
-
守护进程多模块功能配置
[backup] comment = "backup dir for common use" path = /backup [dba] comment = "backup dir for db data" path = /dba comment = "backup dir for dev data" path = /devdata
-
守护进程的排除功能
有时需要结合find 按特征排除一些文件
[root@nfs01 ~]# mkdir -p test_data [root@nfs01 ~]# mkdir -p test_data/{a..c} [root@nfs01 ~]# touch test_data/{a..c}/{1..3}.txt [root@nfs01 ~]# tree test_data/ test_data/ ├── a ├── 1.txt ├── 2.txt └── 3.txt ├── b ├── 1.txt ├── 2.txt └── 3.txt └── c ├── 1.txt ├── 2.txt └── 3.txt需求1: a目录数据全部备份 b目录不要备份1.txt文件 c整个目录不要做备份
方式一: 相对路径/ 绝对路径方式: --exclude相对的是要备份的目录
rsync -avz test_data/ --exclude=b/1.txt --exclude=c/ rsync_backup@backup::backup --password-file=/etc/rsync.password
方式二: 编写排除文件方式
```bash
# cat > exclude.txt <<EOF
> b/1.txt
> c/
> EOF
# rsync -avz test_data/ --exclude-from=exclude.txt rsync_backup@backup::backup --password-file=/etc/rsync.password
-
守护进程来创建备份目录
# rsync -avz /etc/hosts rsync_backup@backup::backup/nfs01_192.168.80.10/ --password-file=/etc/rsync.password sending incremental file list created directory nfs01_192.168.80.10 hosts sent 237 bytes received 85 bytes 644.00 bytes/sec total size is 396 speedup is 1.23
-
守护进程的访问控制配置: 配置黑白名单
hosts allow = 192.168.80.0/24 #白名单 hosts deny = 0.0.0.0/32 #黑名单三种情况:
- 只有白名单: 只允许白名单内地址传输, 不在里面则禁止
- 只有黑名单: 只禁止黑名单内地址传输, 不在里面则允许
- 黑白名单都有:白名单优先原则 --- 先看白名单: 匹配则允许,再看黑名单: 匹配则禁止, 其余地址: 允许
-
守护进程的列表功能配置
list = true #配置文件开启列表功能: 客户端可以查看服务端模块信息, 建议关闭 # rsync rsync_backup@backup:: backup "backup dir by daniel" db "backup dir for db data" dev "backup dir for dev"
参考: