我正在构建一个自定义 initrd,以便可以使用 tmpfs 根而不是 NFS 根引导无盘节点(initrd 中的脚本将根设备的内容复制到 tmpfs 文件系统,然后更改 的值NEWROOT
)。在我的测试环境中,一切看起来都很好,我生成了一个自定义 initrd,启动它,/从没有安装为 tmpfs,但拥有 NFS 根提供的所有文件,很棒的东西。
然后我开始转向真实环境,当 initrd 启动时,它在尝试挂载 NFS 根目录(此时仍然是正常的 NFS 启动)时感到窒息,并抱怨mount.nfs4: No such device
。
我使用以下命令生成 initrd:
dracut -v -m "nfs network base" --include rd.live.overlay/ / initrd-tmpfs.img
我确认正在initrd-tmpfs.img
加载(基于 PXE 启动的早期部分,其中列出了其加载的 initrd)。
当 initrd 失败时,它会进入紧急 shell,并有一些有趣的事情:
ip addr show
列出来自 DHCP 的 IP,并且我可以 ping NFS 服务器
echo $netroot
列出 NFS 启动参数nfs4:[Server IP]:[root location]:[nfs options]
mount -t nfs4 [Server IP]:[root location] /sysroot
结果:(mount.nfs4: No such device
非常熟悉)
modprobe nfs
结果:modprobe:FATAL: Module nfs not found
明显有问题
grep nfs /usr/lib/dracut/modules.txt
确实匹配
grep nfs /usr/lib/modules/[kernel version]/modules.order
匹配几次,提到:kernel/fs/nfs.ko | kernel/fs/nfsv3.ko | kernel/fs/nfsv4.ko
但是这些都不存在
环境:RHEL 7
看来我的问题在我写完后就已经有了答案,我将发布答案
答案1
我所做的最后一个调试步骤给了我线索,所以我想我应该为了其他人而发布答案。grep nfs /usr/lib/modules/[kernel version]/modules.order
匹配kernel/fs/nfs.ko | kernel/fs/nfsv3.ko | kernel/fs/nfsv4.ko
,但它们不存在。
Well*.ko
代表一个内核驱动程序,并且initrd
有一个选项--add-drivers
,所以
dracut -v -m "nfs network base" --include rd.live.overlay/ / initrd-tmpfs.img
变成:
dracut -v -m "nfs network base" --add-drivers "nfs nfsv4" \
--include rd.live.overlay/ / initrd-tmpfs.img
然后lsinitrd | grep nfs
列出nfs.ko
,nfsv4.ko
根设备自行安装、复制,快乐的日子,有一个通过 NFS 启动的无盘服务器,有一个 tmpfs/
目录,这对于 HA 无盘集群来说是很棒的东西。
我的测试环境和目标之间的驱动程序差异将是/etc/dracut.conf
or的结果/etc/dracut.conf.d/
,它可以指定要包含的驱动程序,但我没有过多地研究它们(我宁愿在运行命令时指定驱动程序,以便我的理智)。