![从 ext4 备份到 ZFS 的正确 rsync 标志](https://linux22.com/image/1464798/%E4%BB%8E%20ext4%20%E5%A4%87%E4%BB%BD%E5%88%B0%20ZFS%20%E7%9A%84%E6%AD%A3%E7%A1%AE%20rsync%20%E6%A0%87%E5%BF%97.png)
我有一台运行 Ubuntu 14.04.3 LTS 并带有文件系统的家庭服务器ext4
,我定期将各种设备的数据备份到该服务器。
现在我已经设置了一个ZFS
带文件系统的外部 USB 硬盘,并希望将家庭服务器中的所有数据备份到该 USB 驱动器上。由于我使用的是ZFS
外部驱动器,因此我也想使用 的ZFS
快照功能。
因为我要将文件从 复制ext4
到ZFS
,所以我无法使用该zfs send
命令。因此我只能使用rsync
。
我已经使用了rsync
一段时间了,所以我相当熟悉它。但,因为我将在目标文件系统上执行快照,所以我希望尽可能少地浪费空间。
我碰到这篇博文使用以下命令:
/usr/bin/rsync -axH --no-whole-file --inplace --delete / /$backup_target/root/
除了常见的标志如-a
、-x
和之外,--delete
它还使用:
-H
(硬链接),--no-whole-file
(强制启用 delta-xfer 算法),以及--inplace
(更新文件夹而不是制作新的备份)。
我的问题:这些标志是否足够或者我应该添加或删除一些?
备份流程如下:
- 每次都用rsync备份到同一目录
- 使用创建该目录的快照
zfs snapshot backup@'date +%Y%m%d'
我猜这--inplace
是必须的(因为每次都要备份到同一个目录)。 可能也是如此,--no-whole-file
因为它只复制更改的数据块。 但是呢-H
? 我还应该添加其他标志吗?
答案1
您找到的命令行提供了一个合理的起点。我运行 rsync 进行备份(通过 rsnapshot,这并不重要,因为您将使用 ZFS 快照来记录历史记录;我在开始使用 ZFS 之前就开始使用它,并且一直在使用它,因为它对我来说效果很好),使用以下一组参数:
-aAHX --delete --numeric-ids --relative --delete-excluded
加上一些--exclude
我不想备份的参数。我的设置和你找到的设置之间的主要区别可能是使用了-A
( --acls
) 和--delete-excluded
(还从目标目录中删除排除的文件)。
正如我们在评论中所讨论的那样,--inplace
这些--no-whole-file
选项可能不会真正损害您的使用案例。
-x
(--one-file-system
)主要在您只有一个或少数几个文件系统需要备份时有用。(由于我在源端广泛使用 ZFS 文件系统,因此我改为--exclude
备份目标位置。)-x
告诉 rsync 不要递归到除其命令行上列出的作为源的文件系统之外的文件系统。不管怎样,您都需要将目标位置排除在 rsync 的源位置概念之外;否则,在第一次备份时,您将(例如)将 /* 复制到 /backup/ 中,然后下次您将获得 /*和作为 /backup 的一部分复制到 /backup 中,依此类推。这就是我在评论中提到将备份目标目录递归复制到其自身中的意思。
使用创建该目录的快照
zfs snapshot backup@'date +%Y%m%d'
显然,您想这样做zfs snapshot backup@$(date +'%Y%m%d')
。(要么使用$()
,要么使用反引号;而不是撇号。我更喜欢 $() 语法;首先,它是可嵌套的。)
此外,当磁盘空间不足时,请确保有一个快照修剪策略。