安装rsync

OS声明: Centos7

# 安装rsync
yum -y install rsync

# 查看service名
rpm -ql rsync|grep -i service

在这里插入图片描述

# 设置服务开机自启并现在启动
## 守护进程模式适合使用rsync独立用户名和密码 认证
## ssh免密传输可以不需要守护进程
systemctl enable --now rsyncd.service

#检查是否已经成功启动
## rsync的服务端口是TCP/873
netstat -tunlp|grep 873

配置服务端

vim /etc/rsyncd.conf

基本配置方案

# 设置运行rsync 进程的用户
uid = root                              
gid = root

# 指定非标准端口,默认TCP/873
# port = 874

# 将指定的目录作为根目录,限制了进程的访问范围
# 默认为true,修改为no,增加对目录文件软连接的备份 
use chroot = no
# 指定允许的最大连接数,0为不限制
max connections = 4

# 同步过程中忽略出现的错误
ignore errors = yes

# 同步过程中忽略不可读的文件,并继续执行同步操作
ignore nonreadable = yes     

# 要排除的文件或目录
## 排除lost+found/
## lost+found/是自动生成的损坏文件和目录的碎片
exclude = lost+found/

# 指定日志文件
log file = /var/log/rsyncd.log     

# CentOS7中yum安装不需指定pid file 否则报错
# pid file = /var/run/rsyncd.pid        

# 此文件定义完成后系统会自动创建
lock file=/var/run/rsyncd.lock
# 反向DNS查询
reverse lookup = no
# 启用传输日志记录
transfer logging = yes
# 指定 rsync 连接的超时时间(s)
timeout = 900

# 传输时不压缩的文件
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# ************安全配置***********
# 指定允许访问 rsync 服务器的主机或网段
hosts allow = 10.0.0.0/24
# 不允许哪些主机或网段连接
hosts deny = 0.0.0.0/24
# 列出rsync模块列表
## false 禁止列出模块列表
list = false

# 每个模块名称对应一个不通的path目录,如果名称重复,后一个生效
[backup]
# 对备份模块的注释或说明
comment = mysql数据备份
# 指定要备份的路径
path = /data/mysql/backup

# 是否只读(默认yes)
read only = no

# 只授权指定用户访问backup模块
# 认证的用户名与系统帐户无关,在认证文件做配置
## 默认没有这行则表明是匿名用户访问rsync服务器
auth users = rsyncuser

# 指定密码认证文件,格式(虚拟用户名:密码)
secrets file = /etc/rsync.pas

共享模块配置—示例

# 创建 /etc/rsyncd.conf 配置文件(xx,yy,zz改成自己真实ip)
uid = root
gid = root

use chroot = yes
# 设置服务只读--no
ready only = no
# 锁文件
lock file = /var/run/rsync.lock
# 日志
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
# hosts allow 是允许连接的客户端ip
hosts allow = 10.99.xx.0/24 10.99.yy.0/24 10.99.zz.0/24
# 排查目录
exclude = lost+found/
# 启用详细传输日志
transfer logging = yes
# 客户端连接超时
timeout = 900

# 定义个共享模块
[app-image]
# 该模块的注释说明
comment = app-nginx-images rsync
# 客户端读写都将映射到这个目录
path = /mnt/gxyb/upload/pro
# 是否只读=no
read only = no
# 指定认证的用户名
auth users = root
# 认证用户的密码文件
secrets file = /etc/rsyncd_pass/rsyncd.pass

指定了用户后要手动创建用户

如果手动指定uidgid检查本地是否存在该用户不存在则需要手动创建用户

# 创建rsync用户
## -s 指定用户的shell
## -M 不要自动建立用户的登入目录。
useradd -s /sbin/nologin rsync -M

在这里插入图片描述


生成rsync认证文件

# 创建认证用户
## 账号和密码以:隔开
echo "rsyncuser:pas123" > /etc/rsync.pas

# 设置600权限--必须修改权限
chmod 600 /etc/rsync.pas

修改完配置重启服务端

# 设置服务器配置文件600权限
chmod 600 /etc/rsyncd.conf

# 重启服务端
systemctl restart rsync

配置客户端

# 创建认证用户
## 账号和密码以:隔开
echo "rsyncuser:pas123" > /etc/rsync.pas

# 设置600权限--必须修改权限
chmod 600 /etc/rsync.pas

客户端测试访问

# 查看远程rsync服务器的模块信息
## 如果带有密码,需要账号密码写入:/etc/rsync.pas
rsync rsync://${rsync服务器ip}

在这里插入图片描述

# 查看带密码验证的远程rsync服务器的模块内容
rsync rsync://${rsync用户名}@${rsync服务器ip}/${模块名}

在这里插入图片描述


非交互式查看共享目录

# 手动指定密码文件
rsync --password-file=/etc/rsync.pas rsync://${rsync用户名}@${rsync服务器ip}/${模块名}

rsync客户端测试同步数据

# 本地目录同步到远程rsync服务器
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## --delete 删除那些接收端还有而发送端已经不存在的文件
rsync -avz --delete --password-file=/etc/rsync.pas /localdata/www/ ${rsync用户名}@${rsync服务器ip}::${模块名}

# 将远程rsync服务器上的模块同步到本地目录 
rsync -avz --delete --password-file=/etc/rsync.pas ${rsync用户名}@${rsync服务器ip}::${模块名} /localdata/www/

常用参数–Windows版可能不支持

建议先设置ssh免密

参考: https://www.cnblogs.com/wclwcw/p/8242695.html
https://article.itxueyuan.com/46mBPw

注:部分选项无短格式(如 --exclude),故“选项”列留空。

选项 全称 说明
-a --archive 归档模式,递归传输并保持所有文件属性(等同于 -rlptgoD
-b --backup 当目标文件有变化时,对旧版文件进行备份
-v --verbose 详细模式输出
-r --recursive 递归处理子目录(同步目录时必需)
-u --update 仅同步源文件中修改时间比目标新的文件
--copy-unsafe-links 拷贝指向源路径目录树以外的符号链接文件
--safe-links 忽略指向源路径目录树以外的符号链接文件(默认行为)
-e --rsh=COMMAND 指定远程 shell(如 ssh、rsh)用于数据同步
-z --compress 传输时压缩文件数据
-q --quiet 精简输出模式
-h --human-readable 以人类可读单位(如 K、M)显示文件大小
-n --dry-run 模拟运行,仅显示将被传输的文件
--stats 显示传输统计信息
--timeout=TIME 设置 I/O 超时时间(秒)
--ignore-existing 忽略接收端已存在的文件,仅传输新文件
--existing 仅更新接收端已存在的文件,不传输新文件
--exclude=PATTERN 排除匹配 PATTERN 的文件/目录
--exclude-from=FILE 从 FILE 读取排除规则
--include=PATTERN 包含匹配 PATTERN 的文件/目录
--include-from=FILE 从 FILE 读取包含规则
--backup-dir=DIR -b 一起使用,将备份文件存入指定 DIR
--link-dest=DIR 若文件未变,基于 DIR 创建硬链接(节省空间)
--list-only 仅列出文件,不进行实际复制
--rsync-path=PROGRAM 指定远程服务器上 rsync 可执行文件的路径
--port=PORT 指定 rsync 服务端口(非 SSH 方式)
--log-format=FORMAT 指定日志格式
--password-file=FILE 从 FILE 读取密码(用于非交互式认证)
--bwlimit=KBPS 限制 I/O 带宽(单位:KB/s)
-4 --ipv4 强制使用 IPv4
-6 --ipv6 强制使用 IPv6
--version 打印 rsync 版本信息
--help 显示帮助信息

保持权限相关参数

💡 提示:-a(归档模式)已隐含 -rlptgoD,即包含 -p-o-g-t-l-D 等选项(但不包含 -H-S-P)。

选项 全称 说明
-p --perms 保持文件权限
-o --owner 保持文件属主信息(需 root 权限)
-g --group 保持文件属组信息
-t --times 保持文件修改时间
-P (无) 等价于 --partial --progress:断点续传并显示传输进度
--partial 保留因中断未传完的文件,便于后续续传
--progress 显示文件传输进度
-S --sparse 高效处理稀疏文件(将空数据块转为稀疏块)
-l --links 保留软链接(符号链接)属性
-H --hard-links 保留硬链接关系
-D (无) 保持设备文件和特殊文件(仅限 super-user 使用)

删除相关参数

选项 全称 说明
-d --dirs 仅传输目录本身,不递归其内容(非递归同步目录)
--delete 删除接收端存在但发送端已不存在的文件,用于保持目标与源完全一致(增量全备核心选项
--delete-before 在传输前删除目标端多余文件(默认行为,适用于确保干净同步)
--delete-during 在传输过程中边同步边删除多余文件(内存效率更高)
--delete-after 在传输完成后再删除多余文件(最安全,可配合 --progress 使用)
--delete-excluded 同时删除目标端中被 --exclude 排除的文件(谨慎使用)
--delay-updates 将更新中的文件暂存于临时目录(如 .~tmp~),传输完成后再原子替换,避免中间状态
--ignore-errors 即使发生 I/O 错误也继续执行删除操作(通常与 --delete 联用,风险较高

💡 使用建议

  • 实现“镜像同步”(目标 ≡ 源):推荐 rsync -av --delete --delete-after
  • 避免误删:首次使用 --delete 建议先加 -n--dry-run)测试。
  • --delete 默认采用 --delete-before,可通过显式指定其他策略调整行为。

rsync常用操作


本机中的两个目录同步(最常用)

-a参数会保持文件权限属性
本地备份可以用-aP参数

# 本机中的两个目录进行同步
## -a 递归同步、保留符号链接、保留权限、保留时间戳、保留所有者和组
## -P:等价于 ––partial + ––progress,断点续传并打印过程
rsync -aP /源目录/ /root/目的地目录/

将本地文件拷贝到远程主机

如果是内网传输,不要使用-z参数来压缩,会严重影响传输速度

# 将本机文件同步到远程机
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理 
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -avzP local.file 192.168.1.22:/path/to/local.file

将远程主机上的文件拷贝到本地

如果是内网传输,不要使用-z参数来压缩,会严重影响传输速度

# 将远程主机上的文件同步到本地
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -avzP 192.168.1.22:/path/to/local.file /data

从远程同步到本地,并删除目标目录比源目录多余的文件

# 从远程同步到本地,并删除目标目录比源目录多余的文件
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件
## -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步 
rsync -avzP --delete -e 'ssh -p port' root@[$Remote_Host]:[$Remote_Dir] [$Local_Dir]

scp断点续传–Windows需要使用msys2

https://blog.csdn.net/omaidb/article/details/125937221

# 传输大文件到远端主机
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -r, 递归,传输目录时使用
## -t, ––times:保持文件时间信息
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件,增量备份时使用
rsync -avzrtP --delete --rsh=ssh localfile root@130.10.0.65:/tmp/

rsync快速清空目录下的大量文件

参考: https://www.361way.com/rsync-fast-del-file/4681.html
https://www.jianshu.com/p/b9519e589f62
https://juejin.cn/post/6844903766366371854
rsyncrm删除快的原因:

  • rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复遍历很多次;
  • rsync删除内容时,建立好新的空目录,替换掉老目录,不需要进行大量的遍历操作。

必须要有指定一个空目录

!!!不要忘记目录后的/

# 先建立一个空白目录
mkdir /tmp/empty

清除目标目录的文件–会丢失目录原权限—常用

原理是用空目录替换要删掉的目录
注意:两个目录结尾均需要有/

# 清空目录,目标目录的权限会和变成源目录的权限一样
## -d 不递归传输目录
## -v 详细输出模式
## -delete-before 接收者在传输之前进行删除操作

# rsync -dv --delete-before 空白目录/ 要清空的目录/
rsync -dv --delete-before /tmp/empty/ /要清空的目录/

清除目标目录的文件,并保持之前的目录权限

# 清除目标目录的文件,并保持之前的目录权限
## --delete 删除那些接收端还有而发送端已经不存在的文件
## -d --dirs  不递归传输目录
## -l 保持软链接
## -p 保持权限
## -t  ––times:保持文件时间信息
## -o, --owner 保持文件属主信息 
## -g, --group 保持文件属组信息
## -H, --hard-links 保留硬链结
## -D:保持设备文件和特殊文件 (super-user only)
rsync --delete -dlptogHD /tmp/empty/ /要清空的目录/

清除目标目录的文件–将空目录备份到目标目录

注意:$srcDir结尾不要使用/$desDir结尾要使用/

## -a 以归档模式同步文件,等同于-r、-l、-p、-t、-g、-o选项的组合
## -v 显示详情
## -z 使用压缩
rsync -avz $srcDir $desDir/

Linux删除大文件

# 重定向到 Null 来清空文件内容
> access.log

# 将空字符串的内容重定向到文件
echo > access.log

# 将文件的大小设定为0
truncate -s 0 access.log

# 设定文件大小为26M
# truncate -s 26M access.log

同步yum源到内网

# 开始同步Centos7的docker-ce源
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件,增量备份时使用
## --exclude=debug:指定排除不需要debug

rsync -avzP --delete --exclude=debug rsync://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/ .\7\x86_64\stable\

Windows版rsync不能使用ssh

参考: https://blog.miniasp.com/post/2021/12/15/How-to-use-Rsync-with-OpenSSH-for-Windows
Windowsrsync必须使用cwRsync內附的ssh.exe才可以传输.不知道这是一个bug,还是一个特色.
建议还是使用msys2安装rsync吧,


使用xsync脚本优化同步

项目地址: https://gitcode.com/liqiaofei/xsync

xsync脚本放在~/bin目录下,并赋予可执行权限

# 创建~/bin目录
mkdir ~/bin

# 下载xsync脚本
wget -P ~/bin/ https://raw.gitcode.com/liqiaofei/xsync/raw/main/xsync

# 赋予xsync可执行权限
chmod +x ~/bin/xsync

# 查看能否检查得到xsync命令
which xsync

在这里插入图片描述
添加要同步的主机

vim ~/xsync.txt

在这里插入图片描述

xsync脚本内容如下:

项目地址:https://github.com/omaidb/qiaofei_notes/blob/main/shell_code/other/xsync

# 下载最新脚本
wget -c https://raw.githubusercontent.com/omaidb/qiaofei_notes/main/shell_code/other/xsync

需要两端机器安装rsync,否则会报错。

#!/usr/bin/env bash

# 0.依赖包检查
which rsync >>/dev/null 2>&1 || yum install -y rsync || apt install -y rsync
ls ~/xsync.txt &>/dev/null || touch ~/xsync.txt
# 1.判断参数个数,没有参数就会退出
## $#:获取参数个数,-lt 1:减1
if [ $# -lt 1 ]; then
    # 打印使用示例
    echo "必需有一个参数"
    echo "使用示例: xsync 目录"
    echo "意思是将指定目录同步到远程目录"
    exit
fi

# 2. 遍历所有服务器
# ******************注意:for循环这里,需要根据情况将机器列表改成相应的主机名******************

for host in $(cat ~/xsync.txt); do
    echo =======当前主机: "$host"=================
    # 3. 遍历所有目录并发送
    # $@: 获取所有参数
    echo ****************** 以列表形式显示所有的输入参数: "$@" ******************
    for file in "$@"; do
        # 4. 判断文件是否存在
        if [ -e "$file" ]; then
            # 5. 获取父目录
            pdir=$(
                cd -P $(dirname "$file") || exit
                pwd
            )
            echo ------父亲目录是: "$pdir"------
            # 6. 获取当前文件名
            fname=$(basename "$file")
            echo ----------------当前文件:"$fname"-----------
            # 在目标主机上创建父目录
            ssh "$host" "mkdir -p $pdir"               
            ## -a 表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
            ## -S 将空序列变成稀疏块
            ## -H 保留硬链结
            ## -P 断点续传并打印过程,
            rsync -aSHP "$pdir"/"$fname" "$host":"$pdir" # rsync同步文件到远程目录
        else
            echo "$file" 文件不存在!
        fi
    done
done

以调试模式运行

# 同步/usr/java/ 目录到 其他机器
## -xv 调试脚本
bash -xv ~/bin/xsync /usr/java/
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐