Rsync 命令详解:Linux 文件同步与备份的艺术
- [一、认识 rsync](#一、认识 rsync)
- 二、安装与基本语法
-
- [2.1 安装](#2.1 安装)
- [2.2 语法与斜杠陷阱](#2.2 语法与斜杠陷阱)
- 三、常用选项速查表
-
- [3.1 选项列表](#3.1 选项列表)
- [3.2 归档模式与常用组合](#3.2 归档模式与常用组合)
- 四、本地同步实战
- 五、远程同步:推与拉
-
- [5.1 推送(本地 → 远程)](#5.1 推送(本地 → 远程))
- [5.2 拉取(远程 → 本地)](#5.2 拉取(远程 → 本地))
- [5.3 使用非标准 SSH 端口](#5.3 使用非标准 SSH 端口)
- [六、镜像同步与 --delete](#六、镜像同步与 --delete)
-
- [6.1 实现严格镜像](#6.1 实现严格镜像)
- [6.2 安全变体](#6.2 安全变体)
- 七、增量备份与快照 (--link-dest)
-
- [7.1 硬链接快照原理](#7.1 硬链接快照原理)
- [7.2 自动化快照脚本](#7.2 自动化快照脚本)
- 八、过滤与排除规则
-
- [8.1 简单排除](#8.1 简单排除)
- [8.2 使用排除规则文件](#8.2 使用排除规则文件)
- [8.3 复杂包含与排除](#8.3 复杂包含与排除)
- 九、传输优化:限速与断点续传
-
- [9.1 带宽限制](#9.1 带宽限制)
- [9.2 断点续传](#9.2 断点续传)
- [十、rsync 守护进程模式](#十、rsync 守护进程模式)
- 十一、调试、日志与统计
- 十二、自动化备份脚本示例
- 十三、常见陷阱与最佳实践
-
- [13.1 斜杠陷阱](#13.1 斜杠陷阱)
- [13.2 --delete 双刃剑](#13.2 --delete 双刃剑)
- [13.3 文件时间导致重复传输](#13.3 文件时间导致重复传输)
- [13.4 超大目录处理](#13.4 超大目录处理)
- [13.5 rsync 与 SCP 的选择](#13.5 rsync 与 SCP 的选择)
- 十四、结语
一、认识 rsync
在 Linux 世界里,rsync 是一个几乎无法绕过的命令。无论是运维工程师的日常备份,还是开发者同步代码到服务器,它都能以最小的网络开销、最灵活的方式完成文件传输。rsync(remote sync)是一款开源的、快速的、多功能的文件同步工具,最核心的能力是增量传输------只传输源和目标之间的差异部分,从而大幅节省时间和带宽。同时它还能保持文件的权限、时间戳、软硬链接等元信息,常用于备份、镜像、部署等场景。
二、安装与基本语法
2.1 安装
大多数发行版已经预装了 rsync,如果没有:
bash
# Debian/Ubuntu
sudo apt install rsync
# RHEL/CentOS/Fedora
sudo dnf install rsync
2.2 语法与斜杠陷阱
基本语法非常简单:
bash
rsync [选项] 源路径 目标路径
- 源路径 :可以是本地目录/文件,也可以是远程地址,如
user@host:/path - 目标路径:同理
- 如果源路径末尾带有
/,表示同步该目录的内容 ;不带则同步目录本身。这是最常见的坑,务必将这一点刻在脑子里。
三、常用选项速查表
3.1 选项列表
下表列出最实用的选项,后续会逐一展开示例。
| 选项 | 长选项 | 作用 |
|---|---|---|
-a |
--archive |
归档模式,等于 -rlptgoD,保留几乎一切属性并递归 |
-v |
--verbose |
显示详细输出 |
-z |
--compress |
传输时压缩数据 |
-P |
--partial --progress |
显示进度,支持断点续传 |
-n |
--dry-run |
模拟运行,不实际同步(测试必备) |
--delete |
删除目标端比源端多出的文件,实现镜像同步 | |
--exclude |
排除匹配的文件/目录 | |
--include |
包含匹配的文件/目录 | |
-e |
--rsh |
指定远程 shell,如 -e "ssh -p 2222" |
--bwlimit |
限速,单位 KB/s,如 --bwlimit=5000 |
|
--link-dest |
硬链接增量备份的关键,指向一个参考目录 | |
--checksum |
-c |
基于文件校验和决定是否跳过,更准确但更慢 |
3.2 归档模式与常用组合
-a 是基石选项,它等价于 -rlptgoD,即递归、保留符号链接、权限、时间戳、组、所有者,以及设备文件等。日常使用中,-avzP 已经能覆盖 80% 的场景 ,但务必先用 -avn(即 dry-run)确认行为,尤其是涉及 --delete 时。
四、本地同步实战
将 project/ 目录完整同步到 /backup/project/,使备份成为源目录的精确副本:
bash
rsync -av --delete /home/user/project/ /backup/project/
注意源路径末尾的 /:它表示把 project/ 里面 的所有内容复制到 /backup/project/ 中。如果你写的是 /home/user/project(没有斜杠),那么会在 /backup/project/ 下再创建一个 project 子目录。
五、远程同步:推与拉
rsync 原生支持通过 SSH 进行远程传输,数据全程加密。
5.1 推送(本地 → 远程)
bash
rsync -avzP /local/data/ user@192.168.1.100:/remote/backup/
5.2 拉取(远程 → 本地)
bash
rsync -avzP user@192.168.1.100:/remote/logs/ /local/logs/
5.3 使用非标准 SSH 端口
bash
rsync -avzP -e "ssh -p 2222" /local/data/ user@remote:/backup/
六、镜像同步与 --delete
6.1 实现严格镜像
如果你希望目标目录是源目录的严格镜像 ,即删除目标中源没有的文件,必须加上 --delete:
bash
rsync -av --delete /www/live/ /www/deploy/
非常危险,务必先用 -n 测试:
bash
rsync -avn --delete /www/live/ /www/deploy/
6.2 安全变体
--delete-before:传输前删除--delete-after:传输后删除(默认行为)--delete-excluded:同时删除被排除的文件--delete-delay:延迟删除,减少 IO 开销
根据业务场景选择,但任何带有删除行为的操作都必须先在 dry-run 下验证。
七、增量备份与快照 (--link-dest)
7.1 硬链接快照原理
--link-dest 是 rsync 的"杀手级"功能。它可以创建一个类似 Time Machine 的硬链接快照:每次备份时,对未变化的文件只创建硬链接而不复制数据,从而在保留多份历史快照的同时只占用极少量的额外空间。
7.2 自动化快照脚本
假设你想每天在 /backup/ 下保留日期命名的快照:
bash
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y-%m-%d)
LATEST_LINK="$BACKUP_DIR/latest"
# 如果存在前一天的备份,则用它作为参考;否则不参考
if [ -d "$LATEST_LINK" ]; then
LINK_DEST="--link-dest=$LATEST_LINK"
fi
rsync -av --delete \
$LINK_DEST \
/home/user/important/ \
"$BACKUP_DIR/$DATE/"
# 更新 latest 符号链接为最新备份
rm -f "$LATEST_LINK"
ln -sf "$BACKUP_DIR/$DATE" "$LATEST_LINK"
即使备份了 30 天,未变化的文件也只占用一份磁盘空间,latest 总是指向最近一次成功备份。
八、过滤与排除规则
8.1 简单排除
排除特定文件或目录:
bash
rsync -av --exclude '*.log' --exclude '.git/' --exclude 'temp/' /src/ /dst/
8.2 使用排除规则文件
对于复杂的排除需求,可以编写规则文件:
bash
rsync -av --exclude-from='/etc/rsync-exclude.txt' /src/ /dst/
rsync-exclude.txt 示例:
*.tmp
.git/
node_modules/
.DS_Store
8.3 复杂包含与排除
rsync 采用先匹配先生效的原则。如果需要在整体排除的前提下包含某个子目录,可以这样:
bash
rsync -av --include='subdir/***' --exclude='*' /src/ /dst/
这里 *** 会匹配 subdir/ 下所有层级的内容。
九、传输优化:限速与断点续传
9.1 带宽限制
避免 rsync 吃满带宽,尤其在业务运行时段:
bash
rsync -avzP --bwlimit=1000 /large/data/ user@remote:/backup/
限速单位为 KB/s。
9.2 断点续传
-P 选项等同于 --partial --progress,会保留未传完的临时文件(通常以 .partial 结尾)。对于已经中断的传输,直接重跑同样的命令,rsync 会利用这些文件自动续传,非常适合大文件场景。
十、rsync 守护进程模式
除了 SSH 通道,rsync 还可以通过自己的守护进程通信,适合提供公共镜像或简化权限管理。服务端配置 /etc/rsyncd.conf:
[backup]
path = /data/backup
read only = no
auth users = backupuser
secrets file = /etc/rsyncd.secrets
客户端连接:
bash
rsync -av /local/files/ rsync://backupuser@server/backup/
必须将密码文件权限设为 600,生产环境下推荐配合防火墙和 chroot 限制路径。
十一、调试、日志与统计
- 模拟运行 :
-n或--dry-run永远是你最好的朋友。 - 查看更详细的信息 :可叠加多个
-v,如-vvv查看哪些文件被跳过以及原因。 - 记录日志 :使用
--log-file=/var/log/rsync.log将输出保存到文件。 - 统计摘要 :
--stats会在结尾输出文件数、传输量等汇总信息。
十二、自动化备份脚本示例
一个完整的、带错误通知的每日备份脚本:
bash
#!/bin/bash
set -e
SOURCE="/home/user"
DEST="backup@nas::daily"
LOG="/var/log/rsync-daily.log"
rsync -avzP --delete \
--exclude '.cache/' \
--exclude 'Downloads/' \
--log-file="$LOG" \
"$SOURCE/" "$DEST"
if [ $? -eq 0 ]; then
echo "Backup success" | mail -s "Backup OK" admin@example.com
else
echo "Backup failed" | mail -s "Backup FAILED" admin@example.com
fi
将此脚本加入 cron:
0 2 * * * /usr/local/bin/backup.sh
十三、常见陷阱与最佳实践
13.1 斜杠陷阱
源路径末尾的 / 会改变行为:src/ 同步内容,src 同步目录本身。每次使用前先用 -n 确认效果。
13.2 --delete 双刃剑
永远不要在未经 dry-run 验证的情况下对重要目标使用 --delete,建议与快照机制搭配。
13.3 文件时间导致重复传输
如果发现 rsync 每次都传输某些未变化的文件,可能是时间戳丢失或文件系统不支持。可尝试添加 --size-only 仅比较大小,或 -c 比较校验和。
13.4 超大目录处理
递归扫描海量文件时,rsync 会消耗大量内存。可考虑拆分任务,或使用 --delete-delay 减少 IO 压力。
13.5 rsync 与 SCP 的选择
scp适合一次性快速拷贝完整文件。rsync适合增量同步、定时任务和需要保留属性的场景。对海量小文件,rsync 的增量算法优势极为明显。
十四、结语
rsync 是"一次学习,终身受用"的命令行工具。从简单的本地备份,到跨公网的镜像分发,它都表现得可靠而高效。掌握本文中的选项和思维模型,你已经可以解决绝大部分文件同步难题。最后,再强调一次:先 dry-run,再执行。
如果你还有更深层的需求,比如 rsync 算法的工作原理、与 inotify 结合实现实时同步等,也欢迎深入探索。希望这篇重构后的指南能成为你手边最清晰的参考。