rsync 远程数据同步

发布时间: 更新时间: 总字数:2717 阅读时间:6m 作者:IP:上海 网址

rsync命令是一个远程数据同步工具,可快速同步多台主机间的文件。rsync只传送两个文件的不同部分,因此速度相当快。

安装

yum install rsync -y

apt install rsync -y

help

rsync-help ...

认证

[xxx]
    path = /xxx/
    comment = crpilot mirror
    read only = false
    # 1. 必须明确指定哪些用户可以访问(这里的 user1 是虚拟用户名)
    auth users = user1, user2
    # 2. 存放密码的文件
    secrets file = /etc/rsyncd.secrets
    # 3. 强烈建议:限制允许访问的 IP 地址
    hosts allow = 192.168.1.0/24, 1.2.3.4
    # 4. 指定上传文件时的用户权限(可选,建议设置)
    uid = rsync_user
    gid = rsync_group
  • /etc/rsyncd.secrets 内容示例
user1:password123
user2:securepass

权限调整:

chmod 600 /etc/rsyncd.secrets
chown root:root /etc/rsyncd.secrets
  • 客户端 /etc/rsyncd.password 示例,权限同上
password123
  • 输出日志信息
rsync -vv ... (你的其他参数)
  • 命令语法
  • SSH 模式:如果你使用的是单冒号 :
    • 示例:rsync -avz local_file user@remote_host:/path/
    • 认证方式:由 SSH 处理(密码、SSH 密钥、或 Agent 转发)。
  • Rsync Daemon 模式:如果你使用的是双冒号 ::rsync:// 协议。
    • 示例:rsync -avz local_file user@remote_host::module_name
    • 示例:rsync -avz local_file rsync://user@remote_host/module_name
    • 认证方式:由 rsyncd.conf 定义(通常是简单的用户名/密码,存储在 .secrets 文件中)。
  • rsync 密码认证:RSYNC_PASSWORD 环境变量(man rsync 查看详细信息)或 --password-file=/etc/rsync.passwrod (仅包括密码信息,如:echo "123456" > /etc/rsync.password,修改权限:chmod 600 /etc/rsync.password
  • rsync 会默认读取当前 Linux 系统的环境变量 USER(或 LOGNAME)作为连接 daemon 的用户名
# 在命令中引用变量拼接,MY_RSYNC_USER 是rsync配置的用户名
rsync -avz /本地目录/ ${MY_RSYNC_USER}@192.168.1.100::模块名/

# 或者使用 rsync:// 协议格式(看起来更整洁)
rsync -avz /本地目录/ rsync://${MY_RSYNC_USER}@192.168.1.100/模块名/

工作模式

拷贝本地文件

当 SRC 和 DES 路径信息都不包含有单个冒号":“分隔符时就启动这种工作模式。如:

rsync -a /data /backup

拷贝本机文件远程机器

使用一个远程 shell 程序(如 rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当 DST 路径地址包含单个冒号”:“分隔符时启动该模式。如:

rsync -avz *.py <remote-ip>:/backup

拷贝远程文件到本机

使用一个远程 shell 程序(如 rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当 SRC 地址路径包含单个冒号”:“分隔符时启动该模式。如:

rsync -avz <remote-ip>:/data /backup

从远程 rsync 服务器中拷贝文件到本地机

uid = nobody
gid = nobody
use chroot = yes
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid
[ftp]
    path = /var/ftp/pub
    comment = whole ftp area
    pre-xfer exec = /usr/local/bin/autobackup-hook pre  # 同步前执行
    post-xfer exec = /usr/local/bin/autobackup-hook post  # 同步后执行
    # auth users = <user>
    # secrets file = /etc/rsyncd.secrets  # echo <user>:<password> >> /etc/rsyncd.secrets && chmod 400 /etc/rsyncd.secrets
		# hosts allow = ip1,ip2
		# log format = "%t [%p] %o %h [%a] %m (%u) %f %l"

[www]
    path = /var/www
    comment = web file
  • 启动服务
systemctl start rsync
  • 当 SRC 路径信息包含 :: 分隔符时启动该模式。如:
rsync -av root@10.10.10.10::www /databack

从本地机器拷贝文件到远程 rsync 服务器中

当 DST 路径信息包含 :: 分隔符时启动该模式。如:

rsync -av /databack root@10.10.10.10::www

列远程机的文件列表

这类似于 rsync 传输,不过只要在命令中省略掉本地机信息即可。如:

rsync -v rsync://10.10.10.10/www

rsync 底层数据分块比对(增量同步)

rsync -avzP 原生支持“底层数据分块比对(增量同步)”

# 静默追加输出到文件
rsync -avzP -e ssh root@<云端IP>:/<file-or-path> /<local-path> >> /root/rsync_quiet.log 2>&1

# 使用 axel (通过 HTTP/FTP/内网直连加速),开 10 个线程并发分片下载单体大文件
axel -n 10 http://<云端内网IP>/1690000000_gitlab_backup.tar

# 使用 aria2c (支持 SSH/SFTP 并发分片下载),-x 10 表示 10 个线程,-s 10 表示将文件分成 10 片并发拉取
aria2c -x 10 -s 10 sftp://root@<云端IP>:/var/opt/gitlab/backups/xxx_gitlab_backup.tar

使用示例

rsync -av -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress --remove-source-files /data/ root@10.10.10.10:/data >> /tmp/rsync.log
  • -z :表示压缩,会牺牲性能,网络允许的条件下不建议价
  • -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" :禁用 host key 验证
  • --progress :显示进度
  • --remove-source-files :传完后,删除源文件
rsync -avP --bwlimit=81920  /data/  /data_bak/  --exclude=/data/logs1  --exclude=/data/logs2
  • -a archive mode
  • -v increase verbosity
  • -P same as --partial --progress
  • --bwlimit=81920 限速 81920 / 1024 = 80MB/s
rsync -av --include="*.txt" --exclude='**/abc/' --delete source/ destination
  • 同步 epel 源(摘自互联网)
cat << EOF > rsync_epel.sh
#!/bin/bash
#epel
mkdir -pv /data/mirror/epel/7/x86_64/
rsync -avzP --bwlimit=30720 --timeout=120 --contimeout=120 --exclude-from=/opt/rsync/exclude.list rsync://rsync.mirrors.ustc.edu.cn/repo/epel/7/x86_64/ /data/mirror/epel/7/x86_64/
#rm -rf /data/mirror/epel/7/x86_64/.olddata
#createrepo /data/mirror/epel/7/x86_64/
EOF

F&Q

rsyncd @ERROR: invalid gid nobody

  • 修改 /etc/rsyncd.conf 为对应的 id
gid = 0
uid = 0

rsyncd: ERROR: module is read only

# 解决方法
[my_module]
    path = /path/to/destination/folder
    comment = My Backup Share
    read only = false  <--- ADD OR CHANGE THIS LINE
    write only = false
    # 核心安全设置:
    hosts allow = 192.168.1.10, 192.168.1.11
    hosts deny = *