【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

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

                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  \ 
           --initrd= --args-linux \ 
           --append="root= init 1 irqpoll"


 

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

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

 

root@ubuntu:/home/user03# sudo apt-get install linux-crashdump
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  crash kexec-tools libdw1 makedumpfile
Suggested packages:
  kernel-patch-lkcd dumputils
The following NEW packages will be installed:
  crash kexec-tools libdw1 linux-crashdump makedumpfile
0 upgraded, 5 newly installed, 0 to remove and 299 not upgraded.
Need to get 2,703 kB of archives.
After this operation, 6,696 kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://us.archive.ubuntu.com/ubuntu/ quantal/main libdw1 i386 0.153-1ubuntu1 [217 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ quantal/main crash i386 5.1.6-1ubuntu1 [2,278 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ quantal/main makedumpfile i386 1.4.4-1 [116 kB]                                                                                     
Get:4 http://us.archive.ubuntu.com/ubuntu/ quantal/main kexec-tools i386 1:2.0.3-1ubuntu2 [89.9 kB]                                                                            
Get:5 http://us.archive.ubuntu.com/ubuntu/ quantal-updates/main linux-crashdump i386 3.5.0.25.31 [2,710 B]                                                                     
Fetched 2,703 kB in 1min 45s (25.5 kB/s)                                                                                                                                       
Preconfiguring packages ...
Selecting previously unselected package libdw1:i386.
(Reading database ... 153844 files and directories currently installed.)
Unpacking libdw1:i386 (from .../libdw1_0.153-1ubuntu1_i386.deb) ...
Selecting previously unselected package crash.
Unpacking crash (from .../crash_5.1.6-1ubuntu1_i386.deb) ...
Selecting previously unselected package makedumpfile.
Unpacking makedumpfile (from .../makedumpfile_1.4.4-1_i386.deb) ...
Selecting previously unselected package kexec-tools.
Unpacking kexec-tools (from .../kexec-tools_1%3a2.0.3-1ubuntu2_i386.deb) ...
Selecting previously unselected package linux-crashdump.
Unpacking linux-crashdump (from .../linux-crashdump_3.5.0.25.31_i386.deb) ...
Processing triggers for man-db ...
Processing triggers for ureadahead ...
ureadahead will be reprofiled on next reboot
Setting up libdw1:i386 (0.153-1ubuntu1) ...
Setting up crash (5.1.6-1ubuntu1) ...
Setting up makedumpfile (1.4.4-1) ...
Setting up kexec-tools (1:2.0.3-1ubuntu2) ...
Generating /etc/default/kexec...
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.5.0-17-generic
Found initrd image: /boot/initrd.img-3.5.0-17-generic
Found memtest86+ image: /boot/memtest86+.bin
done
update-rc.d: warning: kdump start runlevel arguments (2) do not match LSB Default-Start values (0 1 2 3 4 5)
update-rc.d: warning: kdump stop runlevel arguments (none) do not match LSB Default-Stop values (6)
Processing triggers for ureadahead ...
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-3.5.0-17-generic
Setting up linux-crashdump (3.5.0.25.31) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
root@ubuntu:/home/user03# 
root@ubuntu:/etc# service kdump start
 * Loading crashkernel...                                                                                                                                                [ OK ] 
root@ubuntu:/etc#


 

你可能感兴趣的:(linux)