当安装到根 btrfs 文件系统时,许多 Linux 发行版会安装到默认子卷。如果不进行修改,此布局将强制在根文件系统内创建任何新的快照或子卷,这非常令人困惑,因为快照包含自身:
/
│─dev
│─home
│─var
│─usr
│─...
└─snapshots
└─snap1
更容易理解的默认子卷布局是:
/
├─subvolumes
│ └─root
│ ├─dev
│ ├─home
│ ├─var
│ ├─usr
│ └─...
└─snapshots
└─snap1
如何更改发行版默认的 btrfs 安装以使用此子卷布局,而无需从 livecd 启动?
答案1
虽然并非绝对必要,但您可能希望在单用户(“恢复”)模式下执行这些步骤,以避免意外数据丢失。
我们将在默认子卷中创建我们想要的布局:
mkdir /subvolumes
btrfs subvolume snapshot / /subvolumes/root
mkdir /snapshots
/subvolumes/root
将是我们新的根文件系统,所以在此步骤之后不要对文件系统进行任何更改。
编辑/subvolumes/root/etc/fstab
以使系统使用新的根子卷作为根文件系统。为此,您需要修改它以包含该subvol=/subvolumes/root
选项。
现在我们需要将新的根文件系统挂载到某个地方,以便修复 grub 以指向新的子卷:
mkdir /media/temporary
mount -o subvol=/subvolumes/root /dev/sdXX /media/temporary
cd /media/temporary
mount -o bind /dev dev
mount -o bind /sys sys
mount -o bind /proc proc
mount -o bind /boot boot # only necessary if you have a separate boot partition
chroot .
update-grub
exit
就是这样。重新启动,您的根文件系统应该是新的子卷。如果成功,则不应有任何/snapshots
目录。
如果需要,您可以为默认子卷创建永久挂载点:
mkdir /media/btrfs/root
然后您可以mount -o subvolid=0 /dev/sdXX /media/btrfs/root
安装默认子卷。
您现在可以安全地删除默认子卷中旧根文件系统的内容。
cd /media/btrfs/root
rm -rf {dev,home,var,...}
答案2
建议的布局包含一个“小”问题:(无论如何,都很好 - 我现在正在使用它)
GURB - 无法评估“设置默认”路径。它总是期望 (hd0,gpt2)/boot/grub2/grub.cfg 中的 grub.cfg (或者您在 grub2-install 中指定为“--boot-directory=/path”的任何内容)
所以 - 拥有 /subvolumes/{root,home,swap} 的想法确实有效!但不幸的是 - 如果没有 /boot ,你将无法再启动 :-( (严格来说,你可以 - grub 加载 - 但找不到 grub.cfg (菜单))
我通过创建一个子卷“/boot”解决了这个问题,我将其在运行操作系统(/subvolumes/root -> /)中绑定安装到/boot。然后“grub2-install /dev/sda --boot-directory=/boot”安装所需的文件。当“grub”启动时:“ls (hd0,gpt2)/boot/grub/grub.cfg”位于预期位置,并且一切正常。操作系统也将其“视为”/boot(subvol-mount) - 并且可以更新内核等。
这个设置当然有点“杀死” - 我有几个独立的根安装的想法 - 并且只需通过“btrfs set-default”在它们之间切换。不幸的是,由于 grub 的原因,这不起作用。
所以我的 /etc/fstab 看起来像这样:
UUID=blah / btrfs auto,compress=no,subvol=/subvolumes/fedora_33_root 0 0
UUID=blah /boot btrfs auto,compress=no,subvol=/boot 0 0
UUID=blah /home btrfs auto,subvol=/subvolumes/home 0 0
UUID=blah /mnt/swap btrfs auto,subvol=/subvolumes/swap_subvol 0 0
/mnt/swap/swapfile none swap 0 0