Kdump
kdump是在系统崩溃、死锁、或者死机的时候用来转储内存为vmcore保存到磁盘的一个工具和服务
相关配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| CONFIG_KEXEC=y CONFIG_KEXEC_FILE=y
CONFIG_CRASH_DUMP=y
CONFIG_PROC_VMCORE=y
CONFIG_RELOCATABLE=y
CONFIG_SYSFS=y CONFIG_DEBUG_INFO=y
|
安装用户态工具包
1 2
| sudo apt install kdump-tools sudo apt install makedumpfile
|
配置预留内存
配置第一内核启动参数(/etc/default/grub.d/kdump-tools.cfg):
1
| GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=512M"
|
完整的格式可以是:crashkernel=1G-:512M@3G,其含义是:
- 当内存大于1G时,预留512M
- 预留位置在3G
- 如果“@offset”部分留空的话,内核会自动寻找合适的位置。(一般都不需要指定)
- 在x86虚拟机环境里,直接用crashkernel=512M就能正常运行,但某些架构不行,所以推荐用这个格式:crashkernel=1G-:512M。
- 预留内存大小默认是128M,一般而言都太小了,建议使用512M
注意:
- sw内核的crashkernel代码不完整,没有实现自动寻找的功能,所以不指定offset时会默认为offset=0,与第一内核发生冲突而导致系统起不来,此时应该用完整的格式,比如1G-:512M@3G。
配置完成后需要重启系统生效
有两种方式可以确认内核是否正确完成了内存预留:
1 2 3
| sudo dmesg | grep -i crashkernel
[0.008200] Reserving 512MB of memory at 1520MB for crashkernel (System RAM: 4095MB)
|
1 2 3 4 5 6 7 8
| sudo cat /proc/iomem
00100000-7ffdbfff : System RAM 01000000-02002287 : Kernel code 02200000-02cb1fff : Kernel rodata 02e00000-0311473f : Kernel data 03449000-039fffff : Kernel bss 5f000000-7effffff : Crash kernel
|
触发Kdump
- 手动触发
- 开启sysrq
sysctl kernel.sysrq=1
- 触发panic
echo c > /proc/sysrq-trigger
- oops
- oom
- softlockup/hardlockup
- rcu-stall
设置自动触发kdump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| sysctl -a | grep panic
kernel.panic = 10 kernel.panic_on_oops = 1 kernel.panic_on_rcu_stall = 0 kernel.panic_on_warn = 0
#kernel.panic #内核发生 panic 后多少秒自动重启。0 表示不自动重启。
#kernel.panic_on_oops #如果为 1,遇到 Oops(内核严重错误)时也会像 panic 一样处理(可触发 kdump)。
#kernel.panic_on_rcu_stall #如果为 1,RCU stall(RCU 机制长时间未响应)时自动 panic。
#kernel.panic_on_warn #如果为 1,遇到严重内核警告(WARN)时自动 panic。
|
永久生效方法
编辑 /etc/sysctl.conf
1
| sudo nano /etc/sysctl.conf
|
加入你需要的参数,比如:
1 2
| kernel.panic = 10 kernel.panic_on_oops = 1
|
保存后,执行
立即生效,也会在每次开机自动生效。