适用于:✔️ Linux VM
总结
本文讨论可能导致内核崩溃的多个条件,并提供故障排除指南。
一般情况下,内核崩溃是内核无法正确加载的情况,因此系统无法启动。 当内核遇到无法处理的情况时,会出现另一种内核恐慌,并通过停止来保护自身。
先决条件
确保在 Linux VM 中启用串行控制台 并正常运行。
如何识别内核恐慌?
使用 Azure 门户在启动诊断边栏选项卡、串行控制台边栏选项卡或 AZ CLI 中查看 VM 的串行控制台日志输出,以标识特定的内核恐慌字符串。
内核恐慌类似于下面的输出,将在串行控制台日志的末尾显示:
Probing EDD (edd=off to disable)... ok
Memory KASLR using RDRAND RDTSC...
[ 300.206297] Kernel panic - xxxxxxxx
[ 300.207216] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G ------------ T 3.xxx.x86_64 #1
一些最常见的内核恐慌事件:
| 恐慌消息 | 原因 |
|---|---|
| 糟糕: 0000 [#1] SMP “ (查看日志以了解详细信息) | 由于取消引用错误的地址,系统崩溃。 |
| SysRq:触发故障转储 | 核心转储是通过 sysrq-c 发起的,或通过将 c 回显到 /proc/sysrq-trigger 来启动。 |
| 内核 BUG 位于 <pathname/filename>:<line number>! | 此格式是失败的 BUG 检查的标准(这与 ASSERT 类似,但逻辑被反转)。 文件名和行号将指示哪个 BUG 检查失败。 |
| 内核恐慌 - 未同步:软锁定:任务挂起 | 软锁定检测器发现了一颗 CPU,该 CPU 在软锁定阈值内未计划看门狗任务。 |
| 内核崩溃 - 未进行同步:看门狗检测到 CPU 0 上的硬锁定 | 硬锁定检测器发现了一个 CPU,该 CPU 在硬锁定阈值内未收到任何 hrtimer 中断。 |
| 内核恐慌 - 未同步:挂起任务:阻塞的任务 | 挂起的任务监视器检测到至少有一个任务处于不可中断状态,超过阻止的任务超时值。 |
| 内核恐慌 - 未同步:内存不足。 已选择“panic_on_oom” | 系统的内存和交换空间已耗尽,被迫开始杀死进程以释放内存空间(这不是默认行为)。 |
| 内核崩溃 - 未同步:内存不足,没有可终止的进程... | 系统内存和交换区已耗尽,系统一直在杀死进程以释放内存,但已没有更多进程可供杀死。 |
| 内核崩溃 - 未能同步:发生 NMI,请参阅集成管理日志以了解详细信息。 | 监视器已截获 NMI(不可屏蔽的中断)。 |
| 内核恐慌 - 未同步:NMI IOCK 错误:未继续 | 系统从硬件收到了一次 IO 检查 NMI(而不是内存奇偶校验错误),且已设置 kernel.panic_on_io_nmi(不是默认值)。 |
| 内核恐慌 - 未同步:NMI:停止 | 系统收到 NMI(硬件或内存奇偶校验错误),并且已设置kernel.panic_on_unrecovered_nmi(而不是默认值)。 |
| 内核恐慌 - 未同步:nmi 监视器 | 系统收到 NMI,并且已设置kernel.panic_on_timeout或kernel.panic_on_oops(而不是默认值)。 |
| 内核恐慌 - 未同步:严重计算机检查 | 已因致命状况引发机器检查异常事件。 |
| 内核恐慌 - 未同步:尝试终止 init! | init 进程是启动的第一个进程,不应退出。 |
| 内核恐慌 - 未同步:VFS:无法在未知块上装载根 fs(0,0) | 假设内核将使用 initramfs 来挂载 rootfs。 当内核没有 initramfs 时,会发生此错误。 |
场景 1:启动时发生内核崩溃
启动时出现内核崩溃会阻止 VM 完成操作系统启动过程。 每次启动虚拟机时都会发生这种情况,并且不允许登录。
此类事件通常相关,但包括但不限于:
- 最近的内核升级。
- 最近的内核降级。
- 内核模块更改。
- 操作系统配置更改(GRUB、sysctl 和 SELinux)。
- 缺少重要文件和目录。
- 缺少重要的系统核心库和包。
- 对文件的权限不正确。
- 缺少分区。
方案 1 的解决方法
为了处理此类内核恐慌,可以使用以下方法:
方法 1:使用Azure串行控制台
使用Azure串行控制台中断启动过程,并选择以前的内核版本(如果可用)。 这样,VM 就可以再次启动,然后可以使用以下方法之一来修复非启动内核的特定问题:
方法 2:使用救援 VM 脱机修复
如果Azure串行控制台不可用或没有以前的内核可用,则需要救援/修复 VM 才能进行脱机修复。
使用“修复 VM”命令创建附加了目标 VM OS 磁盘副本的修复 VM。 然后使用 chroot 装载修复 VM 中的 OS 文件系统的副本。 之后,请尝试以下方法来修复内核问题:
方案 2:运行时内核恐慌
操作系统启动过程完成后,这种内核恐慌通常会在不可预知的时刻触发,并导致 VM 停止响应,防止其登录。 它通常相关,但包括但不限于:
- 最近的内核升级。
- 最近的内核降级。
- 内核模块更改。
- 操作系统配置更改(GRUB、sysctl 和 SELinux)。
- 应用程序工作负荷更改。
- 应用程序开发中的更改或错误。
- 可能的内核问题。
- 与性能相关的问题。
方案 2 的解决方法
为了处理此类内核恐慌,可以使用以下方法:
- 查看资源使用情况和整体系统性能。 内核恐慌可能与可能导致 VM 大小调整的资源短缺有关。
- 如果可能,请安装相应的 Linux 分发存储库中可用的最新更新。 内核崩溃可能与内核或其他软件中的已知错误相关。
- 内核崩溃可能与最近的内核更改相关,在这种情况下,建议启动以前的内核版本,如方案 1的解决方法中所述。
- 如果上述选项不适用,则可能需要配置 kdump 并生成核心转储,以便与支持人员共享以进行进一步分析。
更详细的内核崩溃场景
常见的内核恐慌场景及具体故障排除/恢复指南:
| 文档 | 场景 |
|---|---|
| 在主机节点升级后,基于 3.10 内核的 Azure Linux VM 发生故障 | 本文讨论运行基于 3.10 的内核的 Azure Linux VM 在Azure主机节点升级后崩溃时发生的问题。 |
| 如何从内核相关的启动问题恢复 Azure Linux 虚拟机 | 本文提供了在应用内核更改后 Linux 虚拟机(VM)无法重启的问题的解决方案。 |