基于kexec的崩溃转储机制

===============================================
设计
===
当一个内核转储发生的时候kdump使用kexec启动一个备份的内核。这个备份启动的内核只是使用少量的内存,并且这些内存由第一个内核提供。这样设计保证了第一个内核启动且正在运行中的DMA不会破坏第二个内核的运行。
在内核崩溃之前所有关于核心映像的必要信息都用ELF格式编码并存储在保留的内存区域中。ELF头所在的物理地址被作为命令行参数(fcorehdr=)传递给新启动的转储内核。
在i386体系结构上,启动的时候需要使用物理内存开始的640K,而不管操作系统内核转载在何处。因此,这个640K的区域在重新启动第二个内核的时候由kexec备份。
在第二个内核中,“前一个系统的内存”可以通过两种方式访问:
- 第一种方式是通过/dev/oldmem这个设备接口。一个“捕捉”设备可以使用“raw”(裸的)方式 “读”这个设备文件并写出到文件。这是关于内存的 “裸”的数据转储,同时这些分析/捕捉工具应该足够“智能”从而可以知道从哪里可以得到正确的信息。ELF文件头(通过命令行参数传递过来的elfcorehdr)可能会有帮助。
- 第二种方式就是通过/proc/vmcore。这个方式是将转储输出为一个ELF格式的文件,并且可以方 便使用一些文件拷贝命令(比如cp,scp等等)将信息读出来。同时,gdb可以在得到的转储文件上做一些调试(有限的)。这种方式保证了内存中的页面都以正确的途径被保存。(注意内存开始的640K被重新映射了)
安装/设置
=======
1)使用root用户登录系统。
2)下载upstream kexec-tools用户空间包,下载地址:
http://www.xmission.com/~ebiederm/files/kexec/kexec-tools-1.101.tar.gz.
3)解包:
tar xvpzf kexec-tools-1.101.tar.gz
4)从下列地址得到最新的kdump补丁。
http://lse.sourceforge.net/kdump/
如果所有关于用户空间支持kdump的补丁都已经集成到了upstream kexec-tools中那么这一步可以被省略。
5)cd到解包得到的目录:
cd kexec-tools-1.101
6)使用patch命令应用补丁:
patch -p1
(注意使用正确的补丁目录和补丁文件)
7)配置这个包,使用如下命令:
./configure
8)编译包:
make
9)安装这个包:
make install
下载并构建系统内核和“转储-捕捉”内核
==============================
下载内核主版本树上的源码(从http://www.kernel.org),注意选择合适版本的内核(高于2.6.13-rc1版本)。需要编译两个内核:一个“系统内核”和一个“转储捕捉”内核。要使这个特性得以实现并工作需要相应的编译两个内核。
遵照以下的步骤以配置内核使用合适的kexec和kdump功能:
系统内核
-------
1)编译内核时要确认选中了“kexec system call”选项(在“处理器类型和功能”区域)。
CONFIG_KEXEC=y
2)编译内核时要确认选中了“sysfs file system support”(在“文件系统”->“伪文件系统”区域)。这通常是默认选中的。
CONFIG_SYSFS=y
注意:在“Configure standard kernel features (for small systems)”没有被使能(在“General Setup”区域)时“sysfs file system support”可能出现在“Pseudo filesystems"菜单中。在这种情况下,检查.config文件以确保sysfs被打开。可以参考:
grep 'CONFIG_SYSFS .config
3)在“kernel hacking”区域中选中“Compile the kernel with debug info”:
CONFIG_DEBUG_INFO=Y
这样就可以使编译内核的时候带上调试用的符号,转储分析工具需要一个带有调试信息的vmlinux(内核文件)来调试分析转储文件。
4)编译内核和模块并安装之。更新启动管理器(比如grub,lilo,yaboot等等)的配置文件。
5)引导系统内核时使用引导参数:crashkernel=Y@X。
注意要使用合适的X和Y的值。Y的值表示要为第二个内核保留多少内存,X的值表示保留的内存区开始的物理地址。例如:crashkernel=64M@16M 告诉系统内核保留64MB内存给“转储捕捉内核”使用,这64MB内存从物理地址0x01000000开始。
在x86和x86_64平台上,使用"crashkernel=64M@16M" 在ppc64平台上,使用"crashkernel=128M@32M"
转储捕获内核
----------
1)在“general setup”选项下,附加“-kdump”到“Local version”后面。
2)在x86平台上,在“Processor type and features”选项下使能高端内存支持:
CONFIG_HIGHMEM64G=y
或者:
CONFIG_HIGHMEM4G=y
3)在x86平台上,去掉对称多处理器的支持,在“Processor type and features”:
CONFIG_SMP=n
(如果不小心设置成了y,那么在启动转储捕获内核的时候给内核传递:maxcpus=1这样的命令行参数,参见“Load the Dump-capture Kernel”)
4)在ppc64平台上,去掉NUMA的同时加上EMBEDDED支持:
CONFIG_NUMA=n CONFIG_EMBEDDED=y CONFIG_EEH=N for 转储捕获内核
5)加上“kernel crash dumps”支持,位置在“Processor type and features”:
CONFIG_CRASH_DUMP=y
6)为“Processor type and features”->“Physical address where the kernel is loaded”设置合适的值。
注意,这个选项只可能在选中了“kernel crash dumps”选项之后出现。默认值是0x1000000(16MB)。这个值应当和上面讨论到的命令行选项“crashkernel=Y@X”中的“X” 的值相对应。
在x86和x86_64平台上,使用“CONFIG_PHYSICAL_START=0x1000000” 在ppc64平台上,当CONFIG_CRASH_DUMP被设置了那么就会自动给这个值赋值为32MB
7)可选择的使能“/proc/vmcore support”(在“Filesystems”->“Pseudo filesystems”选项下)。
CONFIG_PROC_VMCORE=y

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值