使用 NFS 模块构建的 initrd 无法挂载 NFS root

使用 NFS 模块构建的 initrd 无法挂载 NFS root

我正在构建一个自定义 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.konfsv4.ko根设备自行安装、复制,快乐的日子,有一个通过 NFS 启动的无盘服务器,有一个 tmpfs/目录,这对于 HA 无盘集群来说是很棒的东西。

我的测试环境和目标之间的驱动程序差异将是/etc/dracut.confor的结果/etc/dracut.conf.d/,它可以指定要包含的驱动程序,但我没有过多地研究它们(我宁愿在运行命令时指定驱动程序,以便我的理智)。

相关内容