使用 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,虽然我最近没有使用它,但当我担任系统管理员时,我们确实使用它来备份运行 Red Hat Enterprise 的 Lotus Domino 服务器。我也编写了一个 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 脚本,也使用硬链接。结果非常相似,但不如您的看起来那么简洁……而且我需要手动进入并删除较旧的备份以释放空间……我还有一些功课要做!

很棒的文章!我只想指出 - 如果您正在使用不受您控制的服务器并计划使用带有 --delete 选项的 rsync,请确保它们存储相同的数据。如果其中一个服务器仅存储新数据并删除已同步的数据,那么如果您使用 --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 台带有可移动 SATA 驱动器(每个 2-4 TB)的旧 IBM 服务器,我将它们用作目标备份服务器。我每天早上更换 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.