zoukankan      html  css  js  c++  java
  • [Linux]Kdump简介&配置、触发

    0、Kdump 的概念出现在 2005 左右,是迄今为止最可靠的内核转存机制,已经被主要的 linux™ 厂商选用

          LKCD(Linux Kernel Crash Dump),netdump,diskdump 已被纳入 LDPs(Linux Documen-tation Project) 内核。SUSE 和 RedHat 都对 kdump 有技术支持。

    1、kdump是在系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务;

    2、安装&配置

          安装:sudo apt-get install linux-crashdump    ubuntu版本

          配置/etc/kdump.conf文件,指定vmcore 将被转储的路径。可以通过scp拷贝到另一个服务器,也可以是裸设备,或者本地的文件系统。

          启动kdump服务:service kdump start

    调节内存大小

    查看是否调解成功

     更新内核存储

     重启生效

    查看kdunp状态

         触发:可以通过kexec加载内核镜像,让系统准备捕获一个崩溃时产生的vmcore。可以通过sysrq强制系统崩溃

         此图为失败的案例,成功的出发kdump系统会重启。

                    echo "c" > /proc/sysrq-trigger
                    这造成kernel panic,紧跟着系统重启kdump内核。当启动进程进入到启动kdump服务器时,vmcore将会被拷贝到你在/etc/kdump.conf文件中指定的位置

          注意:当系统崩溃 时,kdump使用kexec启动到第二个内核。第二个内核通常叫做捕获内核(capture kernel),以很小内存启动,并且捕获转储镜像。

    3、 配置保留内存用来转储

          对于i386和x86_64架构,编辑/etc/grub.conf启动配置文件,在内核行的末尾添加 crashkernel=128@16M,例如:

          root (hd0,0)        kernel /boot/vmlinuz-2.6.17-1.2519.4.21.el5 ro root=LABEL=/ rhgb quietcrashkernel=128M@16M         initrd /boot/initrd-2.6.17-1.2519.4.21.el5.img

          128M内存(从16M开始)不被正常的系统使用,为捕获内核保留。注意,free -m的输出会显示内存比不加参数时少了128M,这就是我们所期望的。

           注意:可以使用小于128M,但是只使用64M做测试被证实是不可靠的。

    4、如何访问捕获内存

    在内核崩溃之前所有关于核心映像的必要信息都用 ELF 格式编码并存储在保留的内存区域中。ELF 头所在的物理地址被作为命令行参数(fcorehdr=)传递给新启动的转储内核。

    在 i386 体系结构上,启动的时候需要使用物理内存开始的 640K,而不管操作系统内核转载在何处。因此,这个 640K 的区域在重新启动第二个内核的时候由 kexec 备份。

    在第二个内核中,“前一个系统的内存”可以通过两种方式访问:

    1. 通过 /dev/oldmem 这个设备接口。

    一个“捕捉”设备可以使用“raw”(裸的)方式 “读”这个设备文件并写出到文件。这是关于内存的 “裸”的数据转储,同时这些分析 / 捕捉工具应该足够“智能”从而可以知道从哪里可以得到正确的信息。ELF 文件头(通过命令行参数传递过来的 elfcorehdr)可能会有帮助。

    2. 通过 /proc/vmcore。

    这个方式是将转储输出为一个 ELF 格式的文件,并且可以使用一些文件拷贝命令(比如 cp,scp 等)将信息读出来。同时,gdb 可以在得到的转储文件上做一些调试(有限的)。这种方式保证了内存中的页面都以正确的途径被保存 ( 注意内存开始的 640K 被重新映射了 )。

    5、关于转储内核

    需要引导系统内核时,可使用如下步骤和命令载入“转储捕获”内核:

     kexec -p <dump-capture-kernel>  
               --initrd=<initrd-for-dump-capture-kernel> --args-linux  
               --append="root=<root-dev> init 1 irqpoll"

    装载转储捕捉内核的注意事项:

    转储捕捉内核应当是一个 vmlinux 格式的映像(即是一个未压缩的 ELF 映像文件),而不能是 bzImage 格式;
    默认情况下,ELF 文件头采用 ELF64 格式存储以支持那些拥有超过 4GB 内存的系统。但是可以指定“--elf32-core-headers”标志以强制使用 ELF32 格式的 ELF 文件头。这个标志是有必要注意的,一个重要的原因就是:当前版本的 GDB 不能在一个 32 位系统上打开一个使用 ELF64 格式的 vmcore 文件。ELF32 格式的文件头不能使用在一个“没有物理地址扩展”(non-PAE)的系统上(即:少于 4GB 内存的系统);
    一个“irqpoll”的启动参数可以减低由于在“转储捕获内核”中使用了“共享中断”技术而导致出现驱动初始化失败这种情况发生的概率 ;
    必须指定 <root-dev>,指定的格式是和要使用根设备的名字。具体可以查看 mount 命令的输出;“init 1”这个命令将启动“转储捕捉内核”到一个没有网络支持的单用户模式。如果你希望有网络支持,那么使用“init 3”。

    下面是redhat和susue的流程图

    http://www.dedoimedo.com/computers/kdump.html

    Kdump official website

    Kdump official documentation

    Debugging Linux kernel using Kdump (pdf)

     

     

  • 相关阅读:
    CodeForces 500C New Year Book Reading
    CodeForces 460B Little Dima and Equation 枚举
    CodeForces 451B Sort the Array
    【jquery】jQuery实现轮播图
    【IDEA】IDEA技巧记录
    【eclipse】日常使用eclipse记录
    【SSM】spring配置文件中读取配置文件的三种方式
    【Git】IDEA克隆和提交项目于码云
    semantic UI—表单验证
    【spring Data Jpa】JPA生成数据库表
  • 原文地址:https://www.cnblogs.com/WinkJie/p/12523865.html
Copyright © 2011-2022 走看看