0

0

如何在Linux下使用rsync进行文件同步?高效备份与传输的实用指南

蓮花仙者

蓮花仙者

发布时间:2025-08-30 09:33:01

|

426人浏览过

|

来源于php中文网

原创

rsync通过差分同步算法仅传输文件变化部分,相比cp和scp在效率、带宽利用和增量备份上优势显著,特别适合大规模数据同步与远程镜像,结合--delete、--exclude、--checksum等选项可实现安全、精准、高效的文件管理,广泛应用于系统迁移、快照备份、低带宽分发等高级场景。

如何在linux下使用rsync进行文件同步?高效备份与传输的实用指南

rsync
在Linux下是进行文件同步、备份与传输的利器,它的核心优势在于智能地只传输文件发生变化的部分,而非整个文件。这使得它在处理大量数据、网络带宽有限或需要频繁同步的场景中,远比传统的
cp
scp
命令高效。无论是本地目录的镜像,还是远程服务器之间的数据迁移,
rsync
都能以其强大的功能和灵活的配置,提供一套可靠且高效的解决方案。

解决方案

使用

rsync
进行文件同步的基本语法是
rsync [选项] 源路径 目标路径
。这个命令的强大之处在于其背后的“差分同步”算法,它能识别出源文件和目标文件之间的差异,只传输有变化的数据块,极大减少了数据传输量。

基础同步操作:

最常用的选项组合是

-avh

  • -a
    (archive mode): 这是一个组合选项,等同于
    -rlptgoD
    。它会递归地复制目录,并保留符号链接、权限、时间戳、用户组、所有者以及设备文件。对于大多数备份和同步场景,这是首选。
  • -v
    (verbose): 显示详细的传输过程,让你知道哪些文件正在被同步。
  • -h
    (human-readable): 以人类可读的格式显示文件大小和传输速度。

本地目录同步示例: 假设你想将

/home/user/documents
目录下的所有内容同步到
/mnt/backup/documents

rsync -avh /home/user/documents/ /mnt/backup/documents/

注意源路径末尾的斜杠

/
。如果源路径是
/home/user/documents/
(带斜杠),
rsync
会同步
documents
目录内部的所有内容到目标目录。如果源路径是
/home/user/documents
(不带斜杠),
rsync
会把
documents
目录本身作为文件同步到目标目录中,即目标目录会创建
/mnt/backup/documents/documents
。这是一个小细节,但实际操作中很容易混淆,我个人就因此犯过几次小错,导致目标路径结构不符合预期。

远程服务器同步(推送到远程): 将本地文件推送到远程服务器。

rsync -avh /path/to/local/data/ user@remote_host:/path/to/remote/backup/

这会通过SSH协议将本地

/path/to/local/data/
的内容同步到
remote_host
上的
/path/to/remote/backup/

远程服务器同步(从远程拉取): 从远程服务器拉取文件到本地。

rsync -avh user@remote_host:/path/to/remote/data/ /path/to/local/backup/

关键高级选项:

  • --delete
    : 这个选项非常强大,但务必小心使用!它会删除目标路径中存在但源路径中不存在的文件。这对于创建精确的镜像非常有用,但如果操作不当,可能会导致数据丢失。我强烈建议在使用
    --delete
    之前,总是先用
    --dry-run
    (或
    -n
    )进行模拟运行,看看会发生什么。
  • --exclude=PATTERN
    :排除符合指定模式的文件或目录。例如,
    --exclude='*.tmp'
    会排除所有
    .tmp
    文件。
  • --include=PATTERN
    :包含符合指定模式的文件或目录。通常与
    --exclude
    配合使用,实现更精细的过滤。
  • -P
    (等同于
    --partial --progress
    ):显示传输进度,并在传输中断时保留部分传输的文件,方便下次续传。
  • -z
    (compress):在传输过程中压缩文件数据,对于带宽较慢的网络连接非常有效,但会增加CPU开销。
  • --bwlimit=KBPS
    : 限制
    rsync
    使用的网络带宽,单位是KB/s。这在共享网络环境中非常有用,可以避免
    rsync
    占用所有带宽。

rsync
与传统
cp
scp
命令有何本质区别?为何它更适合大规模同步?

从表面上看,

rsync
cp
scp
都能完成文件复制的任务,但它们的内在机制和适用场景却有着天壤之别。我个人认为,理解
rsync
的“智能”是掌握它的关键。

cp
命令是本地文件复制的基石,它简单粗暴,将源文件或目录的每一个字节都复制到目标位置。它不关心文件是否已存在,也不管文件内容是否相同,每次都进行完整复制。这在小文件或首次复制时没有问题,但当你需要频繁更新一个大目录,或者目录中只有少量文件发生变化时,
cp
的效率就显得非常低下,因为它做了大量不必要的重复工作。

scp
(Secure Copy Protocol)是基于SSH的文件复制工具,主要用于本地与远程服务器之间的文件传输。它比
cp
多了一层网络传输和加密的功能。然而,
scp
的本质仍然是“全量复制”。它每次传输文件时,都会将整个文件从源端复制到目标端,即使目标端已经存在一个完全相同或只有微小差异的文件。对于大文件或大量文件,尤其是网络状况不佳时,
scp
的效率同样令人沮丧。我曾遇到过需要同步几十GB日志文件的场景,如果用
scp
,那简直是灾难,每次都要重新传输所有数据。

rsync
的本质区别在于其核心的“Rsync算法”(或称“delta-transfer算法”)。这个算法允许
rsync
只传输文件发生变化的部分,而不是整个文件。它是这样工作的:

  1. 分块与校验:
    rsync
    会将文件分成固定大小的数据块,并为每个数据块计算一个校验和(checksum)。
  2. 快速比较: 在同步时,
    rsync
    首先在目标端计算文件的校验和。然后,它会将源端的校验和与目标端的校验和进行比较。如果一个数据块的校验和不同,或者目标端缺少这个数据块,那么只有这个不同的数据块才会被传输。
  3. 重建文件: 目标端接收到这些差异数据块后,结合本地已有的未变化数据块,就能高效地重建出完整的新文件。

正是这种“只传差异”的机制,让

rsync
在以下场景中表现出无与伦比的优势,使其更适合大规模同步:

  • 网络效率: 当源和目标之间通过网络连接时,
    rsync
    能显著减少传输的数据量,从而节省带宽和传输时间。对于慢速网络或高延迟连接,这一点尤为重要。
  • 增量备份:
    rsync
    是实现增量备份的理想工具。你可以定期运行
    rsync
    命令,它只会备份自上次备份以来发生变化的文件,大大加快了备份速度。
  • 目录镜像: 维护两个目录的完全一致性,
    rsync
    可以通过
    --delete
    选项轻松实现,确保目标目录是源目录的精确副本。
  • 断点续传: 结合
    -P
    选项,即使传输中断,
    rsync
    也能在下次运行时从上次中断的地方继续传输,避免了重新开始的麻烦。
  • 元数据保留:
    -a
    选项能够保留文件的权限、所有者、时间戳等元数据,这对于系统文件、代码库或网站内容的同步至关重要。

可以说,

rsync
不仅仅是一个复制工具,它更是一个智能的同步引擎,尤其是在处理大量数据或需要频繁更新的场景下,它的效率和灵活性是
cp
scp
无法比拟的。

如何确保
rsync
操作的安全性与数据完整性?

数据安全和完整性是任何文件操作的基石,

rsync
虽然强大,但如果不注意,也可能带来风险。在我的经验中,以下几点是确保
rsync
操作安全可靠的关键:

1. 远程操作的安全性:SSH是你的朋友

当进行远程同步时,

rsync
默认使用SSH作为其传输协议。SSH提供了强大的加密和认证机制,确保数据在传输过程中的机密性和完整性,同时防止未经授权的访问。

  • 使用SSH密钥对: 相比密码认证,SSH密钥对(公钥/私钥)提供了更高的安全性,并且可以实现无密码的自动化同步。确保你的私钥安全存放,并且只在必要时才授予访问权限。
  • 限制SSH用户权限:
    rsync
    操作创建一个专用的SSH用户,并限制该用户的权限,使其只能访问需要同步的特定目录,避免其拥有系统级的操作能力。
  • 配置SSH代理(如果需要): 在某些复杂的网络环境中,可能需要通过SSH代理或跳板机才能访问目标服务器。
    rsync
    可以通过
    -e "ssh -o ProxyCommand='ssh -W %h:%p jump_host'"
    这样的方式来配置。

2. 预防性措施:

--dry-run
--delete
的谨慎使用

  • --dry-run
    (
    -n
    ):
    这是我个人认为
    rsync
    最重要的安全选项。它会模拟整个同步过程,显示哪些文件会被传输、创建、更新或删除,但实际上不会做任何更改。在执行任何带有
    --delete
    或其他潜在破坏性操作的
    rsync
    命令之前,务必先使用
    --dry-run
    进行测试。这能让你提前发现潜在的错误,比如路径写错导致删除不该删除的文件,或者同步了不该同步的内容。
  • --delete
    的风险管理:
    rsync
    --delete
    选项可以保持目标目录与源目录的精确一致,删除目标中源不存在的文件。它的威力巨大,但也伴随着巨大的风险。一个错误的源路径或目标路径,可能导致重要数据被意外删除。除了
    --dry-run
    ,你还可以考虑:
    • --delete-excluded
      如果你使用了
      --exclude
      --delete-excluded
      会删除目标端那些被源端
      --exclude
      掉的文件。这在某些特定场景下很有用,但需要更深入的理解和测试。
    • --backup
      --backup-dir
      在删除文件之前,
      rsync
      可以将其备份到指定目录。这为误删提供了一层保护。例如,
      rsync -avh --delete --backup --backup-dir=/path/to/old_files /source/ /destination/

3. 数据完整性校验:

--checksum

  • --checksum
    (
    -c
    ):
    默认情况下,
    rsync
    通过文件大小和修改时间戳来判断文件是否需要同步。如果文件大小和时间戳都相同,
    rsync
    会认为文件未改变,跳过传输。但在某些特殊情况下(例如,文件内容被篡改但时间戳未更新,或者文件系统出现问题),这种判断可能不够严谨。
    --checksum
    选项会强制
    rsync
    对所有文件进行MD5校验和计算,即使大小和时间戳都匹配,也会进行内容比对。这能确保绝对的数据完整性,但会显著增加操作时间和CPU开销,尤其是在文件数量庞大时。我通常在对数据完整性要求极高、且不频繁执行的备份任务中使用它。

4. 权限与所有权:

rsync -a

rsync -a
(archive mode)包含了
-P
(preserve permissions)、
-o
(preserve owner)、
-g
(preserve group)等选项,确保文件和目录的权限、所有者和用户组在同步后保持不变。这对于系统配置、Web服务器文件或任何对权限敏感的数据都至关重要。如果权限不正确,应用程序可能无法正常运行。

5. 记录与审计:日志文件

LongCat AI
LongCat AI

美团推出的AI对话问答工具

下载

rsync
的输出重定向到日志文件是一个好习惯。这不仅能让你回顾每次同步的具体情况,还能在出现问题时提供排查线索。

rsync -avh /source/ /destination/ >> /var/log/rsync_sync.log 2>&1

结合

cron
定时任务,你可以轻松实现自动化日志记录。

6. 错误处理与脚本集成

rsync
命令执行完毕后,会返回一个退出码(exit code)。这个退出码可以用于在脚本中判断
rsync
操作是否成功,并据此执行后续操作或发送通知。例如,退出码0表示成功,非0则表示发生了错误。

rsync -avh /source/ /destination/
if [ $? -ne 0 ]; then
    echo "Rsync operation failed!" | mail -s "Rsync Error" admin@example.com
fi

通过这些措施,我们可以在享受

rsync
高效的同时,最大程度地保障数据的安全性和完整性,避免不必要的损失。

除了文件同步,
rsync
还能在哪些高级场景中发挥作用?

rsync
的魔力远不止于简单的文件复制。它的一些高级特性,在很多特定的运维和开发场景中,能发挥出令人惊喜的效用。

1. 智能增量备份(快照式备份):

--link-dest

这是我个人最喜欢且认为最强大的

rsync
高级功能之一。
--link-dest
选项允许你创建一系列空间高效的“快照式”增量备份。它的核心思想是:如果一个文件在当前备份中与前一个备份中的文件完全相同,
rsync
会创建一个硬链接到前一个备份中的文件,而不是复制一份新的。这意味着只有新文件和修改过的文件才会占用额外的存储空间。

工作原理: 假设你有一个

daily.0
(最新备份)、
daily.1
(前一天备份)等备份目录。 要创建新的
daily.0
备份,你可以这样做:

  1. 首先,将
    daily.0
    重命名为
    daily.1
    (或者将
    daily.1
    重命名为
    daily.2
    ,以此类推)。
  2. 然后,执行
    rsync
    命令,将源数据同步到新的
    daily.0
    目录,并指定
    --link-dest=/path/to/backups/daily.1
# 假设你的备份目录结构是 /backups/daily.0, /backups/daily.1, ...
# 准备新的备份目录
rm -rf /backups/daily.7 # 删除最旧的备份
mv /backups/daily.6 /backups/daily.7
mv /backups/daily.5 /backups/daily.6
# ...以此类推,直到 mv /backups/daily.0 /backups/daily.1

# 执行rsync创建新的daily.0
# 注意:--link-dest 路径必须是绝对路径,并且指向上一个完整备份的目录
rsync -avh --delete --link-dest=/backups/daily.1 /source/data/ /backups/daily.0/

通过这种方式,你可以维护多个历史版本的备份,而占用的总空间远小于每个版本都完整复制的情况。这对于需要保留多个时间点数据、同时又对存储空间敏感的场景,简直是神器。

2. 系统迁移与克隆:

rsync
可以用来将一个Linux系统的根文件系统完整地复制到另一个分区或另一台机器上,从而实现系统迁移或克隆。当然,这需要非常小心,因为涉及到系统核心文件。你需要排除一些不应该复制的特殊目录(如
/dev
/proc
/sys
/run
/tmp
等),并且在目标系统上重新配置引导加载程序(GRUB)和
fstab

# 从正在运行的系统复制到新分区(假设新分区挂载在 /mnt/new_root)
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/new_root

这种方法比使用

dd
命令更灵活,因为
dd
是块级复制,而
rsync
是文件级复制,可以适应不同大小的分区。

3. 低带宽环境下的数据分发:

当需要在多个地理位置分散的服务器之间同步大型数据集时,

rsync
的差分传输特性显得尤为重要。你可以设置一个中央存储库,然后让各个分支机构的服务器定期从中央库拉取更新,或者将本地数据推送到中央库。由于只传输差异,即使网络带宽有限,也能保证数据的高效分发。

4. 预填充云存储桶或远程存储:

在首次将大量数据上传到云存储服务(如S3、Azure Blob Storage)或远程NAS/SAN时,如果网络不稳定或带宽有限,直接上传可能会中断或非常耗时。你可以先用

rsync
将数据同步到一个临时的本地存储,然后将这个本地存储挂载到云服务,或者在本地进行预处理后,再使用
rsync
将数据传输到远程。即使是使用
s3cmd
azcopy
等工具,底层也常常利用了类似
rsync
的差分同步思想。

5. 复杂的文件过滤与选择性同步:

--include
--exclude
的组合

通过巧妙地组合

--include
--exclude
选项,
rsync
可以实现非常精细的文件选择性同步。例如,你可能只想同步某个目录下所有
.txt
.md
文件,但排除掉所有
node_modules
目录。

rsync -avh --include='*.txt' --include='*.md' --exclude='node_modules/' --exclude='*' /source/ /destination/

这里的逻辑是:先定义要包含的模式,然后排除所有其他文件(`--

相关专题

更多
数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.29

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

403

2023.08.14

cdn加速软件有哪些
cdn加速软件有哪些

CDN加速软件可以帮助网站提高内容访问速度和用户体验,降低服务器负载。在选择CDN加速软件时,需要根据实际需求和预算进行权衡,选择合适的软件和服务商。cdn加速软件有AWS CloudFront、Azure Content Delivery Network、Google Cloud CDN、Fastly、Cloudflare和Incapsula。

318

2023.10.19

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.6万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号