Linux - rsync工具

相关参数

参数 说明
-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
```
  1. 创建备份服务认证密码文件

    # echo "rsync_backup:oldboy123" >/etc/rsync.password
    # chmod 600 /etc/rsync.password
    
  2. 创建备份目录并修改属主属组信息

    # kdir /backup
    # chown rsync.rsync /backup/
    
  3. 启动备份服务

    # systemctl start rsyncd
    # systemctl enable rsyncd
    # systemctl status rsyncd
    

客户端配置

  1. 创建秘密文件

    echo '1929' >/etc/rsync.password
    chmod 600 /etc/rsync.password
    
  2. 进行免交互配置 追加 --password-file=/etc/rsync.password

    $ rsync -avz /etc/hosts rsync_backup@192.168.80.10::backup --password-file=/etc/rsync.password
    

Rsync 常见问题

  1. 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
    
  2. 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:
    
  3. @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]
    

    原因:

    1. 密码输入错误, 里的密码是设置的在 secret file=/etc/rsync.password中的rsync密码,而非登录密码
    2. /etc/rsync_password 文件权限不是600
    3. rsync_backup:xxx 密码配置文件后面注意不要有空格
    4. rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称

    解决: 查看权限,密码是否正确

              排查空格方式:
    
                       cat -A /etc/rsync.password
    
                       vim中输入 :set list
    
                       vim中搜索空格 :/        
    
  4. @ERROR Unknown module 'backup'

  原因: 模块名称不对

  解决: 检查 /etc/rsyncd.conf中定义的模块名称
  1. Permission denied
  原因:

  1.  备份目录的属主和属组不正确, 不是uid/gid: rsync

  2.  备份目录权限不正确: 不是755
  1. chdir failed

    原因: 备份目录没有建立或与配置文件中定义的不一致

    解决: 建立备份目录并修改权限和所属主/组

  1. invalid uid rsync

    原因: 没有虚拟用户rsync

    解决: useradd rsync -M -s /sbin/nologin

  2. 客户端连接缓慢

    原因: 解析未知主机或服务器名称时的耗时消耗

    解决: 查看日志 /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/hosts
    
    2021/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
    
  3. 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服务没有开启

守护进程服务企业应用

  1. 守护进程多模块功能配置

    [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
    
  1. 守护进程的排除功能

    有时需要结合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
  1. 守护进程来创建备份目录

    # 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
    
    
  1. 守护进程的访问控制配置: 配置黑白名单

    hosts allow = 192.168.80.0/24  #白名单
    hosts deny = 0.0.0.0/32        #黑名单
    

    三种情况:

    1. 只有白名单: 只允许白名单内地址传输, 不在里面则禁止
    2. 只有黑名单: 只禁止黑名单内地址传输, 不在里面则允许
    3. 黑白名单都有:白名单优先原则 --- 先看白名单: 匹配则允许,再看黑名单: 匹配则禁止, 其余地址: 允许
  1. 守护进程的列表功能配置

    list = true  #配置文件开启列表功能: 客户端可以查看服务端模块信息, 建议关闭
    
    # rsync rsync_backup@backup::
    backup          "backup dir by daniel"
    db              "backup dir for db data"
    dev             "backup dir for dev"
    

参考:

https://blog.51cto.com/oldboy/2307393

https://blog.51cto.com/oldboy/2308749

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容