0.前言
1.引用:
解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云
解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云
ubuntu内核转储分析------kdump和crash的下载和使用_ubuntu kdump-CSDN博客
Ubuntu的Kdump_ubuntu22 kdump-CSDN博客
Linux下用火焰图进行性能分析_perf火焰图分析-CSDN博客
2.Ubuntu22.04安装 kdump
本小节主要参考了如下博文里的内容,在Ubuntu22.04上安装内核转存分析工具kdump。
安装命令
bash
sudo apt install linux-crashdump
配置kexec-tools
安装时,会弹框确认是否在崩溃时,通过 kexec-tools 快速重新启动到一个新的内核,以便进行崩溃信息的收集和分析。
这里选择Yes
如果选择了No,也可以手动启动
bash
sudo dpkg-reconfigure kexec-tools
这将修改/etc/init.d/kexec中的LOAD_KEXEC ,LOAD_KEXEC=true(未测试)
配置kdump-tools
上面的内容选择了Yes,接着继续弹出一个框,这里仍然选择Yes
如果选择了No,也可以手动启动
bash
sudo dpkg-reconfigure kdump-tools
配置成功后生成的文件
安装成功后,将会在/etc/init.d中多了几个文件
kdump-tools
kexec
kexec-load
确认kdump-tool是否启用
bash
sudo kdump-config show
如果未安装kdump,将会提示
kdump-config: command not found
如果安装了kdump-config, 将会提示:
* no crashkernel= parameter in the kernel cmdline
DUMP_MODE: kdump
USE_KDUMP: 1
KDUMP_SYSCTL: kernel.panic_on_oops=1
KDUMP_COREDIR: /var/crash
crashkernel addr:
/var/lib/kdump/vmlinuz
kdump initrd:
/var/lib/kdump/initrd.img
current state: Not ready to kdump
kexec command:
no kexec command recorded
如果是如上提示,需要把Ubuntu22.04系统给重启一下,重启之后再次执行命令。
bash
sudo kdump-config show
命令输出结果显示kdump已经配置成功。
3.手动触发内核崩溃,生成转储文件
第一步:
bash
sudo sh -c "echo 1 > /proc/sys/kernel/sysrq"
第二步
bash
sudo sh -c "echo c > /proc/sysrq-trigger"
这里不直接使用sudo echo x > /proc/xxx/xxx/xxx的原因是使用它会报错Permission denied,是因为重定向符号 ">" 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,但是没有让 ">" 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。
其中echo 1 > /proc/sys/kernel/sysrq和echo c > /proc/sysrq-trigger是用来触发SysRq功能的命令。SysRq功能是一种种魔术系统请求键,可以让用户向内核发送一些特殊的命令,以获取或控制系统的信息或状态。
echo 1 > /proc/sys/kernel/sysrq向sysrq文件中写入1是为了开启SysRq功能(写入0是关闭SysRq功能),但是这需要内核支持(CONFIG_MAGIC_SYSRQ选项),它会让内核响应用户输入的任何操作,只要内核没有挂掉。此功能只是临时开启,重启后SysRq会自动关闭。如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1. 重新启动以后,此功能将会自动打开。
echo c > /proc/sysrq-trigger是用来触发故意让系统统崩溃(crash)命令的命令,它会让内核立即即崩溃,并且不会管你有没有数据没有写回回磁盘,也不卸载载磁盘,而是完完全全地关机。
执行后,等待系统重启,在/var/crush中会生成几个文件:
其中
- kexec_cmd是默认就有的
- dmesg.202401021909:这个文件是系统内核崩溃时的内核日志,它记录了内核崩溃的原因和上下文信息,可以用来分析内核崩溃的原因和过程。
- dump.202401021909:这个文件是系统内核崩溃时的内核内存转储文件,它包含了内核崩溃时的内存状态,可以用来分析内核崩溃的现场和数据。
- linux-image-3.13.0-24-generic-202401021909.crash:这个文件是系统内核崩溃时,使用apport命令来生成的崩溃报告文件,它包含了系统内核的版本和配置信息,以及内核崩溃的时间和环境信息,可以用来报告和追踪内核崩溃的问题。
补充知识一:sysrq的参数
- b - 即时重新启动系统
- o - 即时关机
- s - 即时同步所有挂载的文件系统
- u - 即时重新挂载所有的文件系统为只读
- p - 导出当前CPU寄存器信息和标志位的信息
- t - 导出线程状态信息
- m - 导出关于内存分配的信息
- c - 故意让系统统崩溃(在使用netdump或diskdump的时候有用)
- e - 杀死所有进程除了init使用SIGTERM
- i - 杀死所有进程除了init使用SIGKILL
当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages或/var/log/syslog。有时候,可能系统已无法响应,syslogd可能无法记录此信息。在这种情况下,建议你设置一个串口终端来收集这个信息。
4.获取Ubuntu22.04对应的vmlinx
查看是否存在vmlinux
bash
ls //usr/lib/debug/boot
下载namelist
- namelist是一个包含了内核调试符号的vmlinux内核镜像文件
- 内核调试符号是指包含了调试信息的内核镜像文件,它可以帮助开发者或者分析者定位内核的错误或者性能问题。
下载namelist的方法可以参考我写的另一篇博文
按照博文中的操作步骤获取到Ubuntu22.04对应的带有符号调试信息的 vmlinux文件,这个vmlinux文件就是我们使用 'crash' 工具分析内核cras 的 codedump 文件所需要的。
bash
ls /usr/lib/debug/boot