什么是内核恐慌?

我刚完成了一个操作系统课程。我经常听到一个短语"kernel panic"。你能解释一下吗?
  1. 什么是内核恐慌?
  2. 为什么会发生内核恐慌?
  3. 如何知道发生了内核恐慌?
  4. 它对系统有什么影响?
  5. 它只会在Linux中发生吗?
  6. 如何预防内核恐慌?

核心恐慌是Mac电脑上的错误信息的一部分。如果显示“恐慌,我们被困在这里”(猜测可能是Unix的一部分)。 - Alvar
22如果你正在上操作系统课程,为什么不向讲师请教他们所使用的术语呢?这样你会更好地学到很多东西。 - TRiG
4个回答

每次只能提出一个问题,参考常见问题解答

  1. 什么是内核恐慌?
    当内核无法正确加载或“疯狂”并且无法正常启动或崩溃时(请参阅底部的编辑来源)。

  2. 为什么会发生这种情况?
    更新失败、硬件故障、不支持的硬件、驱动器或分区损坏或丢失(请参阅底部的编辑来源)

  3. 如何判断是否发生了内核恐慌?
    观察启动提示(关闭安静内核参数)或者您的计算机无法正常启动

  4. 它对系统有什么影响?
    无法正常启动或系统崩溃

  5. 它只会在Linux中发生吗?
    不,所有类Unix操作系统都可能发生内核恐慌。这相当于Windows蓝屏死机

  6. 如何预防它发生?
    通常不会发生。测试更新并排除问题。使用稳定版本而不是开发分支。

附加说明:内核恐慌和系统故障/关机可以直接保护您的计算机免受物理损害。例如,在过热或磁盘损坏之前停止运行。请参见底部的编辑信用,以获取直接引用。
编辑:
根据B. Roland的建议,丢失或损坏的磁盘或卷也可能导致此问题。 (很好的观点,我忽略了这一点)
根据Kees的建议,内核恐慌也可能发生在运行时。 注意:当内核中的某个功能出现故障时,可能会以某种优雅的方式发生内核恐慌,但最常发生在模块或内核加载期间(通常在启动时)。我原以为在“在启动或系统崩溃期间”已经提到了这一点,但我看到我的回答只说它只发生在启动时。
根据rafalcieslak的直接引用,“有一件非常重要的事情必须补充:整个内核恐慌的主要目的是保护您的计算机。内核冻结不仅是因为它未能完成某些操作,还为了防止您的计算机过热、硬盘损坏以及其他可能发生的硬件问题,如果执行了一些错误的指令,或者某个模块(例如负责控制风扇的模块)未能加载等。这就是为什么内核更倾向于冻结而不是解决问题。”

3添加到问题2:缺少引导文件(例如,当LVM卷丢失时)... - antivirtel
@B. Roland 已添加并给予了认可 - RobotHumans
很好,谢谢 - 我写了它,因为它曾经发生在我身上...(我意外地在LVM中格式化了一个卷...) - antivirtel
8这个答案是不正确的。内核恐慌不仅限于启动失败。JanC的回答更正确("内核检测到无法恢复的错误")。无法启动只是其中的一种情况之一。 - Kees Cook
@Kees Cook - 抱歉之前表达不清楚...我在#中提到了这个问题。它对系统有什么影响?无法启动或系统崩溃。已编辑并标注归属。 - RobotHumans
2有一件非常重要的事情必须补充:整个核心恐慌的主要目的是保护您的计算机。内核冻结不仅是因为它未能完成某些操作,还是为了防止您的计算机过热、硬盘损坏以及其他可能发生的硬件问题。如果某个模块(例如负责控制风扇的模块)未能加载等,这可能导致执行某些错误指令。这就是为什么内核更喜欢冻结而不是解决问题的原因。 - Rafał Cieślak
@rafalcieslak - 已编辑和署名。 - RobotHumans

当内核检测到无法恢复的错误时,会发生“内核恐慌”(kernel panic)。一个名为“panic()”的函数用于处理这种情况(通常通过转储一些调试信息和/或重新启动系统),它最早在早期UNIX版本中引入,因此名字就来源于此(大多数类UNIX操作系统,包括Mac OS X,仍然称之为如此)。
微软NT内核中著名的“蓝屏死亡”(官方称为“致命系统错误”,如VMS/OpenVMS所称)也是一种“内核恐慌”的形式。
Linux内核可以(部分或临时地)从中恢复的错误被称为“内核糊涂”(有时您可能会在dmesg输出中看到这些错误)。
导致内核恐慌的原因可能是内核中的错误(例如内核的一部分的驱动程序中的错误)或者硬件或软件问题会给内核造成意外/不可预测的状态(例如无法启动init进程或它被杀掉)。
要找出是什么原因导致了这个问题,你可以查看屏幕上是否有任何打印信息,或者串行控制台(如果你配置了的话)。如果系统配置允许,你还可以让系统生成一个Linux内核崩溃转储,将内核内存保存到磁盘中,以便内核开发人员进行分析(当然,这需要系统能够写入磁盘)。在某些情况下,/var/log/messages文件可能也包含有用的信息(例如,在某些情况下,从oops恢复可能会导致后续无法恢复的错误)。更详细的信息可以在这里找到。

我现在的系统,Ubuntu 16.04,出现了内核恐慌。我的电脑之前一直提示启动磁盘已满,所以我运行了'apt autoremove'命令。它删除了我认为是不必要的文件,结果就是出现了内核恐慌。
所以我猜任何对启动磁盘的编辑都可能导致内核恐慌。如果你不注意自己在做什么,就不要随意操作它。

这并不能帮助解决楼主的问题。:( - Mike Williamson

@RobotHumans的回答涵盖了你问题的所有部分。然而,我想详细说明一下Kernel Panic的原因。
首先,有两种类型的Kernel Panic - 软件Kernel Panic(也称为Oops)和硬件Kernel Panic(也称为Aieee!)。
当系统遇到无法处理的异常时,会进入硬件Kernel Panic模式。相对而言,软件Kernel Panic较容易处理。
Kernel Panic的原因有很多,但最常见的如下:
- 有缺陷或不兼容的RAM是Kernel Panic最常见和频繁的原因。 - 过时、不兼容或损坏的内核扩展。 - 过时、不兼容或损坏的内核驱动程序。 - 硬盘损坏或出现问题,如坏道或目录损坏,也可能导致Kernel Panic。 - 内存或硬盘空间不足。 - 有缺陷的硬件、编写不良的程序或硬件故障也可能导致Kernel Panic。
值得注意的是,只有位于内核空间的模块才能引起Kernel Panic。可以运行"lsmod"命令获取动态加载模块的列表。
要解决内核恐慌问题,请检查/var/log/messages。有时候所有相关信息都会被记录在那里,而有时候却没有任何与内核恐慌相关的记录。虽然遇到内核恐慌是不可避免的,但没有太多需要担心的事情。