我有一个关于备份 BTRFS 分区的问题。
假设我在 /dev/sda1 上有一个 BTRFS 分区,在 /dev/sdb1 上有一个带有 BTRFS 的外部硬盘。
我已经发现我可以通过发出以下命令进行初始备份:
btrfs replace start /dev/sda1 /dev/sdb1
之后我改变了两件事:
- 我在 SDA1 上创建一个新的常规文件
- 我在 SDA1 上创建一个新的 BTRFS 快照
现在我想让我的外部硬盘驱动器 SDB1(“备份”)与 SDA1 对齐。所以这两个文件都是 BTRFS 特定的东西(快照)。
我该怎么做呢?
所以我正在寻找 rsync 等效项,它也同步 BTFS 功能(快照):
rsync -avr --delete <mount point sda1> <mount point sdb1>
谢谢
答案1
替换命令不会备份 sda1,它会在文件系统中将 sda1 替换为 sdb1,但由于它是单设备文件系统,并且 btrfs 在替换时不会费心擦除 sda1 中的数据,因此它们最终会成为 sda1 的相同副本文件系统。但是,您不想这样做,因为两者都具有相同的 UUID,并且目前使用相同的 UUID 挂载两个 btrfs 文件系统并不安全,因为这可能会导致大量数据损坏(参见 btrfswiki 的陷阱页面)。如果您想使用 btrfs 的增量备份功能,您应该将备份驱动器 /dev/sdb1 格式化为新的 btrfs 文件系统。然后,您应该使用以下命令在文件系统上创建要备份的水子卷的只读快照
btrfs su sn -r @subvolume-name @subvolume-name-RO
在每个子卷上。然后你应该挂载空白的 btrfs 文件系统并运行
btrfs send /path/to/@subvolume-name-RO | btrfs rec /path/to/backup-directory/
这将是第一次发送,btrfs 这次必须传输所有数据。下次您想要将备份发送到该驱动器时,可以使用增量发送来仅发送自上次发送备份以来已更改的数据。它还将使用写入时复制,因此您也将节省大量空间。只要确保在两个文件系统上都保留最新的快照即可。完成后,您可以将发送的快照重命名为您想要的任何名称。
现在,如果您想发送另一张快照,只需重命名原始快照并使用类似的内容拍摄新快照
mv @subvolume-name-RO @subvolume-name-RO-old
btrfs su sn -r @subvolume-name @subvolume-name-RO
然后您可以使用 send 来发送最新的快照
btrfs send -p @subvolume-name-RO-old @subvolume-name-RO | btrfs rec /path/to/backup-directory/
如果上一个快照仍然存在于您的备份驱动器上,它将发送您的新快照,只需复制自上一个快照以来所做的任何更改即可。