我有一个用作 NAS 的小型服务器,它上面运行着一些服务以及它存储的许多文件。
它配置为带有两个 SSD 的 RAID1,使用 btrfs 格式化。
我使用apt-btrfs-snapshot
,每次执行 apt 操作时都会创建快照。这一切都适用于从错误的配置更改中恢复 - 但我还想将这些快照复制到一些外部备份目标,以便在服务器完全死机时使用它们进行恢复。
我的问题:假设我最近有这台机器根目录的 btrfs 快照。要恢复它,我可以重新安装 Ubuntu(使用相同的硬件),复制快照,然后告诉apt-btrfs-snapshot
“回滚”到该快照吗?实际上,我正在从不同但相似的系统逐字复制整个根文件系统。我原以为这应该没问题,只要我保持权限相同,那么所有已安装的应用程序和配置文件都应该将备份系统恢复为快照时的状态。我想我可能会在虚拟机中尝试这个只是为了检查,但是复制根文件系统来恢复整台机器有什么问题吗?
好的,我在VM中尝试过。这是我所做的一般要点:
在 VirtualBox 中创建一个带有 20 GB 磁盘的 Ubuntu 18.04 VM。使用桌面 ISO 映像进行安装,并且(当然)使用 btrfs 进行配置,而不是接受默认值。
引导进入新系统,安装
apt-btrfs-snapshot
. 还安装了一些其他的东西,我做了 Docker,因为这是我想要确保备份的东西之一。这个想法是备份系统需要与全新安装明显不同,这样我们才能判断这是否真的有效。使用 制作参考快照
sudo apt-btrfs-snapshot snapshot
。从 VM 中删除磁盘,然后创建一个新磁盘并按照与以前相同的过程在其上安装 Ubuntu 18.04。
在新的虚拟机中,也安装
apt-btrfs-snapshot
,但没有别的(因为无论如何我们都要恢复我们的备份)。关闭 VM,然后将来自第一个 VM 的磁盘附加到 SATA 插槽 1。重新启动到 VM 并确保新实例已启动,而不是备份磁盘(您可以检查您安装的东西是否存在 - 它们不应该存在于新实例中)。
手动挂载新 btrfs 磁盘和备份 btrfs 磁盘的根目录 - 我通过 in 条目完成此操作,
/etc/fstab
但只能通过mount
命令完成。在备份中找到要恢复的快照的名称,例如
@apt-snapshot-2018-08-01_08:48:31
- 在 btrfs 文件系统的根目录中会有许多这样的名称。在新磁盘中创建一个同名的 btrfs 子卷,使用如下命令
sudo btrfs subvolume create /path/to/new/btrfs/@apt-snapshot-2018-08-01_08:48:31
将备份中的所有内容复制到新的空子卷中,例如
sudo cp -ar /path/to/old/@apt-snapshot-2018-08-01_08:48:31 /path/to/new/btrfs/
最后,检查是否看到了新的子卷
sudo apt-btrfs-snapshot list
,然后,假设它已列出,将恢复的映像设置为在启动时使用,其中:sudo apt-btrfs-snapshot set-default @apt-snapshot-2018-08-01_08:48:31
关闭虚拟机并移除备份磁盘。重新启动,然后检查还原是否有效。就我而言,确实如此——尤其是我在备份之前测试过的 Docker 镜像在恢复的机器上工作。
因此,只要硬件相似,从根子卷快照恢复到全新安装似乎确实有效。