这里写目录标题
Kdump文档
常见概念和问题
-
生产内核与捕获内核
product kernel: 正常时候用的内核;
dump-cature kernel:os panic崩溃时候,正常内核崩了的时候的替补内核,用来运行必须的进程来获取崩溃当时的内存的全部信息 -
什么时候启动捕获内核?通过什么?
在需要获取系统内核内存信息时(例如,当系统出现故障时),
Kdump使用kexec快速启动捕获内核。 -
系统内核的内存映像(内存快照:内存在某时间点下的状态记录)在重启过程中被保留,捕获内核可以访问它。
-
我们可以使用常见的命令,如cp和scp,将内存image复制到本地磁盘上,保存为dump文件(转储文件),或通过网络复制到远程系统。
-
ELF格式:Executable and Linkable Format,即可执行文件,目标文件,共享链接库和内核转储(core dumps)准备的标准文件格式。 Linux和很多类Unix操作系统都使用这个格式。
Kdump支持的技术栈(架构)
KDUMP和KEXEC目前支持X86,X86_64,PPC64,IA64,S390x,ARM和ARM64架构。
当系统内核(生产内核)引导时,它会为转储捕获内核保留一小块内存。
那为什么要为内核单独保留一小块内存?
因为这确保了来自系统内核的正在进行的直接内存访问(DMA)不会破坏转储捕获内核。
那这个保留的内存如何使用?
kexec -p
命令将dump-capture内核加载到这个保留的内存中。
引导所需的内存大小
-
在x86机器上,无论内核加载在哪里,引导都需要前640 KB的物理内存。因此,在重新引导到转储捕获内核之前,kexec会备份该区域。
-
在PPC64机器上,无论内核加载在哪里,引导都需要第一个32KB的物理内存,为了支持64K页面page-size大小,kexec备份第一个64KB内存。
-
在s390x机器上,当触发kdump时,crashkernel区域与区域[0,crashkernel region size]交换,然后kdump内核以[0,crashkernel region size]运行。因此s390x不需要重定位内核。
关于系统内核核心映像的所有必要信息都以ELF格式编码,并在崩溃前存储在内存的预留区域中。ELF-header开始的物理地址通过elfcorehdr= boot
参数传递给捕获内核。ELF-header的大小也可以在使用elfcorehdr=[size[KMG]@]offset[KMG]
语法时传递。
必备操作 | X86 | PPC64 |
---|---|---|
引导所需 | 640KB | 64KB |
可以使用dump-cature-kernel在/proc/vamcore里访问内存映像。
设置和安装
安装 kexec-tools
- root用户登录
- 下载kexec-tools; http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz
- 解压:
tar xvpzf kexec-tools.tar.gz
- 切换目录:
cd kexec-tools-VERSION
- 配置package:
./configure
- 编译:
make
- 安装:
make install
构建dump捕获内核的方式
有两种方法使用kdump。
1)构建单独的订制的转储捕获内核以捕获kernel dump。
2)或使用系统生产内核二进制本身作为转储捕获内核;也就是说无需构建单独的捕获内核。这个只有支持可重定位内核的架构才能使用。当今,I386,X86_64,PPC64,IA64,ARM和ARM64架构支持可重定位内核。
。
启用kdump的配置。
- 启用"kexec system call" in “Processor type and features.”
CONFIG_KEXEC=y
- 启用"sysfs file system support" in “Filesystem” -> “Pseudo
filesystems.” 这一般是默认的;
CONFIG_SYSFS=y
- 启用“kernel hacking”中的“Compile the kernel with debug info”。
CONFIG_DEBUG_INFO=Y
这使得内核带有调试符号。转储分析工具需要一个带有调试符号的vmlinux,以便读取和分析转储文件。