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

相关推荐
德迅云安全-上官3 分钟前
服务器遭攻击如何快速响应?从技术原理到接入防御架构的实战指南
运维·服务器·架构
我命由我123454 分钟前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee
倔强的石头10612 分钟前
【Linux指南】进程通信系列(四):命名管道 FIFO —— 让陌生进程按名字见面
linux·服务器·网络
段一凡-华北理工大学23 分钟前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章03:热风炉烧炉与风温的决定因素
大数据·linux·人工智能·能源·热风炉·高炉能源优化
_小许_24 分钟前
Linux 常用命令速查:CentOS 与 Ubuntu 双线对照
linux·ubuntu·centos
A-刘晨阳27 分钟前
同一句需求优化前后差多少?Prompt Optimizer先整理提示词,再用同一个模型直接对比结果
运维·prompt·cpolar
开开心心就好42 分钟前
证件照排版打印工具,免费可自定义尺寸
服务器·开发语言·算法·随机森林·pdf·音视频·散列表
李纲明1 小时前
WordPress 结账页一直转圈不跳支付:AJAX、缓存排除、支付回调和 REST 怎么逐层核
运维·ajax·缓存·wordpress·woocommerce·devdiy·结账
fengkai45451 小时前
7、Kubernetes的Ingress&Network&Scheduler
运维·kubernetes·k8s·ingress·network·scheduler
码农客栈1 小时前
mt7601u移植
linux·运维·服务器