btrfs 恢复根 FS 的快照

Mat*_*ias 5 linux btrfs snapshot

在升级到 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
Run Code Online (Sandbox Code Playgroud)

启动到快照:

$ 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):
Run Code Online (Sandbox Code Playgroud)

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

Cel*_*ada 6

由于您当前或所需的子卷都不是“真正的”Btrfs 根,即子卷 ID 0,您的情况有所简化。

首先(临时)挂载真正的 Btrfs 根,如下所示:

mkdir /mnt/btrfs-root
mount -o subvolid=0 /dev/somedevice /mnt/btrfs-root
Run Code Online (Sandbox Code Playgroud)

现在,在 btrfs-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
Run Code Online (Sandbox Code Playgroud)

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

请注意不要通过 subvolid 挂载根文件系统。如果您通过 subvolid 安装它,那么即使您重命名上述内容,subvolid 也不会改变。

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

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