系统安装时使用了ZFS,重新编译内核后,发现系统无法正常启动,提示“找不到启动介质”。
在启动时,也提示正在使用zfsboot启动,但是输入问号后只显示gpt,没有发现zfs的选项:
原因是zfs没有编译,在编译内核时为了加快编译速度,用了NO_MOUDLES选项,导致zfs模块没有编译,所以在系统启动时就无法加载zfs模块,导致zfs模块不能使用。
另外zfs还需要两个模块:opensolaris和krpc,注意要把这两个模块一起编译才行。
正确的编译参数如下,这除了内核之外还编译zfs等三个模块,一般的机器5分钟之内就能完成:
make buildkernel KERNCONF=FB MODULES_OVERRIDE="zfs opensolaris krpc"
还要注意安装的时候也要指定MODULES_OVERRIDE,否则仍然没有zfs模块:
make installkernel KERNCONF=FB MODULES_OVERRIDE="zfs opensolaris krpc"
下图是一个老内核图,借用了一下,在加载内核之前,已显示加载zfs模块,但是没有提到krpc,因为通用内核中已经有这个模块了,所以不需要再加载。
另外再提示一点,如果编译内核后启动失败,在下面图片的选单中按一下“5”,就会切换到“kernel.old(2 of 2)”,kernel.old就是安装新内核时对老内核的备份。如果kernel.old也被重写(比如:一不小心改了内核配置,在重启前安装了两次以上错误的内核),可以用FreeBSD的启动盘进入live模式,挂载/boot后,把GERNRIC内核复制下来,复制的时候注意用-pR参数,保证目录和权限正确。
用Live进入FreeBSD的时候,可能会找不到zfs池,这时可以用zpool import -f zroot来导入,zroot是默认安装时的zfs池名,如果你改了名,必须要对应才可以,但是要注意这时整个系统都是安装后的系统了,Live上面的东西已经完全看不到,因为根已经被zroot重置了。
最后的一个问题:为什么zfs不能编译进内核,只能作为内核模块呢?我也查了很长时间,正常情况下,应该是协议的问题,但是只看到gpl和cddl之间不兼容,没说BSD协议的事,但是一直没搞明白为什么zfs不能进内核。
该贴被wulcan编辑于2015-3-22 20:51:26