Ubuntu22.04上kdump和crash的使用

0.前言

1.引用:

解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云

解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云

ubuntu内核转储分析------kdump和crash的下载和使用_ubuntu kdump-CSDN博客

Ubuntu的Kdump_ubuntu22 kdump-CSDN博客

Index of /pool/main/l/linux

Linux下用火焰图进行性能分析_perf火焰图分析-CSDN博客

2.Ubuntu22.04安装 kdump

本小节主要参考了如下博文里的内容,在Ubuntu22.04上安装内核转存分析工具kdump。

ubuntu内核转储分析------kdump和crash的下载和使用_ubuntu kdump-CSDN博客

安装命令

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的方法可以参考我写的另一篇博文

获取Ubuntu-22.04.1 对应的vmlinux文件-CSDN博客

按照博文中的操作步骤获取到Ubuntu22.04对应的带有符号调试信息的 vmlinux文件,这个vmlinux文件就是我们使用 'crash' 工具分析内核cras 的 codedump 文件所需要的。

bash 复制代码
ls /usr/lib/debug/boot

5.使用crash工具分析内核coredump文件

相关推荐
MC何失眠10 分钟前
vulnhub靶场【哈利波特】三部曲之Fawkes
网络·python·学习·网络安全
MarisolHu40 分钟前
前端学习笔记-Vue篇-02
前端·vue.js·笔记·学习
我的老子姓彭2 小时前
C++学习笔记
c++·笔记·学习
炸毛的飞鼠4 小时前
PWN的简单了解
笔记·学习
ydl11284 小时前
机器学习周志华学习笔记-第13章<半监督学习>
笔记·学习·机器学习
sealaugh326 小时前
aws(学习笔记第十五课) 如何从灾难中恢复(recover)
笔记·学习·aws
编程圈子7 小时前
STM32 HAL库开发学习3.STM32启动浅析
stm32·嵌入式硬件·学习
red_redemption7 小时前
PS的功能学习(修复、画笔)
学习·ps
suzh1qian7 小时前
Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)
学习·unity·c#·游戏引擎
蟹黄堡㋡8 小时前
redis学习1
数据库·redis·学习