环境:
在 FreeBSD 系统下重编译内核并安装重启后,屏幕上突然出现“zfs: failed with error 6”的错误提示,紧接着就是熟悉的“mountroot>”提示符。这个错误代码颇有讲究——常见的 ZFS 报错大多是 error 2 或 error 19,而 error 6 在实际运维中并不常见,值得深入排查。
排查过程:
仔细观察最后一行输出,依然显示着一长串 GUID 号。因此,问题很可能还是出在 GPT 分区表识别环节。
根据以往经验,我在 loader.conf 里添加了两条配置项:
kern.geom.label.gptid.enable="0"
kern.geom.label.disk_ident.enable="0"
这样做的逻辑其实很简单:当初安装系统时,ZFS 目标指定的是 adap3 这类设备名。如果不加这两行,系统会将磁盘识别为 GUID 格式,导致 ZFS pool 无法正确匹配磁盘,进而报 error 2。但这次添加后,问题依旧没有解决。
更关键的是,我还在 loader.conf 中增加了 vfs.zfs.debug="1" 以开启调试信息,并配合 boot_pause="YES" 来暂停启动。然而偏偏此时 USB 键盘无法响应,只能眼睁睁看着最后一行输出——依然是 GUID 格式的路径,无法进一步滚动查看详细日志。
排查陷入僵局,只能换一条思路。我重新检查了内核配置文件(kernel config),果然发现有三项关键选项被注释掉了:
options GEOM_PART_GPT # GUID Partition Tables.
#options GEOM_RAID # Soft RAID functionality.
options GEOM_LABEL # Provides labelization
这三项与 GUID 识别直接绑定。既然问题出在系统无法识别 GUID 格式,那么可以尝试在 loader 阶段直接加载对应模块。于是在 loader.conf 中添加以下两行:
geom_label_load="YES"
geom_part_gpt_load="YES"
重启之后,系统竟然顺利启动了。
根本原因:
问题根源在于编译内核时禁用了与 GEOM 相关的选项,导致整个 GEOM 框架无法正常工作。磁盘标签和分区表识别失败,ZFS 自然也就无法找到正确的存储设备。
修复方案:
最终的解决方案也很直接:去掉注释,重新编译内核,将这两行配置恢复为启用状态:
options GEOM_PART_GPT # GUID Partition Tables.
#options GEOM_RAID # Soft RAID functionality.
options GEOM_LABEL # Provides labelization
