将 Debian 的根目录 FS 切换为 ZFS
Linux 更换根目录的 FS 为 ZFS 是可行的,写一篇教程记录下大致步骤和可能出现的问题
准备
- 不比系统盘小的一块空硬盘
操作过程
1 - ZFS 驱动和工具
Debian 目前默认的内核并没有集成 ZFS 驱动,必须更换内核或者手动安装内核模块才能正常使用 ZFS
方法一
这里可以直接安装 proxmox-ve
包,Proxmox VE 自带了 ZFS 的管理工具和驱动(驱动由 Proxmox VE 的定制内核提供), 且 PVE 对 ZFS 的支持也非常全:
如果你安装了 qemu,此方法会将你的 qemu 替换为 PVE 修改后的版本
如果你使用 systemd-timesyncd 用于时间同步,此方法会将你的 systemd-timesyncd 替换为 chrony
下面的安装命令仅适用于 Debian 12 Bookworm AMD64,其他 Debian 版本或其他架构无法使用
1 |
|
如果只使用 Proxmox VE 的 ZFS 管理工具和驱动,不使用 Proxmox VE 虚拟机,可以考虑把 proxmox-ve
卸载掉:apt remove proxmox-ve -y
方法二
使用原有内核,不安装 proxmox-ve
或其他内核,使用 dkms 手动安装 ZFS 驱动
此方法可能无法在启用了 UEFI 安全启动的设备上正常工作,原因如下:
Linux 5.4 中添加了 kernel_lockdown
功能,在启用 UEFI 安全启动的设备上,kernel_lockdown
强制启用,此功能只能在内核编译时去掉
kernel_lockdown
会阻止系统载入未签名的自定义模块,zfs-dkms
就是未签名的模块
您必须为内核和 dkms 配置自定义签名才能在启用了 UEFI 安全启动的设备上使用此方法(流程非常复杂,可能还需要在 UEFI 固件设置里手动导入证书,能单独再写一篇文章了)
1 |
|
2 - 复制磁盘数据
假设原硬盘的分区结构如下:
vda | |||
1 | 2 | 3 | |
BIOS Boot | Linux filesystem | Linux LVM | |
ext4 /boot | VG system | ||
root | swap | ||
btrfs / | swap | ||
先把系统盘(以 vda 为例)复制到另一块盘 vdb,然后清除掉 vdb 上的 boot 和 root 分区
如果你的系统盘上有 LVM,你需要在磁盘克隆后使用 vgimportclone
重新生成 LVM 的 UUID,命令已在下方给出
UEFI 用户需要两个分区用于启动,一个是 ESP(应挂载到 /boot/efi),另一个是 ZFS 启动分区(应挂载到 /boot),我只以传统引导演示,因为我不使用 UEFI 也没有 ESP(
1 |
|
完成后磁盘分区结构大致是:
vdb | |||
1 | 2 | 3 | |
BIOS Boot | Linux filesystem | Linux LVM | |
VG system | |||
root | swap | ||
swap | |||
3 - 创建 ZFS
bpool,用于引导:
1 |
|
rpool,存储 rootfs:
1 |
|
创建数据集:
1 |
|
上面的操作完成后磁盘分区结构大致是:
vdb | |||
1 | 2 | 3 | |
BIOS Boot | Linux filesystem | Linux LVM | |
zpool bpool | VG system | ||
BOOT | zpool rpool | swap | |
zfs /boot | ROOT | swap | |
zfs / | |||
4 - 拷贝文件
1 |
|
5 - 更新引导
在 vdb 创建新的引导文件:
1 |
|
6 - 更新 fstab
ZFS 不依赖 fstab 挂载,挂载信息存储在文件系统中,自行清理 fstab 的无用条目
7 - 导出 ZFS
1 |
|
8 - 将 ZFS 写回原系统盘
方法一
如果有 LiveCD,直接进 LiveCD 执行:
1 |
|
方法二
如果没有 LiveCD,则将根目录系统挂载为只读,然后再复制:
1 |
|
9 - 启动新的系统
卸载原有硬盘,重启即可,最终效果如下
可能出现的问题
A - initramfs 无法加载 ZFS 驱动
- 症状:出现
Failed to load the ZFS Module.
提示 - 原因:未正确对模块进行签名,UEFI 安全启动策略不允许载入
B - initramfs 未找到 zpool
- 症状:开机时卡在
Begin: Running /scripts/local-block … done
很久 - 症状:出现
ZFS Boot failing in initramfs : Alert! ZFS=rpool/ROOT/proxmox does not exists
类似提示 - 原因:initramfs 中没有 zfs 工具,或 zpool 无法被安全导入,请确认第 5 步的
zfs-initramfs
是否正确安装、第 7 步是否成功导出 - 解决方案:尝试运行
zpool import -f bpool rpool && exit
,如果出现command not found
,说明zfs-initramfs
未正确安装,请重新执行全部步骤
C - ZFS 根目录无法卸载
- 症状:完成第 7 步时出现
cannot unmount '/mnt': pool or dataset is busy
- 原因:第 3 步完成后,ZFS 所在的磁盘路径发生变化,或者有其他程序占用
- 解决方法:如果更改了磁盘路径,需要先修改回来,然后检查是否有程序占用,如果有,请关闭,完成后重新尝试第 7 步,若仍然失败,请重启系统
参考资料
- Install Proxmox VE on Debian 12 Bookworm (pve.proxmox.com)
- Please, I need Help. Reboot and Stuck on “initramfs” command line (Failed to load the ZFS Module) . (github.com)
- Install Arch Linux on ZFS (wiki.archlinux.org)
- Copy entire file system hierarchy from one drive to another (superuser.com)
- Hetzner独服安装Debian11并将ZFS作为根文件系统 (lala.im)