使用 rsync 备份你的 Linux 系统

了解如何在备份场景中使用 rsync。
629 位读者喜欢这篇文章。
Hard drives

WIlliam Warby。Jason Baker 修改。Creative Commons BY-SA 2.0。

备份是系统管理员工作中极其重要的一个方面。如果没有良好的备份以及周密的备份策略和流程,那么迟早会发生一些关键数据无法挽回地丢失的情况,这几乎是肯定的。

所有公司,无论规模大小,都依靠数据运营。考虑一下丢失运行业务所需的所有数据所造成的财务和业务成本。如今,从最小的个体户到最大的全球公司,没有哪家企业能够承受全部甚至大部分数据的丢失。你的营业场所可以用保险重建,但你的数据永远无法重建。

这里说的丢失,我不是指数据被盗;那是一种完全不同类型的灾难。我在这里指的是数据的完全损毁。

即使你只是个人用户,而不是经营大型公司,备份数据也非常重要。我有二十年的个人财务数据,以及我现在已关闭的企业的财务数据,包括大量的电子收据。我还拥有多年来创建的许多各种类型的文档、演示文稿和电子表格。我真的不想丢失所有这些数据。

因此,备份对于确保我的数据的长期安全至关重要。

备份选项

有很多选项可以执行备份。大多数 Linux 发行版都提供了一个或多个专门设计用于执行备份的开源程序。也有许多商业选项可供选择。但是,这些选项都不能直接满足我的需求,所以我决定使用基本的 Linux 工具来完成这项工作。

在我去年为《开源年鉴》撰写的文章 2015 年最佳拍档:tar 和 ssh 中,我表明,设计和实施可行的备份程序并不一定需要花哨而昂贵的备份程序。

自去年以来,我一直在尝试另一种备份选项,即 rsync 命令,它有一些非常有趣的功能,我可以很好地利用这些功能。我的主要目标是创建备份,用户可以从中定位和恢复文件,而无需解压备份 tarball,并减少创建备份所需的时间。

本文仅旨在描述我自己如何在备份场景中使用 rsync。它不是对 rsync 的所有功能或其多种使用方式的考察。

rsync 命令

rsync 命令由 Andrew Tridgell 和 Paul Mackerras 编写,于 1996 年首次发布。rsync 的主要目的是远程同步一台计算机上的文件与另一台计算机上的文件。你注意到他们是如何命名的吗?rsync 是开源软件,几乎所有主要发行版都提供它。

rsync 命令可用于同步两个目录或目录树,无论它们是在同一台计算机上还是在不同的计算机上,但它的功能远不止于此。rsync 创建或更新目标目录,使其与源目录相同。目标目录可以被所有常用的 Linux 工具自由访问,因为它不是存储在 tarball 或 zip 文件或任何其他归档文件类型中;它只是一个普通的目录,其中包含普通文件,普通用户可以使用基本的 Linux 工具进行导航。这满足了我的主要目标之一。

rsync 最重要的功能之一是它用于同步源目录中已更改的现有文件的方法。它不是从源复制整个文件,而是使用校验和来比较源文件和目标文件的块。如果两个文件中的所有块都相同,则不传输任何数据。如果数据不同,则仅将源上已更改的块传输到目标。这为远程同步节省了大量时间和网络带宽。例如,当我第一次使用我的 rsync Bash 脚本将所有主机备份到大型外部 USB 硬盘驱动器时,花了大约三个小时。那是因为所有数据都必须传输。随后的同步花费了 3-8 分钟的实际时间,具体取决于自上次同步以来更改或创建了多少文件。我使用 time 命令来确定这一点,所以这是经验数据。例如,昨晚,从六个远程系统和本地工作站同步大约 750GB 的数据只花了三分多钟。当然,实际上只有几百兆字节的数据在白天被更改并且需要同步。

以下简单的 rsync 命令可用于同步两个目录及其任何子目录的内容。也就是说,目标目录的内容与源目录的内容同步,以便在同步结束时,目标目录与源目录相同。

rsync -aH sourcedir targetdir

-a 选项用于归档模式,该模式保留权限、所有权和符号(软)链接。-H 用于保留硬链接。请注意,源目录或目标目录都可以位于远程主机上。

现在,假设我们昨天使用 rsync 同步了两个目录。今天我们要重新同步它们,但是我们从源目录中删除了一些文件。rsync 的正常工作方式是简单地将所有新的或更改的文件复制到目标位置,并将已删除的文件保留在目标位置。这可能是你想要的行为,但如果你希望从源中删除的文件也从目标中删除,则可以添加 --delete 选项来实现此目的。

另一个有趣的选项,也是我个人最喜欢的选项,因为它极大地提高了 rsync 的功能和灵活性,是 --link-dest 选项。--link-dest 选项允许一系列每日备份,每天占用非常少的额外空间,并且创建时间也很短。

使用此选项指定前一天的目标目录和今天的新目录。然后 rsync 创建今天的新目录,并在今天的目录中为昨天目录中的每个文件创建一个硬链接。因此,我们现在在今天的目录中有一堆指向昨天文件的硬链接。没有创建或复制任何新文件。只是创建了一堆硬链接。维基百科对 硬链接 有很好的描述。在使用这组指向昨天目标目录的硬链接创建今天的目标目录后,rsync 像往常一样执行同步,但是当检测到文件中的更改时,目标硬链接将被昨天文件的副本替换,然后将文件的更改从源复制到目标。

所以现在我们的命令如下所示。

rsync -aH --delete --link-dest=yesterdaystargetdir sourcedir todaystargetdir

有时也希望从同步中排除某些目录或文件。为此,有 --exclude 选项。使用此选项和你要排除的文件或目录的模式。你可能想排除浏览器缓存文件,所以你的新命令将如下所示。

rsync -aH --delete --exclude Cache --link-dest=yesterdaystargetdir sourcedir todaystargetdir

请注意,你要排除的每个文件模式都必须有一个单独的 exclude 选项。

rsync 可以将远程主机作为源或目标来同步文件。对于下一个示例,让我们假设源目录位于主机名为 remote1 的远程计算机上,目标目录位于本地主机上。即使 SSH 是将数据传输到远程主机或从远程主机传输数据时使用的默认通信协议,我总是添加 ssh 选项。命令现在如下所示。

rsync -aH -e ssh --delete --exclude Cache --link-dest=yesterdaystargetdir remote1:sourcedir todaystargetdir

这是我的 rsync 备份命令的最终形式。

rsync 有非常多的选项,你可以使用这些选项来自定义同步过程。在大多数情况下,我在这里描述的相对简单的命令非常适合满足我的个人备份需求。请务必阅读 rsync 的详细手册页,以了解有关其更多功能以及此处讨论的选项的信息。

执行备份

我自动化了我的备份,因为——“自动化一切”。我编写了一个 BASH 脚本,用于处理使用 rsync 创建一系列每日备份的详细信息。这包括确保备份介质已挂载、生成昨天和今天的备份目录的名称、在备份介质上创建适当的目录结构(如果它们尚不存在)、执行实际备份和卸载介质。

我每天清晨作为 cron 作业运行该脚本,以确保我永远不会忘记执行备份。

我的脚本 rsbu 及其配置文件 rsbu.conf 可在 https://github.com/opensourceway/rsync-backup-script 获取

恢复测试

如果没有测试,任何备份方案都是不完整的。你应该定期测试随机文件或整个目录结构的恢复,以确保不仅备份工作正常,而且备份中的数据可以在灾难后恢复使用。我见过太多备份无法恢复的情况,原因各不相同,由于缺乏测试,未能发现问题,导致宝贵的数据丢失。

只需选择要测试的文件或目录,然后将其恢复到测试位置,例如 /tmp,这样你就不会覆盖自备份执行以来可能已更新的文件。验证文件的内容是否符合你的预期。从使用上述 rsync 命令制作的备份中恢复文件,只需找到你要从备份中恢复的文件,然后将其复制到你要恢复到的位置即可。

我曾遇到过几次必须恢复单个文件的情况,偶尔也需要恢复完整的目录结构。大多数时候,这是我自己造成的,因为我不小心删除了文件或目录。至少有几次是由于硬盘驱动器崩溃造成的。所以这些备份确实派上了用场。

最后一步

但是,仅仅创建备份并不能拯救你的业务。你需要定期备份,并将最新的副本保存在异地,即尽可能不在同一栋建筑物内,甚至不在你的营业场所几英里范围内。这有助于确保大规模灾难不会摧毁你的所有备份。

对于大多数小型企业来说,一个合理的选择是在可移动介质上进行每日备份,并在晚上将最新的副本带回家。第二天早上,将较旧的备份带回办公室。你应该有几个轮换备份副本。更好的做法是将最新的备份送到银行,并将其放入你的保险箱,然后带着前一天的备份返回。

标签
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演说家。自 1996 年以来,他一直从事 Linux 和开源软件方面的工作,自 1969 年以来一直从事计算机方面的工作。他是“系统管理员 Linux 哲学”的坚定支持者和传播者。

21 条评论

David,文章写得太棒了!我喜欢 rsync,虽然我最近没有使用它,但当我担任系统管理员时,我们确实使用它来备份我们的 Lotus Domino 服务器,该服务器运行 Red Hat Enterprise。我也编写了一个 bash 脚本来做到这一点,它完美地工作。我们确实经历过一次灾难性的磁盘故障,有了我们拥有的备份,我们完全准备好恢复我们完整的电子邮件数据。

如果你想保留几天的备份,你的存储需求将随着这种方法而急剧增长。一个名为 rdiff-backup 的工具,基于 rsync,可以解决这个问题。

同意,我使用 rdiff-backup 是因为我发现我的 rsync 备份被旧文件搞得乱七八糟,有时缺乏版本化的备份会成为问题。我是 rdiff-backup 的忠实粉丝。我不认为它实际上利用了 rsync 本身,而是 librsync。这是一个很棒的工具。

回复 作者 WRD (未验证)

我认为 rsync 很棒,但像 dar、attic、bup、rdiff-backup 或 obnam 这样的工具更好。我使用 obnam,因为它使用“快照备份”进行重复数据删除。
完全公开:我是该项目的一部分(手册的翻译者)。

回复 作者 WRD (未验证)

感谢分享,
你使用什么代码来处理昨天/今天的源?
给我们看看脚本!))

我很乐意分享我的脚本,因为它是 GPL 授权的。我只需要使其可供下载,当它可用时,我将在此文章中添加另一条评论。

感谢你的关注。

回复 作者 Vicvicvic (未验证)

我想评论一下异地备份。在 20 世纪 70 年代,我是一名 IT 经理,我为我工作的公司建立了一个备份和恢复系统。最初,我按照本文的建议设置了异地备份。最新的备份通过公司快递在一夜之间运送到 90 英里外的另一个城市的异地位置。最新的现场备份是 -1 代备份,快递员在早上 8:00 之前将其带回。

该系统在恢复方面存在一个大问题。当我们需要恢复文件时,我们要么必须派人往返 180 英里去取回备份,要么恢复 -1 备份并重新运行所有必要的操作以使恢复的文件保持最新。

在几次因生产故障导致恢复时间过长而造成长时间延迟后,我修改了系统。我们复制了各种备份作业,并将一份当前备份发送到异地,并将一份保留在现场。这种修改比原始备份和恢复系统设计效果好得多。

------------------------------
Steve Stites

感谢你发布你的代码,David。我对你是如何制定旧存档清理例程特别感兴趣。我有一个类似的 bash/rsync 脚本,也使用硬链接。结果非常相似,但不如你的脚本看起来那么简洁……而且我需要手动进入并删除旧备份以释放空间……我还有一些学习要做!

很棒的文章!我只想指出 - 如果你正在处理不受你控制的服务器并计划将 rsync 与 --delete 选项一起使用,请确保它们存储相同的数据。如果其中一个服务器仅存储新数据并删除已同步的数据,那么如果你使用 --delete 选项,可能会是一场灾难。

干杯!

rsnapshot……它使用 rsync 进行备份,设置非常好。

rsync(底层)唯一真正的问题是,对于大型文件系统和慢速链接上的远程系统,它仍然可能需要相当长的时间。你可能还想考虑快照(不仅是 rsnapshot 快照,还有文件系统快照)。

我们还可以提及 lsyncd,它是一个“类似实时 rsync”的工具,可以实时同步,为同步的另一种用法开辟了道路。

多年前,我一直在使用一个名为 SnapBack2 的工具,它基本上以你描述的方式使用 rsync,包括每日、每周和每月轮换的快照目录。

我已经不习惯使用它了,但我写了一个关于如何设置它的操作指南,我可能应该再次遵循它:http://www.gbgames.com/blog/2005/05/snapback2-how-to/

我结合使用 DropBox 和 SpiderOak 来异地备份各种东西,但并非我关心的所有东西都备份到这些服务,我不应该再拖延设置自动化备份系统来试探命运了。

当 rsync-ing 到 USB(或任何其他)硬盘驱动器时,仍然需要读取两个磁盘上的所有数据。加速可能是因为“记住”了自上次写入磁盘以来更改的内容。

自 2010 年以来,我一直使用 Rsync 来备份服务器。这是一种很棒的备份方式,与商业备份系统相比,性价比非常高。我用它来备份 Linux 和 Windows 机器,甚至曾经备份过 Netware 6.5 服务器(这很有趣,因为 Netware 的命令行处理能力很弱)。

我有 4 台旧的 IBM 服务器,带有可移动 SATA 驱动器(每个 2-4 TB),我用作目标备份服务器。我每天早上更换 SATA 驱动器。使用 4 台服务器有助于在备份运行时分散负载,尽管我确实必须在编写脚本时手动指定哪个备份转到哪个服务器。(这确实在还原时造成了一些问题,因为我必须记住给定的文件或目录备份到哪里了。所以这种方法存在缺点。)

购买足够的 SATA 驱动器和更换托架/载体以拥有 2 周的周一至周四磁盘,以及另外 9 个用于周五的磁盘(2 个月的周五),然后为所有 4 台备份服务器执行此操作,也需要花费相当多的钱。但恕我直言,这是值得的,因为它提供了(大多数)文件的许多副本。

另一个好处是,SATA 备份磁盘可以安装在任何 Linux 机器中,并且无需任何软件(或许可证密钥)即可检索文件,只需使用普通的 Linux 工具即可。无需再等待从某个巨大的目录文件中检索文件列表,只需从正确的目录复制所需的文件,还原就完成了。

我使用 Rsync 遇到的最大问题是重试卡住或失败的文件。Rsync 为此提供了选项,但恕我直言,它们与商业备份程序中的选项不在同一水平线上。这是我一直想深入研究的事情之一,但是,嗯,已经 7 年了,我还没有这样做。

我已经使用 rsync 和硬链接、轮换目录十多年了。我编写了一个 bash 脚本,该脚本在插入 USB 驱动器时自动运行备份,或者可以通过 cronjob 备份到本地驱动器 - 只需在 /etc/cron.daily 中创建一个指向脚本可执行文件的符号链接即可。一个人可以使用 make(不寒而栗)安装它,或者将其构建为 RPM 并安装它。它有完善的文档记录,并且易于配置,可以配置应备份哪些目录、何时备份以及应保留多少轮换。

该代码以前在 sourceforge(再次不寒而栗)、googlecode 上,但我刚刚将其上传到我的 github 帐户,在这里

https://github.com/yocum137/ddback

请享用!

David,做得好,内容很棒!

很棒的文章,BTRFS 可以成为理想的补充,比 RSYNC 管理的链接做得更好。
我一直在我的家庭系统上试验 RSYNC 和 BTRFS 几个月了。
- RSYNC 负责优化文件传输。
- BTRFS 负责优化存储,具有可直接用于备份标准功能的高级功能。

每日备份映像通过快照和重复数据删除功能(子卷)完成
FS 损坏非常困难,因为写入时复制功能本身就有效率地参与了日志记录。
压缩允许避免 ZIP,并且备份结构是你文章中提出的源的镜像。
你还可以通过添加磁盘轻松实现高可用性备份存储,BTRFS 本身就知道如何将它们组织成 RAID10 集群(或其他 RAID 类型)
BTRFS 中还有许多其他很棒的功能。有了这两个工具,你可以以廉价且简单的方式完成大型备份工具所做的事情。

我也喜欢 LSyncd,它也可以进行实时同步,或者你可以将同步延迟到指定的时间跨度。我有一台服务器存储存档材料,LSyncd 将这些文件同步到第二台服务器作为备份,前提是第二台服务器在网络上。这是一个即时同步非常有效的使用案例。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.