如何在Ubuntu18.04下安装和配置kdump

本文主要介绍了Linux上Kdump的基本原理以及如何在Ubuntu18.04下进行安装和配置。

背景知识

经过几十年的千锤百炼,Linux内核已经非常稳定,但有时也会掉链子,发生异常导致系统崩溃。Linux是开源的,应用场景无处不在。从手机平板,个人电脑到服务器,从IOT设备到各种嵌入式系统。支持各种CPU架构,硬件设备五花八门,驱动程序也良莠不齐,自然会有bug。常在河边走,哪能不湿鞋。系统崩溃的原因很多,有内核自身的问题,有设备驱动程序的问题,当然也有硬件引起的问题。常见的有以下几种错误:

  1. 非法地址访问
  2. 死锁
  3. 系统Panic
  4. 中断程序执行过长
  5. 系统挂死
    …… ……

linux系统崩溃和Windows的蓝屏一样,下面的Blue Screen相信都遇到过。Windows会自动生成内核转存文件,Windows下用Windbg工具来分析内核转存文件。Linux下也有类似的内核转存工具和分析工具,即Kdump和Crash。Kdump负责内核转存,Crash可以用来分析转存文件。


Blue Screen

其实内核转存工具还有很多,比如LKCD,Negdump,Diskdump等等。由于kdump被linux采纳,自然也是用得最广泛的。下面详细介绍下kdump工作原理,其实都大同小异,需要的话可以在研究。

Kdump原理和配置

kdump是基于kexec实现的内存转存工具。有两个内核,一个负责正常工作,叫工作内核;另一个在系统崩溃时负责生成内核转存文件,我们叫它crashkernel。当系统崩溃发生时,kexec会自动加载crashkernel到预先保留的内存区域运行。在crashkernel里就可以保存异常系统的现场并生成内核转存文件。Kexec加载crashkernel时跳过了BIOS阶段,不会对硬件重新初始化,从而可保留错误现场。当然由于没有经过BIOS阶段,整个过程也非常快。由于内核支持重定位,所以两个内核可以用同一个,编译时需要打开CONFIG_RELOCATABLE选项。现在主流的linux发行版本,如Ubuntu和Redhat,其实就采用同一个内核,当然也可以根据需要单独编一个crashkernel。

内核配置

如果要支持kdump转存和crash分析,编译内核时需要打开以下编译选项:
CONFIG_KEXEC=y
CONFIG_SYSFS=y
CONFIG_DEBUG_INFO=Y
CONFIG_CRASH_DUMP=y
CONFIG_PROC_VMCORE=y
不同的CPU架构会有些不同的需求。我用的是x86,还需要打开以下选项:
CONFIG_HIGHMEM64G=y
CONFIG_HIGHMEM4G=y
CONFIG_RELOCATABLE=y
CONFIG_PHYSICAL_START=0x1000000
其他平台需要的选项可以参考源码树下kdump.txt文档。现在kernel已经默认支持kdump,这些选项默认会打开,所以直接编译内核就可以了。

Kdump配置

Kdump需要进行添加以下配置:
KDUMP_KERNELVER
KDUMP_COMMANDLINE
KDUMP_COMMANDLINE_APPEND
KEXEC_OPTIONS
KDUMP_RUNLEVEL
KDUMP_IMMEDIATE_REPORT
KDUMP_TRANSFER
KDUMP_SAVEDIR
KDUMP_KEEP_OLD_DUMPS
KDUMP_FREE_DISK_SIZE
KDUMP_DUMPDEV
KDUMP_VERBOSE
KDUMP_DUMPLEVEL
KDUMP_DUMPFORMAT

grub配置

需要修改grub的配置文件为crashkernel预留内存空间,有下面两种格式:

crashkernel=64M@16M -> 16M位置预留64M
crashkernel=512M-:192M -> 如果系统内存大于512M就预留192M

整个过程需要kdump,kexec和debuginfo工具,每个linux发行版本都进行了不同程度的封装,几条命令就搞定。当然出了问题也比较麻烦,需要研究具体的封装细节去解决,不过透过百度基本可以解决问题。有位大神的书crash-book.pdf值得细细品读,遇到问题时可以参考。文章篇幅很大,包含kdump的原理,配置以及如何在redhat下使用。大神的博客里有很多有用的信息,值得深挖。

crash-book
LKCD和kdump原理
LKCD和kdump的配置
常见的一些错误和解决方法
crash实例分析

Ubuntu18.04上安装和配置

ubuntu把相关工具链打成了一个包linux-crashdump,一条命令就可以完成安装和配置,详见Ubuntu官方帮助文档

sudo apt-get install linux-crashdump

安装log上可以看到安装了kdump,kexec和makedumpfile,最后更新了grub配置文件。

root@glbian-OptiPlex-990:/home/glbian# apt-get install linux-crashdump
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
linux-headers-4.18.0-15 linux-headers-4.18.0-15-generic linux-image-4.18.0-15-generic linux-modules-4.18.0-15-generic linux-modules-extra-4.18.0-15-generic
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
crash kdump-tools kexec-tools makedumpfile
The following NEW packages will be installed:
crash kdump-tools kexec-tools linux-crashdump makedumpfile
0 upgraded, 5 newly installed, 0 to remove and 223 not upgraded.
... ...
Preparing to unpack .../crash_7.2.1-1ubuntu2_amd64.deb ...
Unpacking crash (7.2.1-1ubuntu2) ...
Selecting previously unselected package kexec-tools.
Preparing to unpack .../kexec-tools_1%3a2.0.16-1ubuntu1_amd64.deb ...
Unpacking kexec-tools (1:2.0.16-1ubuntu1) ...
Selecting previously unselected package makedumpfile.
Preparing to unpack .../makedumpfile_1%3a1.6.5-1ubuntu1~18.04.1_amd64.deb ...
Unpacking makedumpfile (1:1.6.5-1ubuntu1~18.04.1) ...
Selecting previously unselected package kdump-tools.
Preparing to unpack .../kdump-tools_1%3a1.6.5-1ubuntu1~18.04.1_amd64.deb ...
Unpacking kdump-tools (1:1.6.5-1ubuntu1~18.04.1) ...
Selecting previously unselected package linux-crashdump.
Preparing to unpack .../linux-crashdump_4.15.0.52.54_amd64.deb ...
Unpacking linux-crashdump (4.15.0.52.54) ...
Processing triggers for ureadahead (0.100.0-20) ...
ureadahead will be reprofiled on next reboot
Setting up crash (7.2.1-1ubuntu2) ...
Setting up kexec-tools (1:2.0.16-1ubuntu1) ...
Generating /etc/default/kexec...
Setting up makedumpfile (1:1.6.5-1ubuntu1~18.04.1) ...
Processing triggers for systemd (237-3ubuntu10.19) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Setting up kdump-tools (1:1.6.5-1ubuntu1~18.04.1) ...
Creating config file /etc/default/kdump-tools with new version
Sourcing file /etc/default/grub
Sourcing file `/etc/default/grub.d/kdump-tools.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.19.53
Found initrd image: /boot/initrd.img-4.19.53
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
Created symlink /etc/systemd/system/multi-user.target.wants/kdump-tools.service → /lib/systemd/system/kdump-tools.service.
kdump-tools-dump.service is a disabled or a static unit, not starting it.
Setting up linux-crashdump (4.15.0.52.54) ...
Processing triggers for ureadahead (0.100.0-20) ...
Processing triggers for systemd (237-3ubuntu10.19) ...

安装完毕,需要重启电脑才能生效,系统会为crashkernel预留内存空间,详见系统启动日志。

root@glbian-OptiPlex-990:/home/glbian# dmesg | grep crashkernel
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.19.53 root=UUID=8134ffdd-0368-4398-80c6-eaa792b405ce ro quiet splash crashkernel=512M-:192M vt.handoff=1
[ 0.006997] Reserving 192MB of memory at 576MB for crashkernel (System RAM: 8073MB)
[ 0.049871] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.19.53 root=UUID=8134ffdd-0368-4398-80c6-eaa792b405ce ro quiet splash crashkernel=512M-:192M vt.handoff=1

kdump-config show查看kdump的状态,已经准备就绪。

root@glbian-OptiPlex-990:/home/glbian# kdump-config show
DUMP_MODE: kdump
USE_KDUMP: 1
KDUMP_SYSCTL: kernel.panic_on_oops=1
KDUMP_COREDIR: /var/crash
crashkernel addr: 0x24000000
/var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinuz-4.19.53
kdump initrd:
/var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.19.53
current state: ready to kdump
kexec command:
/sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinuz-4.19.53 root=UUID=8134ffdd-0368-4398-80c6-eaa792b405ce ro quiet splash vt.handoff=1 nr_cpus=1 systemd.unit=kdump-tools-dump.service irqpoll nousb ata_piix.prefer_ms_hyperv=0" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz

同时系统启动了下面的服务进程:

service --status-all
[ + ] kdump-tools
[ + ] kerneloops
[ + ] kexec
[ + ] kexec-load

kexec加载crashkernel参数保存在/var/crash/kexec_cmd里。

root@glbian-OptiPlex-990:/home/glbian# cat /var/crash/kexec_cmd
/sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinuz-4.19.53 root=UUID=8134ffdd-0368-4398-80c6-eaa792b405ce ro quiet splash vt.handoff=1 nr_cpus=1 systemd.unit=kdump-tools-dump.service irqpoll nousb ata_piix.prefer_ms_hyperv=0" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz

下面可以通过sysrq人工注入一个系统异常来检验是否工作,首先需要执行sysctl -w kernel.sysrq=1打开sysrq功能,具体参考/etc/sysctl.d/10-magic-sysrq.conf

root@glbian-OptiPlex-990:/home/glbian# sysctl -w kernel.sysrq=1
kernel.sysrq = 1
root@glbian-OptiPlex-990:/home/glbian# cat /proc/sys/kernel/sysrq
1
root@glbian-OptiPlex-990:/home/glbian# cat /etc/sysctl.d/10-magic-sysrq.conf
# Here is the list of possible values:
# 0 - disable sysrq completely
# 1 - enable all functions of sysrq
# >1 - enable certain functions by adding up the following values:
# 2 - enable control of console logging level
# 4 - enable control of keyboard (SAK, unraw)
# 8 - enable debugging dumps of processes etc.
# 16 - enable sync command
# 32 - enable remount read-only
# 64 - enable signalling of processes (term, kill, oom-kill)
# 128 - allow reboot/poweroff
# 256 - allow nicing of all RT tasks
# For example, to enable both control of console logging level and
# debugging dumps of processes: kernel.sysrq = 10
kernel.sysrq = 176

再执行echo c > /proc/sysrq-trigger, 可以看到系统首先会挂住,然后重启,进入系统后发现转存文件已经生成并保存在/var/crash目录下了。

root@glbian-OptiPlex-990:/home/glbian# ll /var/crash/
drwxr-sr-x 2 root whoopsie 4096 6月 26 20:09 201906262009/
-rw-r--r-- 1 root whoopsie 289 6月 29 06:47 kexec_cmd
-rw-r----- 1 root whoopsie 22533 6月 26 20:10 linux-image-4.19.53-201906262009.crash

crash加载内核转存文件

Crash-7.2.1-SegmentFault.png

18.04仓库安装的crash会报Segmentation Fault,切到原生内核还是报错,可能是打包或下载过程中出了问题。crash工具是向前兼容的,参考crash-whitepaper。果断去Crash Github安装最新的crash版本7.2.6,下载压缩安装包,解压直接make安装就可以了。

tar -xzvf crash-7.2.6.tar.gz
cd data/src/crash-7.2.6
make

编译时遇到解压gdb压缩包失败的情况,查看makefile发现编译时会自动从网上下载的,可能是网络的原因导致没有下载成功。于是手动下载gdb 7.6拷贝到crash代码目录重新编译安装即可。

wget http://ftp.gnu.org/gnu/gdb/${GDB}.tar.gz
make
make install

crash版本已经是7.2.6,gdb版本是7.6,安装成功。

root@glbian-OptiPlex-990:/home/glbian/data/src/crash-7.2.6# crash -v
crash 7.2.6
……
GNU gdb (GDB) 7.6
……
This GDB was configured as "x86_64-unknown-linux-gnu".

重新加载crash,顺利启动。


Crash-7.2.6-Success.png

结语

整个过程顺利的话10分钟可以搞定,遇到问题的话就不好说了。我在另一台ubuntu16.04的机器上安装了4.19的内核,安装linux-crashdump成功,但就是没法生成内核转存文件。尝试了自带kernel和4.4kernel,都可以正常工作。应该是ubuntu16.04工具链太老,和4.19kernel不匹配引起的。kdump和kenrel是需要高度契合的,建议安装和发行版本相近的kernel,避免不必要的麻烦。另外系统崩溃是一个非常复杂和棘手的问题,有些场景,比如文件系统或硬件错误,可能就是没法正常生成转存文件。可以尝试挂外接设备采用raw模式看行不行,参考KDUMP_DUMPDEV选项。总之不能保证100%成功,好运!

附上宝宝最新力作!


小小照相机
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249