导致内核恐慌的原因是什么?

导致内核恐慌的原因是什么?

我刚刚在 Ubuntu 14 上设置了一个 PXE 启动服务器 - 运行内核 3.13.0-30-generic - 如下所述https://help.ubuntu.com/community/DisklessUbuntuHowto在 Supermicro X9DRFF 硬件上。

我只能通过 KVM 远程访问客户端服务器。客户端上的启动过程顺利进行,但我遇到了内核崩溃。

是否有可能确定此次内核恐慌的原因?

在此处输入图片描述

答案1

部分输出缺失,因为它已经滚出屏幕,但可以看到内核在 中崩溃了mount_root()。这意味着它在挂载您传递的根文件系统时出现了问题。请检查以确保您已将正确的参数传递给内核,以便从它应该从中引导的任何媒体进行引导。

答案2

这实际上是可能的。您需要该特定发行版的调试内核。

在单独的主机上。

  • 下载该内核的 kebug 版本。它将包含一个vmlinux文件。

在 gdb 中打开 vmlinux 文件。

$ gdb /usr/lib/debug/lib/modules/3.14.9-200.fc20.x86_64/vmlinux
GNU gdb (GDB) Fedora 7.7.1-13.fc20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/lib/debug/lib/modules/3.14.9-200.fc20.x86_64/vmlinux...done.
(gdb) 

从堆栈输出来判断,我们可以看到在崩溃之前内核最有用的函数是mount_block_root

为了确定在哪里如果失败了,我们需要将函数名称和偏移量输入到 GDB 中。这是通过取消引用函数地址和偏移量来实现的。堆栈跟踪将偏移量作为函数之后的第一个值。

IE 的mount_block_root+0x225意思是(我在“mount_block_root”加上 549 字节(十六进制翻译)。

最后,我们告诉 GDB 打印该区域的源代码。在我的 Linux 系统中,结果如下

(gdb) list *(mount_block_root+0x225)
0xffffffff81d26513 is in mount_block_root (init/do_mounts.c:422).
417                "explicit textual name for \"root=\" boot option.\n");
418 #endif
419         panic("VFS: Unable to mount root fs on %s", b);
420     }
421 
422     printk("List of all partitions:\n");
423     printk_all_partitions();
424     printk("No filesystem could mount root, tried: ");
425     for (p = fs_names; *p; p += strlen(p)+1)
426         printk(" %s", p);

从这里我们可以准确地知道事故发生时我们位于何处。笔记我的内核是不是您的内核,因此偏移量可能不对。基于这两个内核几乎相同的可能性,我敢打赌,真正的恐慌实际上发生在第 419 行,而不是第 422 行(如建议的那样)。

进一步阅读代码,稍微表明它无法打开指定的块设备——但如果没有崩溃转储,就无法从信息中判断原因。因此可能是:-

  • 您不想安装块设备(很可能)。
  • 您指定了一个不存在的块设备地址(或分区)。
  • 您的 initrd 中没有包含正确的文件系统模块来挂载它。
  • 磁盘上没有文件系统。
  • 文件系统的超级块不在该位置的开头。

根据您引用的链接,它表明您正在尝试使用 NFS 作为根目录进行挂载,在这种情况下您应该绝不最终还是会进入这个函数。在这种情况下:

  • 您的内核命令行包含多个根指令。
  • 您输入了错误的 NFS 地址,以致它无法被正确解析并进入您想要的实际功能(mount_nfs_root)。

因此,总体而言,根据问题中的信息,我认为您遗漏了某些内容或输入了错误。

答案3

  1. 引用的链接没有 PXE 启动 Lubuntu 14.04 所需的完整参数集(附加行)。
  2. 内核崩溃 => 由于 1),无法正确执行挂载。

你可以在这里看到 Serva 如何解决正确的问题(我与 Serva 开发有关) http://vercot.com/~serva/an/NonWindowsPXE3.html

Serva 使用 CIFS 共享而不是 NFS,但如果您愿意,也可以使用 NFS。当然,您不需要使用 Serva;您可以在自己的 PXE 服务器中使用它的参数

[PXESERVA_MENU_ENTRY]
asset    = Lubuntu 14.04 Desktop Live
platform = amd64
kernel   = NWA_PXE/$HEAD_DIR$/casper/vmlinuz
append   = showmounts toram root=/dev/cifs initrd=NWA_PXE/$HEAD_DIR$/casper/initrd.lz,NWA_PXE/$HEAD_DIR$/casper/INITRD_N11.GZ boot=casper netboot=cifs nfsroot=//$IP_BSRV$/NWA_PXE_SHARE/$HEAD_DIR$ NFSOPTS=-ouser=serva,pass=avres,ro ip=dhcp ro

请考虑

  1. Ubunu/Lubuntu 有一个错误,如果您使用 CIFS 进行 PXE 启动,则必须添加补充的 initrd INITRD_N11.GZ(可从 Serva 的页面免费获取)
  2. 如果您正在安装 64 位版本,前面的参数要求您将文件 \casper\vmlinuz.efi 重命名为 \casper\vmlinuz

答案4

我成功了。问题很简单。我给了 PXE 客户端一个 3.13.0-30 内核。但我在一台内核为 3.13.0-24 的机器上运行 mkinitramfs。

我开始给 PXE 客户端 3.13.0-24 内核并且它起作用了。

相关内容