作家
登录

使用Kdump检查Linux内核崩溃

作者: 来源: 2017-08-02 15:55:14 阅读 我要评论

当“第一内核”崩溃时,它履行须要的退出过程并切换到 purgatory(如不雅存在)。purgatory 验证加载二进制文件的 SHA256,如不雅是精确的,则将控制权传递给“捕获内核”。“捕获内核”根据大年夜 elfcorehdr 接收到的体系内存信息创建 vmcore。是以,“捕获内核”启动后,您将看到 /proc/vmcore 中“第一内核”的转储。根据您应用的 initramfs,您如今可以分析转储,将其复制到任何磁盘,也可所以主动复制的,然后从新启动到稳定的内核。

内核体系调用

内核供给了两个体系调用:kexec_load() 和 kexec_file_load(),可以用于在履行 kexec -l 时加载“第二内核”。它还为 reboot() 体系调用供给了一个额外的标记,可用于应用 kexec -e 引导到“第二内核”。

  1. long kexec_load(unsigned long entry, unsigned long nr_segments, 
  2. struct kexec_segment *segments, unsigned long flags); 

用户空间须要为不合的组件传递不合的段,如内核,initramfs 等。是以,kexec 可履行文件有助于预备这些段。kexec_segment 的构造如下所示:

  1. struct kexec_segment { 
  2.     void *buf; 
  3.     /* 用户空间缓冲区 */ 
  4.     size_t bufsz; 
  5.     /* 用户空间中的缓冲区长度 */ 
  6.     void *mem; 
  7.     /* 内核的物理地址 */ 
  8.     size_t memsz; 
  9.     /* 物理地址长度 */ 
  10. }; 

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 邮件列表。
  1. long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long 
  2. cmdline_len, const char __user * cmdline_ptr, unsigned long 
  3. 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 法度榜样头的示例如下:

  1. # objdump -p vmcore 
  2. vmcore: 
  3. file format elf64-littleaarch64 
  4. Program Header: 
  5. NOTE off 0x0000000000010000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0 filesz 
  6. 0x00000000000013e8 memsz 0x00000000000013e8 flags 

      推荐阅读

      AWS 张侠:为企业创新和转型提供助力

    【51CTO.com原创稿件】7月26日,2017 “云•执掌将来”AWS技巧峰会在北京国度会议中间┞焚开。大年夜会覆盖了基本办事、架构、安然、IoT、大年夜数据、AI等多个热点主题,>>>详细阅读


    本文标题:使用Kdump检查Linux内核崩溃

    地址:http://www.17bianji.com/lsqh/36514.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)