使用快照时 btrfs show 命令不起作用

使用快照时 btrfs show 命令不起作用

有人可以解释为什么在将快照设置为“默认”后安装快照(我猜本质上是一个子卷)会导致 show 命令不再工作以及快照的目录内容消失。拥有一个仅在您不使用时才起作用的快照系统似乎毫无意义。一旦解释了为什么它以这种方式工作,请解释如何让它按照我想要的方式工作,如下所述。

场景:我有一个带有 / 的根 btrfs 设置,并且没有 /home、/root 等子卷,因为我不喜欢这样的设置,并且希望不惜一切代价避免这样做。这根本不是我想要的,因为这样我就无法仅使用 1 个快照来恢复整个系统(类似于 virtualbox 快照恢复)。我不关心通过快照恢复丢失用户内容或系统配置。我希望它将所有内容恢复到特定时间点,同时不失去浏览其他日期的预先存在的快照内容的能力(过去的,如果可能的话,相对于当前快照的未来)。我唯一拥有的“子卷”是快照。

这显示了我当前的安装设置,其中 btrfs 是列表中的最后一个。我把它截断了,因为其他的都无关紧要。

root@Work-VirtualBox ~ # mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=8179248k,nr_inodes=2044812,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=1642476k,mode=755)
/dev/sda1 on / type btrfs (rw,relatime,compress=lzo,ssd,space_cache,subvolid=634,subvol=/snapshots/09-25-2022-03:00:01)
... yada yada

当前子卷列表(所有快照)

sudo btrfs subvol list /
ID 625 gen 1695 top level 5 path snapshots/test5
ID 626 gen 1694 top level 5 path snapshots/09-25-2022-01:40:33
ID 627 gen 1694 top level 5 path snapshots/09-25-2022-01:42:21
ID 628 gen 1694 top level 5 path snapshots/09-25-2022-01:42:28
ID 629 gen 1695 top level 5 path snapshots/09-25-2022-01:48:47
ID 630 gen 2782 top level 5 path snapshots/09-25-2022-01:50:42
ID 631 gen 1695 top level 5 path snapshots/09-25-2022-01:51:28
ID 632 gen 1695 top level 5 path snapshots/09-25-2022-01:52:25
ID 633 gen 2720 top level 5 path snapshots/09-25-2022-01:58:45
ID 634 gen 2691 top level 5 path snapshots/09-25-2022-03:00:01
ID 635 gen 2654 top level 634 path snapshots/09-25-2022-03:00:01/snapshots/test6

当前默认快照:

sudo btrfs subvol get-default /
ID 630 gen 2783 top level 5 path snapshots/09-25-2022-01:50:42

问题:

每当我将“默认”快照设置为 ID 5 以外的任何值时,我都会失去使用 btrfs subvol show 和ls -latch /snapshots/NAMEHERE.如果我将默认值设置为 5,则显示适用于所有快照的效果,并且我能够按照预期浏览 /snapshots 目录。我使用什么 ID 并不重要。我尝试了 625、630 和 634。当我使用 634 时,我创建了一个名为 test6 的新快照。当我使用 634 作为默认值时,我可以使用 show 命令的唯一快照是 test6(id 635)。我还可以浏览 /snapshots 目录中的内容。

预期成绩:

我期望能够切换到任何快照,并且仍然能够浏览比我切换到的快照更旧的其他快照。这里的情况根本不是这样。我可以看到 /snapshots 的目录列表仅显示较旧的快照,但这些目录的内容完全是空的,根本不显示任何文件。我希望他们显示文件,而不仅仅是快照名称。我还希望“btrfs subvol show”命令至少显示旧命令的详细信息,如果它也适用于新命令,那就太好了。

我还发现很奇怪的是,父项(ID:5)没有在任何地方列出。它应该显示在列表中,其中包含我创建的所有快照的子项。我什至不知道它是如何得到ID:5的,因为这实际上是第一次使用它;我希望它是 ID:1,而不是 ID:5。

sudo btrfs subvol show -r 5 /snapshots/test5
ERROR: cannot resolve rootid for path: Inappropriate ioctl for device
ERROR: can't find rootid '5' on '/snapshots/test5': -25
ERROR: Failed to get subvol info /snapshots/test5: Inappropriate ioctl for device
sudo btrfs subvol show /snapshots/test5
ERROR: not a subvolume: /snapshots/test5
ERROR: Failed to get subvol info /snapshots/test5: 1

目前的解决方法:

使 btrfs show 命令正常工作以及快照中列出的目录内容的唯一解决方法是将默认子卷设置回 ID:5。但是,这对我来说听起来完全错误。我应该能够将其设置为我想要的任何快照,从那时起我所做的任何事情都只会使当前快照成为我从那时起所做的任何事情的父级,直到我将默认快照设置为另一个 ID。如果我在设置新 ID 之前不创建新快照,我预计会丢失我所做的任何事情,这正是我想要的行为。如果我想保存工作,我需要创建一个新快照,该快照将成为我正在使用的快照的子快照。

相关内容