使用 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.