我刚刚在 Ubuntu 14 上设置了一个 PXE 引导服务器 - 运行内核 3.13.0-30-generic - 如在 Supermicro X9DRFF 硬件上的https://help.ubuntu.com/community/DisklessUbuntuHowto所述。
我只能通过 KVM 远程访问客户端服务器。客户端上的启动过程顺利,但我得到内核恐慌。
是否有可能确定此内核恐慌的原因?
我刚刚在 Ubuntu 14 上设置了一个 PXE 引导服务器 - 运行内核 3.13.0-30-generic - 如在 Supermicro X9DRFF 硬件上的https://help.ubuntu.com/community/DisklessUbuntuHowto所述。
我只能通过 KVM 远程访问客户端服务器。客户端上的启动过程顺利,但我得到内核恐慌。
是否有可能确定此内核恐慌的原因?
一些输出丢失了,因为它已经滚出了屏幕,但可以看到内核在
mount_root()
. 这意味着它在挂载您作为根文件系统传递的任何内容时存在问题。检查以确保您已将正确的参数传递给内核以从它应该从其引导的任何媒体引导。这实际上是可能的。您需要该特定发行版的调试内核。
在单独的主机上。
vmlinux
文件。在 gdb 中打开 vmlinux 文件。
从堆栈输出来看,我们可以看到在恐慌之前内核所在的最有用的函数是
mount_block_root
.为了确定我们失败的地方,我们需要将函数名和偏移量输入到 GDB 中。这是通过取消引用函数的地址加上偏移量来完成的。堆栈跟踪提供偏移量作为函数之后的第一个值。
IE
mount_block_root+0x225
表示(我在“mount_block_root”加上 549 个字节(十六进制转换)。最后,我们告诉 GDB 打印该区域的源代码。在我的 Linux 系统中,这会导致以下结果
从这里我们可以准确地知道我们在坠机点的位置。注意我的内核不是你的内核,所以偏移量可能是关闭的。基于这两个内核几乎相同的可能性,我敢打赌,真正的恐慌实际上发生在第 419 行,而不是第 422 行(如建议的那样)。
进一步阅读代码略微表明它无法打开指定的块设备 - 但如果没有崩溃转储,则无法从信息中判断原因。所以它可能: -
从您参考的链接开始,它建议您尝试以 NFS 作为根进行挂载,在这种情况下,您根本不应该最终登陆此功能。在这种情况下:
mount_nfs_root
)。因此,总体而言,根据问题中的信息,我认为您遗漏了某些内容或打错了字。
您可以在这里看到 Serva 如何解决正确的行(我与 Serva 开发有关) http://vercot.com/~serva/an/NonWindowsPXE3.html
Serva 使用 CIFS 共享而不是 NFS,但如果需要,您可以很好地使用 NFS。当然你不需要使用Serva;您可以在自己的 PXE 服务器中使用它的参数
请考虑
我今天在 Ubuntu 14.04 上遇到了同样的问题,而且非常令人讨厌,所以我想在这里与全世界分享我找到的解决方案......
我使用 pxelinux.0,NFS 用于根文件系统,TFTP 用于提供内核映像和 initramfs。正如@MatthewIfe 上面提到的,查看堆栈回溯和正在调用的函数清楚地表明此问题发生在与块设备相关的函数中,并且从未调用 mount_nfs_root。
所以我转向了 TFTP 日志,正如这篇文章的作者所指出的那样,并注意到我的配置文件被命名为:
它也看起来像这样:
我的 iPXE 加载程序也在寻找其他文件,就像在帖子中一样:
但是我在initrd的日志中没有看到被拉下的记录。所以我决定测试一下我的 APPEND 行是否正常工作。所以我再次添加了一个“panic=10”,就像链接的帖子一样。它似乎不起作用。所以我的内核配置行指令都没有被使用!凭直觉,我决定做两件事——简化我的文件以匹配帖子
并将其重命名为
瞧——initrd 被拉下,不再出现内核恐慌,并且 NFS 使用默认/通用内核和 initramfs 正确安装为根文件系统。我确定我可以将标签改回来等。我认为实际问题在于配置文件的命名以及 pxelinux.0 的预期。
我成功了。问题变得非常简单。我给 PXE 客户端一个 3.13.0-30 内核。但是我在具有 3.13.0-24 内核的机器上运行 mkinitramfs。
我开始为 PXE 客户端提供 3.13.0-24 内核并且它工作。