Kdump 工作流程

什么是Kdump?

Kdump是一个基于kexec的内核崩溃转储机制,当系统崩溃时,kdump使用kexec启动到第二个内核。地热个内核叫做捕获内核或者又叫“2nd kernel”,它以很少的内存启动捕获内核,并捕获转储镜像。Kdump的概念是目前最可靠的内核转储技术,已被主要的linux厂商使用。(例如Red Hat系列)

什么是Kexec?

Kexec是一种能够根据已经运行内核的上下文快速启动新内核的一种机制,而不经过BIOS。BIOS的启动在一些大型机器或者有大量外设的机器上时特别耗时。这种机制能够节省需要在不同内核之间切换的开发人员的时间。
Kexec在内核空间和用户空间都有对应的组件,内核提供了几个kexec重启功能的系统调用。用户空间的软件包"kexec-tools"使用这些系统调用,并执行加载和引导第二个内核(捕获内核)。
Kexec由两部分组成,一是内核空间的系统调用kexec_load,负责在生产内核(或者叫第一个内核)启动时将捕获内核(或者叫第二个内核)加载到指定的位置。而是用户空间的kexec-tools,它将捕获内核(second kernel)的地址传递给生产内核(first kernel),让系统在崩溃的时候能够找到捕获内核(second kernel)的地址并运行。

Kdump怎么工作?

在当前系统发生崩溃时,新的捕获内核被加载,然后根据已设置的命令去将当前之前发生崩溃的系统的内存保存到一个特殊的文件(vmcore)中。

下面以Fedora26做为测试演示。(Fedora和CentOS系列的系统已经在kenrel中打开了CONFIG_KEXEC*选项。)

首先需要在系统启动时预留出给第二个内核运行的内存。内核参数"crashkernel=160M"会在系统启动时预留出160M内存的空间给捕获内核运行使用。"crashkerel=xM"还支持其他的参数,详细的可以参考内核参数文档 内核参数

# dmesg | grep -i reserving
[    0.000000] Reserving 160MB of memory at 656MB for crashkernel (System RAM: 2047MB)

系统启动后我们可以从上面的命令中看到已经预留出了160M的内存从内存的656M处。

安装用户态的包"kexec-tools",软件包中会提供kdump所需的服务和"kexec"快速内核启动命令,和压缩过滤内存的"makedumpfile"命令。

[root@localhost ~]# dnf install -y kexec-tools

配置,修改kdump相关的配置文件。

[root@localhost ~]# grep -v ^# /etc/kdump.conf 

path /var/crash
core_collector makedumpfile -l --message-level 1 -d 31


[root@localhost ~]# grep -v ^# /etc/sysconfig/kdump
KDUMP_KERNELVER=""

KDUMP_COMMANDLINE=""

KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"

KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr"

KEXEC_ARGS=""

KDUMP_IMG="vmlinuz"

KDUMP_IMG_EXT=""

配置文件/etc/kdump.conf设置了kdump发生时vmcore文件的存储方式,此文件修改后需要重启kdump的服务。

配置文件/etc/sysconfig/kdump,如果只是修改了COMMANDLINE相关的参数,则不需要去重新build生成新的initramfs文件。

启动kdump服务:

[root@localhost ~]# systemctl restart kdump
[root@localhost ~]# systemctl status kdump
● kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2017-07-15 10:46:22 UTC; 36s ago
  Process: 2172 ExecStop=/usr/bin/kdumpctl stop (code=exited, status=0/SUCCESS)
  Process: 2180 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
 Main PID: 2180 (code=exited, status=0/SUCCESS)

Jul 15 10:46:21 localhost dracut[4264]: -rw-r--r--   1 root     root          127 Mar 28 02:15 usr/share/zoneinfo/Etc/UTC
Jul 15 10:46:21 localhost dracut[4264]: drwxr-xr-x   3 root     root            0 Jun 22 13:38 var
Jul 15 10:46:21 localhost dracut[4264]: lrwxrwxrwx   1 root     root           11 Jun 22 13:38 var/lock -> ../run/lock
Jul 15 10:46:21 localhost dracut[4264]: lrwxrwxrwx   1 root     root            6 Jun 22 13:38 var/run -> ../run
Jul 15 10:46:21 localhost dracut[4264]: drwxr-xr-x   2 root     root            0 Jun 22 13:38 var/tmp
Jul 15 10:46:21 localhost dracut[4264]: ========================================================================
Jul 15 10:46:21 localhost dracut[4264]: *** Creating initramfs image file '/boot/initramfs-4.11.9-300.fc26.x86_64kdump.img' done ***
Jul 15 10:46:22 localhost kdumpctl[2180]: kexec: loaded kdump kernel
Jul 15 10:46:22 localhost kdumpctl[2180]: Starting kdump: [OK]
Jul 15 10:46:22 localhost systemd[1]: Started Crash recovery kernel arming.

所有的服务都配置完成,如果此时系统发生了panic或者其他的一些导致系统崩溃的现象,这是kdump服务会将当时的内存镜像按照用户的配置保存起来。一个简单的方式是通过命令来触发:

[root@localhost ~]# echo c > /proc/sysrq-trigger

[some console log]
... ...
         Starting Kdump Vmcore Save Service...
kdump: dump target is /dev/vda1
kdump: saving to /sysroot//var/crash/127.0.0.1-2017-07-16-04:21:36/
[    2.718001] EXT4-fs (vda1): re-mounted. Opts: data=ordered
kdump: saving vmcore-dmesg.txt
kdump: saving vmcore-dmesg.txt complete
kdump: saving vmcore
Copying data                       : [100.0 %] -
kdump: saving vmcore complete
... ...
[/some console log]

当系统重启后就能在指定的目录下看到生成的vmcore文件。可以参考配置文件"/etc/kdump.conf"里的"path"字段。

[root@localhost ~]# ls -lt /var/crash/*/
total 33492
-rw-------. 1 root root 34253115 Jul 16 04:21 vmcore
-rw-r--r--. 1 root root    40360 Jul 16 04:21 vmcore-dmesg.txt

转储文件被保存后可以用"crash"这个软件包来分析这个"vmcore"文件。

开始提到了Kexec内核部分提供了一些系统调用,"kexec_load()" 和 "kexec_file_load()",其中一个用来加载捕获内核 - "kexec -l",另外一个来提供系统重启 - "kexec -e"。

系统调用"kexec_load()"可以加载一个新的内核并之后能够被"reboot()"调用。它是被这样定义的:

long kexec_load(unsigned long entry, unsigned long nr_segments,
                       struct kexec_segment *segments, unsigned long flags);

其中一个比较重要的是"kexec_segment"结构体:

struct kexec_segment {
    void   *buf;        /* Buffer in user space */
    size_t  bufsz;      /* Buffer length in user space */
    void   *mem;        /* Physical address of kernel */
    size_t  memsz;      /* Physical address length */
};

当reboot()的参数为"LINUX_REBOOT_CMD_KEXEC"并被调用时,则启动新的内核时就调用"kexec_load()"系统调用。另外“CONFIG_KEXEC”必须在编译kernel时被打开。

系统调用"kexec_load_file()"会设置2个参数"kernel"和"initramfs"给"kexec"命令。"kexec"会读取这些数据来创建对应的数据段。

long kexec_file_load(int kernel_fd, int initrd_fd,
                           unsigned long cmdline_len, const char *cmdline,
                           unsigned long flags);

同样的"CONFIG_KEXEC_FILE"参数也要在内核编译时被打开。

目前的大多数发行版都已经打开了"KEXEC"相关的配置参数。

以上就是一个kdump的简单流程。有关"kdump"能够捕获到的内核崩溃时间可以参考文档"/usr/share/doc/kexec-tools/kexec-kdump-howto.txt"。或者请参考我们写的测试用例 kdump-test

参考资料:
kdump-paper
kdump-introduction
fedora-kexec-tools

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

推荐阅读更多精彩内容