似乎很明显,备份始终是 Linux 世界中的热门话题。早在 2017 年,David Both 就为 Opensource.com 的读者提供了关于“使用 rsync 备份您的 Linux 系统”的技巧,并在今年早些时候发布了一项民意调查,询问我们“您对 Linux 中的 /home 目录的主要备份策略是什么?”在今年的另一项民意调查中,Don Watkins 问道:“您使用哪种开源备份解决方案?”
我的回答是 rsync。我真的很喜欢 rsync!市场上有许多大型且复杂的工具,这些工具对于管理磁带驱动器或存储库设备可能是必要的,但一个简单的开源命令行工具可能就是您所需要的全部。
基本 rsync
我为一个全球性组织的二进制存储库系统进行管理,该组织大约有 35,000 名开发人员,拥有多个 TB 的文件。我定期移动或归档数百 GB 的数据。使用了 Rsync。这种经验让我对这个简单的工具充满信心。(所以,是的,我在家也用它来备份我的 Linux 系统。)
基本的 rsync 命令很简单。
rsync -av SRC DST
实际上,任何教程中教授的 rsync 命令在大多数一般情况下都可以正常工作。但是,假设我们需要备份非常大量的数据。例如,一个包含 2,000 个子目录的目录,每个子目录都包含 50GB 到 700GB 的数据。在此目录上运行 rsync 可能会花费大量时间,特别是如果您使用的是校验和选项(我更喜欢该选项)。
如果我们尝试同步大量数据或跨慢速网络连接进行同步,性能可能会受到影响。让我向您展示我使用的一些方法,以确保良好的性能和可靠性。
高级 rsync
rsync 运行时出现的第一行之一是:“发送增量文件列表”。如果您搜索此行,您会看到许多问题,例如:为什么需要这么长时间?或者为什么看起来挂起了?
这是一个基于此场景的示例。假设我们有一个名为 /storage 的目录,我们想要将其备份到安装在 /media/WDPassport 的外部 USB 设备。
如果我们想将 /storage 备份到 USB 外部驱动器,我们可以使用此命令
rsync -cav /storage /media/WDPassport
c 选项告诉 rsync 使用文件校验和而不是时间戳来确定已更改的文件,这通常需要更长的时间。为了分解 /storage 目录,我按子目录同步,使用 find 命令。这是一个例子
find /storage -type d -exec rsync -cav {} /media/WDPassport \;
这看起来不错,但是如果 /storage 目录中有任何文件,它们将不会被复制。那么,我们如何同步 /storage 中的文件呢?还有一个小的细微差别,某些选项会导致 rsync 同步 . 目录,它是源目录的根目录;这意味着它将同步子目录两次,而我们不希望这样。
长话短说,我最终确定的解决方案是“双增量”脚本。这使我可以分解目录,例如,将 /home 分解为各个用户的主目录,或者在您有多个大型目录(例如音乐或家庭照片)的情况下。
这是我的脚本示例
HOMES="alan"
DRIVE="/media/WDPassport"
for HOME in $HOMES; do
cd /home/$HOME
rsync -cdlptgov --delete . /$DRIVE/$HOME
find . -maxdepth 1 -type d -not -name "." -exec rsync -crlptgov --delete {} /$DRIVE/$HOME \;
done
第一个 rsync 命令复制源目录中找到的文件和目录。但是,它使目录为空,以便我们可以使用 find 命令遍历它们。这是通过传递 d 参数完成的,该参数告诉 rsync 不要递归目录。
-d, --dirs transfer directories without recursing
然后 find 命令将每个目录单独传递给 rsync。然后 Rsync 复制目录的内容。这是通过传递 r 参数完成的,该参数告诉 rsync 递归目录。
-r, --recursive recurse into directories
这使 rsync 用于管理大小的增量文件。
大多数 rsync 教程都使用 a (或 archive)参数以方便使用。这实际上是一个复合参数。
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
我传递的其他参数将包含在 a 中;这些参数是 l、p、t、g 和 o。
-l, --links copy symlinks as symlinks
-p, --perms preserve permissions
-t, --times preserve modification times
-g, --group preserve group
-o, --owner preserve owner (super-user only)
--delete 选项告诉 rsync 删除目标上不再存在于源上的任何文件。这样,结果就是一个精确的副本。您还可以为 .Trash 目录或 MacOS 创建的 .DS_Store 文件添加排除项。
-not -name ".Trash*" -not -name ".DS_Store"
小心
最后一个建议:rsync 可能是一个破坏性命令。幸运的是,其周到的创建者提供了进行“空运行”的能力。如果我们包含 n 选项,rsync 将显示预期输出,而不会写入任何数据。
rsync -cdlptgovn --delete . /$DRIVE/$HOME
此脚本可扩展到非常大的存储大小和大型延迟或慢速链接情况。我确信仍然有改进的空间,就像总是这样。如果您有任何建议,请在评论中分享。
1 条评论