btrfs 恢复根 FS 的快照

btrfs 恢复根 FS 的快照

在升级到 Fedora 25 之前,我做了一个btrfs subvolume snapshot / /f24.我的可用空间太少,所以更新失败。现在的问题是,如何恢复快照呢?我已经通过编辑 grub.cfg (设置)启动到快照rootflags=subvol=root/f24

  1. 这家伙说只是btrfs subvolume delete root。但我不确定 grub2 是否会在下一次内核更新时重新生成错误的 grub.cfg。delete root听起来也像rm -rf /类似的操作。

  2. 这家伙使用 rsync 将数据从快照复制到根目录。我确信它有效,但这是 2013 年的答案,我认为有更好的方法来恢复快照。

  3. 我发现有几次“只使用mv”,通常与apt-btrfs-snapshot.听起来好像不太mv /f24 /管用。 (如果是这样,请纠正我。)

最后,恢复的快照当然应该root重新命名,而不是root/f24.以下是FS的一些信息:

$ btrfs subvolume list /
ID 257 gen 419417 top level 5 path root
ID 3231 gen 419430 top level 257 path root/f24

启动进入快照:

$ btrfs subvolume show /
/
    Name:           f24
    UUID:           b1782609-7d9f-4725-911d-428cda2256c7
    Parent UUID:        8df6fae9-770a-4d55-a4bf-6a32edf1fbd7
    Received UUID:      -
    Creation time:      2016-11-26 19:17:22 +0200
    Subvolume ID:       3231
    Generation:         419438
    Gen at creation:    411444
    Parent ID:      257
    Top level ID:       257
    Flags:          -
    Snapshot(s):

2016年有办法做到这一点吗?

答案1

您当前的子卷和所需的子卷都不是“真正的”Btrfs 根(即子卷 ID 0),这一事实在一定程度上简化了您的情况。

首先(暂时)安装真正的 Btrfs 根,如下所示:

mkdir /mnt/btrfs-root
mount -o subvolid=0 /dev/somedevice /mnt/btrfs-root

现在,在 btrfs-root 内部,您应该能够看到您的子卷“root”以及您在那里定义的任何其他子卷。您可以使用 plain 按您想要的方式重新排列它们mv

cd /mnt/btrfs-top
mv -i root/f24 newroot
# Now at least you don't have one subvolume rooted inside another
# It's a little simpler to work with.

# Now just shuffle them as desired
mv -i root oldroot
mv -i newroot root

# ...and clean up
cd
umount /mnt/btrfs-top
rmdir /mnt/btrfs-top

现在,下次挂载名为“root”的子卷时,它将是新的子卷。

请注意不要通过 subvolid 挂载根文件系统。如果您通过 subvolid 挂载它,那么即使您按照上面的方式重命名,subvolid 也不会改变。

  • 如果您通过依赖默认 subvolid 来挂载文件系统,那么您需要将默认 subvolid 更改为新的:

    btrfs subvolume set-default 3231 /
    
  • 如果您通过显式 subvolid 规范安装它,那么您将需要更改/etc/fstab/etc/default/grub使用subvolid=3231.

相关内容