Ubuntu 更换 Btrfs 子卷
BTRFS(B-tree File System)是 Linux 内核中一个现代化的文件系统,支持快照、数据压缩、RAID 等高级功能。其中,subvolume(简称 subvol)是其核心特性之一,本质上是一个逻辑独立的命名空间。它允许在同一 BTRFS 文件系统内创建多个“虚拟分区”——这些子卷并非物理分区,而是文件系统内部的目录结构,却可像独立文件系统一样挂载、管理和操作。
重装系统
由于 ext4 与 BTRFS 不兼容,建议从 ext4 切换到 BTRFS 时,使用全新系统安装。在安装过程中,将系统所在磁盘格式化为 BTRFS 文件系统。
设置子卷
在终端中执行以下命令:
sudo btrfs subvolume snapshot / /@
sudo btrfs subvolume create /@home
- 第一条命令:将当前系统快照备份至 /@ 子卷。
- 第二条命令:创建 @home 子卷,用于存储用户数据。
配置 fstab 以挂载子卷
编辑 /etc/fstab 文件:
sudo nano /etc/fstab
将原条目:
/dev/disk/by-uuid/<UUID> / btrfs defaults 0 1
更新为:
/dev/disk/by-uuid/<UUID> / btrfs subvol=@,defaults 0 0 #fsck 检查顺序
并在下一行添加:
/dev/disk/by-uuid/<UUID> /home btrfs subvol=@home,defaults 0 0
(注: 可通过 blkid 命令获取。)

迁移用户数据
将 @ 子卷中的用户数据移动至 @home:
sudo mv /@/home/* /@home/
(执行前确保备份重要数据,以防意外。)
配置 GRUB 引导子卷
编辑 GRUB 配置:
sudo nano /etc/default/grub
将:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash rootflags=subvol=@"
更新 GRUB:
sudo update-grub
sudo grub-install
# 根据引导模式选择:
# UEFI: sudo grub-install --efi-directory=/boot/efi
# BIOS: sudo grub-install /dev/sda # 使用 lsblk 查看磁盘设备

重启与验证
重启系统:
sudo reboot
进入系统后,检查挂载情况:
mount | grep subvol
若输出类似以下信息,则配置成功:
... subvol=/@home
... subvol=/@

若一切正常,可再次确认 fstab 和 GRUB 配置无误。
最后的清理
挂载当前卷后,删除旧系统文件(保留 @ 开头的子卷):
shopt -s extglob
sudo rm -rf !(@*)
shopt -u extglob
(建议在 Live USB 环境下执行,以确保安全。)
常见问题排查
- GRUB 进入 busybox 或 emergency mode 重启时,在 GRUB 菜单按 e 编辑条目。找到以 linux 开头的行,删除 rootflags=subvol=@,按 F10 引导进入系统。然后,重新检查 fstab 和 GRUB 配置,修正后重试。
- 桌面登录失败(黑屏或循环) 按 Ctrl+Alt+F2 切换至 TTY,登录用户。运行 mount | grep home 检查 /home 挂载状态。若未挂载,手动执行 sudo mount /home。 用 cat /etc/fstab 验证条目是否正确(应包含 /dev/disk/by-uuid/ /home btrfs subvol=@home,defaults 0 0)。若有误,按问题 1 引导非子卷模式修复。