Azure Linux VM 中的内核崩溃
适用于:✔️ 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 来启动。 |
pathname/filename>:<line number>!< | 此格式是失败的 BUG 检查的标准(这与 ASSERT 类似,但逻辑被反转)。 文件名和行号将指示哪个 BUG 检查失败。 |
内核恐慌 - 未同步:软锁:挂起的任务 | 软锁定检测器发现了一个 CPU,该 CPU 未在软锁定阈值内计划监视程序任务。 |
内核崩溃 - 未同步:监视器检测到 CPU 0 上的硬 LOCKUP | 硬锁定检测器发现了一个 CPU,该 CPU 在硬锁定阈值内未收到任何 hrtimer 中断。 |
内核恐慌 - 未同步:hung_task:阻止的任务 | 挂起的任务监视器检测到至少有一个任务处于不可中断状态,超过阻止的任务超时值。 |
内核崩溃 - 未同步:内存不足。 已选择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)。
- 应用程序工作负荷更改。
- 应用程序开发更改或 bug。
- 可能的内核 bug。
- 与性能相关的问题。
方案 2 的解决方法
为了处理此类内核恐慌,可以使用以下方法:
- 查看资源使用情况和整体系统性能。 内核恐慌可能与可能导致 VM 大小调整的资源短缺有关。
- 如果可能,请安装相应的 Linux 分发存储库中可用的最新更新。 内核崩溃可能与内核或其他软件中的已知 bug 相关。
- 内核崩溃可能与最近的内核更改相关,在这种情况下,建议启动以前的内核版本,如方案 1 的解决方法中所述。
- 如果上述选项不适用,则可能需要配置 kdump 并生成一个核心转储,以便与支持人员进行进一步分析共享。
更具体的内核恐慌方案
具有特定故障排除/恢复说明的常见内核恐慌方案:
Document | 场景 |
---|---|
主机节点升级后基于 3.10 内核的 Azure Linux VM 出现错误 | 本文讨论在 Azure 中运行基于 3.10 的内核的 Azure Linux VM 在 Azure 中升级主机节点后崩溃时发生的问题。 |
如何从与内核相关的启动问题恢复 Azure Linux 虚拟机 | 本文提供了在应用内核更改后 Linux 虚拟机(VM)无法重启的问题的解决方案。 |
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。