rsync命令是一个远程数据同步工具,可快速同步多台主机间的文件。rsync只传送两个文件的不同部分,因此速度相当快。
安装
yum install rsync -y
apt install rsync -yhelp
认证
[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 服务器中拷贝文件到本地机
/etc/rsyncd.conf配置文件(systemctl cat rsync中[Unit]配置ConditionPathExists=/etc/rsyncd.conf)
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/wwwrsync 底层数据分块比对(增量同步)
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-aarchive mode-vincrease verbosity-Psame 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/
EOFF&Q
rsyncd @ERROR: invalid gid nobody
- 修改
/etc/rsyncd.conf为对应的 id
gid = 0
uid = 0rsyncd: 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 = *