当“第一内核”崩溃时,它履行须要的退出过程并切换到 purgatory(如不雅存在)。purgatory 验证加载二进制文件的 SHA256,如不雅是精确的,则将控制权传递给“捕获内核”。“捕获内核”根据大年夜 elfcorehdr 接收到的体系内存信息创建 vmcore。是以,“捕获内核”启动后,您将看到 /proc/vmcore 中“第一内核”的转储。根据您应用的 initramfs,您如今可以分析转储,将其复制到任何磁盘,也可所以主动复制的,然后从新启动到稳定的内核。
内核体系调用
内核供给了两个体系调用:kexec_load() 和 kexec_file_load(),可以用于在履行 kexec -l 时加载“第二内核”。它还为 reboot() 体系调用供给了一个额外的标记,可用于应用 kexec -e 引导到“第二内核”。
- long kexec_load(unsigned long entry, unsigned long nr_segments,
- struct kexec_segment *segments, unsigned long flags);
用户空间须要为不合的组件传递不合的段,如内核,initramfs 等。是以,kexec 可履行文件有助于预备这些段。kexec_segment 的构造如下所示:
- struct kexec_segment {
- void *buf;
- /* 用户空间缓冲区 */
- size_t bufsz;
- /* 用户空间中的缓冲区长度 */
- void *mem;
- /* 内核的物理地址 */
- size_t memsz;
- /* 物理地址长度 */
- };
kexec_file_load():作为用户,你只需传递两个参数(即 kernel 和 initramfs)到 kexec 可履行文件。然后,kexec 大年夜 sysfs 或其他内核信息源中攫取数据,并创建所有段。所以应用 kexec_file_load() 可以简化用户空间,只传递内核和 initramfs 的文件描述符。其余部分由内核本身完成。应用此体系调用时应当启用 CONFIG_KEXEC_FILE。它的原型如下:
kexec -p kernel_image 没有成功
- 检查是否分派了崩溃内存。
- cat /sys/kernel/kexec_crash_size 不该该有零值。
- cat /proc/iomem | grep "Crash kernel" 应当有一个分派典范围。
- 如不雅未分派,则在敕令行中传递精确的 crashkernel= 参数。
- 如不雅没有显示,则在 kexec 敕令中传递参数 -d,并将输出信息发送到 kexec-tools 邮件列表。
- long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long
- cmdline_len, const char __user * cmdline_ptr, unsigned long
- flags);
请留意,kexec_file_load 也可以接收敕令行,而 kexec_load() 不可。内核根据不合的体系架构来接收和履行敕令行。是以,在 kexec_load() 的情况下,kexec-tools 精晓过个一一个段(如在 dtb 或 ELF 引导注释等)中传递敕令行。
今朝,kexec_file_load() 仅支撑 x86 和 PowerPC。
当内核崩溃时会产生什么
当第一个内核崩溃时,在控制权传递给 purgatory 或“捕获内核”之前,会履行以下操作:
- 预备 CPU 存放器(拜见内核代码中的 crash_setup_regs());
- 更新 vmcoreinfo 备注(请参阅 crash_save_vmcoreinfo());
- 封闭非崩溃的 CPU 并保存预备好的存放器(请参阅 machine_crash_shutdown() 和 crash_save_cpu());
- 您可能须要在此处禁用中断控制器;
- 最后,它履行 kexec 从新启动(请参阅 machine_kexec()),它将加载或刷新 kexec 段到内存,并将控制权传递给进入段的履行文件。输入段可所以下一?内核的 purgatory 或开端地址。
ELF 法度榜样头
kdump 中涉及的大年夜多半转储核心都是 ELF 格局。是以,懂得 ELF 法度榜样头部很重要,特别是当您想要找到 vmcore 预备的问题。每个 ELF 文件都有一个法度榜样头:
- 由体系加载器攫取,
- 描述若何将法度榜样加载到内存中,
- 可以应用 Objdump -p elf_file 来查看法度榜样头。
vmcore 的 ELF 法度榜样头的示例如下:
- # objdump -p vmcore
- vmcore:
- file format elf64-littleaarch64
- Program Header:
- NOTE off 0x0000000000010000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0 filesz
- 0x00000000000013e8 memsz 0x00000000000013e8 flags
推荐阅读
【51CTO.com原创稿件】7月26日,2017 “云•执掌将来”AWS技巧峰会在北京国度会议中间┞焚开。大年夜会覆盖了基本办事、架构、安然、IoT、大年夜数据、AI等多个热点主题,>>>详细阅读
本文标题:使用Kdump检查Linux内核崩溃
地址:http://www.17bianji.com/lsqh/36514.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示