Linux rsync 文件同步实用指南

rsync 是 Linux 上常用的文件同步工具。它会比较源端和目标端文件的大小、修改时间等信息,只传输发生变化的内容,适合本机备份、服务器之间同步和定时任务。

本文以 /home/admin123/miniodata/events/wf/ 为源目录、/home/admin123/huawei/ 为目标目录,介绍本机同步和通过 SSH 远程同步。执行命令前,请将示例路径和用户名替换为实际值。

重要提示

  • 第一次执行实际同步前,先使用 --dry-run 预览变更。
  • 源路径末尾的 / 会影响目录层级,本文会专门说明。
  • --delete 会删除目标端多余文件,只有确认目标端应当完全镜像源端时才使用。

一、安装与检查

检查是否已经安装:

1
rsync --version

Ubuntu/Debian:

1
2
sudo apt update
sudo apt install -y rsync

RHEL/CentOS/Fedora:

1
sudo dnf install -y rsync

如果系统只有 yum,可以执行:

1
sudo yum install -y rsync

检查源目录和目标目录是否存在:

1
2
test -d /home/admin123/miniodata/events/wf/ && echo '源目录存在'
sudo mkdir -p /home/admin123/huawei/

二、理解源路径末尾的斜杠

源路径是否以 / 结尾会决定复制结果:

1
rsync -av /source/ /destination/

将 source 目录中的内容同步到 destination,结果类似:

1
/destination/file.txt
1
rsync -av /source /destination/

将整个 source 目录同步到 destination,结果类似:

1
/destination/source/file.txt

如果目标目录就是源目录内容的镜像,通常应在源路径末尾加 /。

三、本机目录同步

3.1 先预览同步结果

-n 或 --dry-run 只显示将要执行的操作,不会修改目标目录。建议第一次同步或修改参数后先执行:

1
2
3
rsync -avhn --itemize-changes \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

参数说明:

参数 作用
-a 归档模式,递归同步并保留常见的权限、时间、软链接等属性
-v 输出详细同步过程
-h 使用易读的大小单位
-n 试运行,不实际修改文件
--itemize-changes 按行显示每个文件发生的变化

确认输出的文件和目标路径无误后,再执行实际同步:

1
2
3
rsync -avh --info=progress2 \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

--info=progress2 会显示整体传输进度。也可以使用 --progress 查看每个文件的进度。

3.2 权限不足时的处理

如果源目录或目标目录只有 root 可以访问,请使用 sudo:

1
2
3
sudo rsync -avh --info=progress2 \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

普通用户同步时,如果不需要保留文件属主和属组,可以关闭归档模式中对应的属性:

1
2
3
rsync -avh --no-owner --no-group \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

四、通过 SSH 同步到远程服务器

4.1 预检查 SSH 连接

先确认当前服务器可以通过 SSH 登录远程主机:

1
ssh user@192.0.2.10

如果使用非默认端口,例如 2222,连接命令为:

1
ssh -p 2222 user@192.0.2.10

4.2 同步到远程服务器

远程目标目录必须是远程用户有写权限的目录。先创建目录:

1
ssh user@192.0.2.10 'mkdir -p /data/backup/events/wf'

预览远程同步:

1
2
3
rsync -avhn --itemize-changes \
/home/admin123/miniodata/events/wf/ \
user@192.0.2.10:/data/backup/events/wf/

确认无误后执行:

1
2
3
rsync -avh --info=progress2 \
/home/admin123/miniodata/events/wf/ \
user@192.0.2.10:/data/backup/events/wf/

远程 SSH 使用非默认端口时,通过 -e 指定 SSH 命令:

1
2
3
4
rsync -avh --info=progress2 \
-e 'ssh -p 2222' \
/home/admin123/miniodata/events/wf/ \
user@192.0.2.10:/data/backup/events/wf/

4.3 从远程服务器同步到本机

源和目标位置调换即可:

1
2
3
rsync -avh --info=progress2 \
user@192.0.2.10:/data/backup/events/wf/ \
/home/admin123/miniodata/events/wf/

五、常用同步场景

5.1 排除目录或文件

使用 --exclude 排除缓存、临时文件等内容:

1
2
3
4
5
rsync -avh \
--exclude='*.tmp' \
--exclude='cache/' \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

规则相对源目录匹配。多个排除规则较多时,建议写入文件:

1
2
3
4
5
6
7
8
9
cat > /tmp/rsync-exclude.txt <<'EOF'
*.tmp
cache/
*.log
EOF

rsync -avh --exclude-from=/tmp/rsync-exclude.txt \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

5.2 目标端完全镜像源端

--delete 会删除目标端存在、但源端不存在的文件。必须先预览:

1
2
3
rsync -avhn --delete --itemize-changes \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

确认删除列表正确后,才执行:

1
2
3
rsync -avh --delete --info=progress2 \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

5.3 保留部分传输文件并设置超时

网络不稳定或文件较大时,可以保留中断产生的临时文件,并设置连接超时:

1
2
3
rsync -avhP --timeout=60 \
/home/admin123/miniodata/events/wf/ \
user@192.0.2.10:/data/backup/events/wf/

-P 等价于 --partial --progress。不要将 --partial 产生的临时文件误认为已经完成的文件。

5.4 限制带宽

单位为 KiB/s。例如限制为每秒 10 MiB:

1
2
3
rsync -avh --bwlimit=10240 \
/home/admin123/miniodata/events/wf/ \
user@192.0.2.10:/data/backup/events/wf/

六、同步结果验证

查看目标目录内容和文件数量:

1
2
find /home/admin123/huawei/ -type f | wc -l
du -sh /home/admin123/miniodata/events/wf/ /home/admin123/huawei/

需要按文件内容校验时,使用 -c 或 --checksum。该选项会读取文件内容计算校验和,比默认比较大小和修改时间更耗时:

1
2
3
rsync -avhnc --itemize-changes \
/home/admin123/miniodata/events/wf/ \
/home/admin123/huawei/

如果没有输出需要更新的文件,说明两端文件内容一致。远程同步时,将目标路径替换为 SSH 地址即可。

七、定时同步示例

使用当前用户的 crontab,每 30 分钟执行一次同步:

1
crontab -e

加入:

1
*/30 * * * * /usr/bin/rsync -a --delete /home/admin123/miniodata/events/wf/ /home/admin123/huawei/ >> /home/admin123/rsync.log 2>&1

配置定时任务前,务必先手动执行相同的 rsync 命令并确认权限。如果通过 SSH 同步,建议配置 SSH 密钥认证,并在 cron 中使用绝对路径和 -e 'ssh -i /path/to/private_key'。

八、常见问题

rsync: command not found

说明未安装 rsync,重新执行本文“安装与检查”中的对应命令。

Permission denied

检查当前用户是否同时拥有源目录的读取权限和目标目录的写入权限:

1
2
namei -l /home/admin123/miniodata/events/wf/
ls -ld /home/admin123/miniodata/events/wf/ /home/admin123/huawei/

必要时使用 sudo,或调整目录权限。远程同步还需要确认远程用户对目标目录有写权限。

No such file or directory

检查本地路径、远程路径和目录大小写。远程目标目录可以先创建:

1
ssh user@192.0.2.10 'mkdir -p /data/backup/events/wf'

SSH 连接失败

单独执行 SSH 命令确认网络、端口和账号都正确:

1
ssh -vv user@192.0.2.10

如果 SSH 使用非默认端口,请在 rsync 中同步增加 -e 'ssh -p 端口号'。

九、常用参数速查

参数 作用
-a, --archive 归档模式,常用于目录同步
-v, --verbose 显示详细信息
-h, --human-readable 使用易读的大小单位
-n, --dry-run 试运行,不修改文件
-r, --recursive 递归同步子目录
-t, --times 保留修改时间
-p, --perms 保留权限
-l, --links 保留符号链接
-P 保留部分文件并显示进度
-e COMMAND 指定远程 shell,例如 SSH 端口
--delete 删除目标端多余文件,使用前必须预览
--exclude=PATTERN 排除匹配的文件或目录
--checksum 使用文件内容校验和比较,速度较慢
--bwlimit=RATE 限制传输带宽
--timeout=SECONDS 设置 I/O 超时时间

Linux rsync 文件同步实用指南
https://jgq12138.github.io/2023/06/19/linux_rsync/
作者
JGQ12138
发布于
2023年6月19日
许可协议