将笔记本电脑的 btrfs 驱动器镜像/备份到有时连接的外部 USB 磁盘

将笔记本电脑的 btrfs 驱动器镜像/备份到有时连接的外部 USB 磁盘

我有一台带内置驱动器的笔记本电脑,使用文件系统。这里有多个子卷和快照。我希望定期将此驱动器的副本复制到大小大致相同的外部 USB 磁盘。外部驱动器必须是可启动的,并且与内部驱动器几乎完全相同,这样如果主驱动器发生故障,我只需将其替换即可。

实现这一目标的最佳方法是什么?

以下是我考虑过的一些方法:

我考虑过使用 Btrfs RAID 1,但这实际上是为永久连接的驱动器设计的,所以我怀疑它不会很好地工作。

当我拥有相同的磁盘并在两个磁盘上都使用 Ext4 时,我使用 Rysnc 管理此设置,效果很好。不过我预计现在这行不通了,因为 rsync 无法理解快照,并且会多次复制所有内容。

也许使用 Btrfs 发送/接收可以工作,但这并不那么简单,因为要发送文件系统,必须先制作只读快照,然后在外部磁盘上使用此快照的名称。我不认为有办法接收根文件系统,在 /

答案1

也许使用 Btrfs 发送/接收可以工作,但这并不那么简单,因为要发送文件系统,必须先制作只读快照,然后在外部磁盘上使用此快照的名称。我不认为有办法接收根文件系统,在 /

这是最好的解决方案。我使用快照对我的服务器进行快速增量备份。您可以像备份其他任何卷一样备份根子卷,但我认为您不能在根目录中接收。更重要的是,您不应该这样做,因为这会阻止您享受快照的好处之一:增量备份。正确完成后,它只会发送已更改的数据,并且只占用更改数据的磁盘空间。

此脚本以 cron 作业的形式运行,每天拍摄我的根分区的快照,然后用于btrfs send将增量副本发送到我的备份分区。编写的脚本使用pv,但如果由于某种原因您不想安装它,您可以简单地pv从管道中间移除它。

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
date=$(date +%Y-%m-%d)

# the path to the partition mount point that we are backing up
source_partition=/

# where backup snapshots will be stored on the local partition
# this is needed for incremental backups
source_snapshot_dir=/snapshots

# where backups will be stored on the backup drive
target_snapshot_dir=/mnt/media/backups/root

if [ ! -d $source_snapshot_dir ]; then
    echo 'Creating initial snapshot...'
    mkdir --parents $source_snapshot_dir $target_snapshot_dir

    # create a read-only snapshot on the local disk
    btrfs subvolume snapshot -r $source_partition $source_snapshot_dir/$date

    # clone the snapshot as a new subvolume on the backup drive
    # you could also pipe this through ssh to back up to a remote machine
    btrfs send $source_snapshot_dir/$date | pv | \
        btrfs receive $target_snapshot_dir
elif [ ! -d $source_snapshot_dir/$date ]; then
    echo 'Creating root volume snapshot...'

    # create a read-only snapshot on the local disk
    btrfs subvolume snapshot -r $source_partition $source_snapshot_dir/$date

    # get the most recent snapshot
    previous=$(ls --directory $source_snapshot_dir/* | tail -n 1)

    # send (and store) only the changes since the last snapshot
    btrfs send -p $previous $source_snapshot_dir/$date | pv | \
        btrfs receive $target_snapshot_dir
fi

echo 'Cleaning up...'

# keep the 3 most recent snapshots on the source partition
ls --directory $source_snapshot_dir/* | \
    head --lines=-3 | \
    xargs --no-run-if-empty --verbose \
    btrfs subvolume delete --commit-after

# keep the 28 most recent snapshots on the backup partition
ls --directory $target_snapshot_dir/* | \
    head --lines=-28 | \
    xargs --no-run-if-empty --verbose \
    btrfs subvolume delete --commit-after

(注意:我对脚本进行了一些修改,使其成为通用解决方案,但尚未按照书面形式进行测试。如有必要,请随时提交修订。)

答案2

据我了解,您希望创建笔记本电脑硬盘的镜像(或接近镜像),以便在磁盘发生故障时更换笔记本电脑硬盘。镜像驱动器将通过 USB 连接,并且可能并非始终处于连接状态,例如,您带着笔记本电脑短途旅行,但将镜像驱动器留在工作地点或家中。

在我看来,这看起来像是 RAID 1 的情况。这可以通过 BTRFS 或 MDADM 来实现。无论哪种情况,当将外部驱动器重新连接到笔记本电脑时,您都需要确保它被视为“从属”。由于笔记本电脑上可能发生了较新的写入,因此应该是这种情况。然后可以在 btrfs 中运行清理操作(btrfs-scrub)。

或者,您可以使用 fssync,尽管您将通过 ssh 进入本地主机。手册页报告称,fssync 可以很好地与 btrfs 配合使用。

关于快照和使用 rsync 或其他类似的同步,您可以在创建快照时,在外部镜像和内部驱动器上创建一个,并且假设快照是只读的,则不同步快照。如果不是只读的,您将需要同步,并且可能会出现您所述的问题。

如果您有另一个系统,您可以考虑在单主模式下使用 DRBD。虽然您可能能够让其在单个系统上与两个驱动器一起工作,但我看到报告表明这不起作用。

请注意,许多人认为 RAID、同步和复制不能替代备份系统。

相关内容