回滚带有子子卷的 btrfs 子卷

回滚带有子子卷的 btrfs 子卷

是否有一种规范的方法可以回滚到具有子子卷的子卷快照。例如,这是我的 btrfs 卷布局:

ID 257 gen 59802 top level 5 path __active
ID 258 gen 59784 top level 5 path __snapshot
ID 259 gen 59802 top level 257 path home
ID 260 gen 36538 top level 257 path opt
ID 261 gen 59802 top level 257 path var

所以你可以看到 home、opt 和 var 是 __active 的子卷。如果我对 __active 进行快照,这就是我的新布局:

ID 257 gen 59802 top level 5 path __active
ID 258 gen 59784 top level 5 path __snapshot
ID 259 gen 59802 top level 257 path home
ID 260 gen 36538 top level 257 path opt
ID 261 gen 59802 top level 257 path var
ID 416 gen 59784 top level 258 path __snapshot/__active

如果我想回滚到 __active 的快照,有没有办法将 home、opt 和 var 重新附加到新的 __active?

答案1

如果您的意思是重新连接,您btrfs subvolume list将显示:

ID 257 gen 59802 top level 5 path __active
ID 258 gen 59784 top level 5 path __snapshot
ID 259 gen 59802 top level 416 path home
ID 260 gen 36538 top level 416 path opt
ID 261 gen 59802 top level 416 path var
ID 416 gen 59784 top level 258 path __snapshot/__active

然后现在有办法用btrfs-progs.

仅当所有子子卷(使用 创建)都为空时才可以删除子卷btrfs subvolume create ...,但是对于快照(使用 创建)则不然btrfs subvolume snapshot ...。快照始终可以删除,因此如果您可以移动它们,则会出现删除快照时出现问题。

尽管子子卷和快照都出现在同一树结构中,甚至共享命令btrfs subvolume delete ..,但它们的行为并不相同。

答案2

首先,在制作时__snapshot/__active,子卷(home、opt、var)不会被捕捉。相反,会创建空目录。因此__snapshot/__active可以很容易地去除,反之则__active不能。

但重点是__active用恢复__snapshot/__active。据我所知,这不能以原子方式完成。但您可以愉快地mv创建快照和其他子卷(只要它们是可写的)。这样做例如

mv __active __snapshot/__active.old
mv __snapshot/__active __active

__active从快照恢复,但将子卷移动到__snapshot/__active.old/{home,opt,var}.要重新连接它们,您现在可以使用

mv __snapshot/__active.old/{home,opt,var} __active/

你会得到

ID 257 gen 59804 top level 258 path __snapshot/__active.old
ID 258 gen 59786 top level 5 path __snapshot
ID 259 gen 59802 top level 416 path home
ID 260 gen 36538 top level 416 path opt
ID 261 gen 59802 top level 416 path var
ID 416 gen 59784 top level 5 path __active

如果您的快照设为只读,您可以执行以下操作:

mv __active __snapshot/__active.old
btrfs subvolume snapshot __snapshot/__active __active
rmdir __active/{home,opt,var}
mv __snapshot/__active.old/{home,opt,var} __active/

相关内容