Rsync 命令详解:Linux 文件同步与备份的艺术

Rsync 命令详解:Linux 文件同步与备份的艺术

一、认识 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 下验证。

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 结合实现实时同步等,也欢迎深入探索。希望这篇重构后的指南能成为你手边最清晰的参考。

相关推荐
真实的菜1 小时前
Redis 从入门到精通(十三):性能优化与运维实战 —— 慢查询、内存优化、监控与安全
运维·redis·性能优化
j_xxx404_2 小时前
MySQL库操作硬核解析:字符集、校验规则、大小写比较、备份恢复与连接排查
运维·服务器·数据库·人工智能·mysql·ai·oracle
拾贰_C2 小时前
【python | installation 】python 安装 | Windows | 命令使用
linux·数据库·ubuntu
机汇五金_2 小时前
影响交换机箱体使用寿命的几个关键因素
运维·服务器·网络·python
bkspiderx2 小时前
Boa Web服务器HTTPS支持的源码改造方案
服务器·前端·https·web服务器·boa·https支持
无限进步_2 小时前
Linux进程终止——退出码、exit与_exit
linux·运维·服务器
编程大师哥2 小时前
最高效的 IO 并发方案
linux·网络·python
炘爚3 小时前
phase1:基础框架——编译 + MySQL + 登录/注册
linux·c++
小蜗子3 小时前
Windows 11 + RTX 5060 + WSL2 Ubuntu + NVIDIA DGL 容器
linux·运维·ubuntu