KDUMP 原理解析(非常详细)零基础入门到精通,收藏这一篇就够了

758 篇文章 36 订阅
262 篇文章 11 订阅

1. kexec

Kexec 是一个系统调用,可用于从当前正在运行的内核加载并引导到另一个内核。这对于内核开发人员或其他需要快速重新启动而无需等待整个 BIOS 启动过程完成的人非常有用。


1.1. kexec 使用

1.1.1. 内核热更新

kexec -l将内核加载到某个生产内核的地址空间,后续可以使用kexec -e去引导此内核

# kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline  
# kexec -e

1.1.2. Kdump

kexec -p 将内核加载到预留的内存区域。当系统崩溃时,会自动引导此内核。开机时,kdump 服务会自动生成kexec -p ...命令,来加载 dump-capture kernel(用来捕获内核)。

/sbin/kexec -p --command-line="BOOT_IMAGE=/vmlinuz-4.19.90-52.16.v2207-57s-tz.01  \  
    root=UUID=897cf059-6948-47ed-9f0f-d50a64b12066 ro nr_cpus=1 maxcpus=1 pci=nomsi \  
    irqpoll nousb ata_piix.prefer_ms_hyperv=0 security= audit=0 \  
    systemd.unit=kdump-tools.service" \  
    --initrd=/var/lib/kdump/initrd.img /boot/vmliuz-4.19.90

可以看到,与kexec -l 相比,kexec -p主要是内核切换的触发条件不太相同。


1.2. 内核相关配置

kexec 的配置

CONFIG_KEXEC``CONFIG_KEXEC_CORE

kdump 的配置

CONFIG_CRASH_DUMP``CONFIG_CRASH_CORE``CONFIG_PROC_VMCORE #产生 /proc/vmcore``CONFIG_DEBUG_INFO  #调试信息

1.3. 编译 kexec-tools

1.3.1. 源码下载

http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz

1.3.2. 编译

安装后会有usr/local/sbin/kexec命令。

tar xvf kexec-tools.tar.gz``cd kexec-tools-VERSION``./configure``make``make install

1.3.3. 编译中的错误

make 时报错 kexec/arch/i386/x86-linux-setup.c:27:24: fatal error: sys/random.h: 没有那个文件或目录。这是由于 libc-2.25 之前缺少这个函数。需要修改kexec/arch/i386/x86-linux-setup.c源码。

1. 替换头文件``#include <sys/random.h>``换成``#include </usr/include/linux/random.h>``   ``2. 函数替换``getrandom(sd->rng_seed, sizeof(sd->rng_seed), GRND_NONBLOCK)``换成``syscall(SYS_getrandom, sd->rng_seed, sizeof(sd->rng_seed), GRND_NONBLOCK)

结果问题参考

#ifdef HAVE_GETRANDOM``read = getrandom(p, buflen, 0);``#else` `read = syscall(SYS_getrandom, p, buflen, 0);``#endif // HAVE_GETRANDOM

===

2. kdump 配置

2.1. kdump 流程


2.2. 捕获内核禁用模块

由于捕获内核需要启动后才能进行抓取 kdump,而捕获内核热启动时可能出现设备驱动工作不正常或者耗费内存过大的问题,导致其启动失败,则将内核驱动程序列入黑名单是一种防止加载和使用它们的机制。将内核驱动程序列入黑名单可防止 oom kiler 或其他崩溃内核故障。要将内核驱动程序列入黑名单,可以通过更新/etc/sysconfig/kdump文件中的KDUMP_COMMANDLINE_APPEND变量,指定黑名单modprobe.blacklist=<modules>

具体操作指引如下:

  • 使用lsmod命令查看加载到当前运行的内核中的模块列表

  • 添加/etc/sysconfig/kdump中的黑名单:

KDUMP_COMMANDLINE_APPEND="modprobe.blacklist=emcp \`                          `modprobe.blacklist=bnx2fc \`                          `modprobe.blacklist=lpfc"
  • 重启kdump服务systemctl restart kdump.service

2.3. kdump 存到 ssh 远程机器

2.3.1. 配置免密

配置kdump 机和SSH服务器之间的免密钥登录。

  • kdump测试机生成密钥ssh-keygen -t rsa

  • /root/.ssh/id_rsa.pub中的文件拷贝到SSH服务器的/root/.ssh/authorized_keys文件中,并修改文件权限为600。

2.3.2. 修改 kdump 配置

编辑测试机的/etc/kdump.conf,注释其他内容,并在文件末尾添加

ssh root@172.20.35.63``sshkey /root/.ssh/id rsa``path /sshkdump``core_collector makedumpfile -l -F --message-level 1 -d 31

2.3.3. 重启服务

使用命令systemctl restart kdump重启服务。

2.4. kdump 压缩

为了减小 vmcore 转储文件的大小,kdump允许您指定一个外部应用程序(核心收集器)来压缩数据,并且可以选择忽略所有不相关的信息。目前,唯一完全受支持的核心收集器是 makedumpfile。麒麟服务器系统默认配置如下:core_collector makedumpfile -l--message-level 1 -d 31要从转储中删除某些页,请添加-d value参数,其中value是要忽略的页的值的总和对应value值的转储压缩过滤值如下:

参数值

参数说明

1

Zero pages

2

Cache pages

4

Cache private

8

User pages

16

Free pages

注意:压缩过滤参数说明,为避免转译带来的理解误差,则此处适用原文英文做对应的Linux Page技术描述。麒麟服务器系统则删除掉所有上述所列的参数项,因为大多都是针对内核数据分析,故对分析基本没有影响。则默认已经选择最优的压缩方式,除特殊情况<需要探索到cache或应用层gcore分析数据>外,不进行对用的配置更改。

2.5. 手动触发 kdump

kdump 的触发场景有很多,除了内核崩溃时触发,下面这些内核参数被设置,产生相关事件时会导致 panic,就会触发kdump。

  • kernel.softlockup_panic、kernel.hardlockup_panic、kernel.hung_task_panic、

  • kernel.panic_on_io_nmi、kernel.panic_on_oops、kernel.panic_on_rcu_stall、

  • kernel.panic_on _warn、kernel.unknown nmi_panic、vm.panic_on_oom、

  • kernel.max_rcu_stall_to_panic、kernel.panic_on_unrecovered_nmi、fs.xfs.panic_mask

主动触发内核崩溃,测试kdump运行功能是否正常。SysRq 的使用有两种方式:

  • 键盘组合键:Alt + SysRq + command key 。(SysRq 一般和 PrtSc 是同一个键)

  • 修改/proc/sysrq-trigger 文件的值。

echo 1 >/proc/sys/kernel/sysrq``echo c >/proc/sysrg-trigger

观察到下面的打印信息后,则开始启动捕获内核

[2183.842451] Starting crashdump kernel...``[2183.876226] Bye!

验证结果运行到捕获内核,其启动 kdump 进行转储生成vmcore。

2.5.1. SysRq 魔术键列表

使用 Alt + SysRq + command key 组合键触发。下面是 SysRq 键的列表。

命令键

功能

b

将立即重启系统,不会同步或者卸载磁盘。

c

将执行系统 crash,如果配置了系统 crashdump,将执行 crashdump。

d

显示所有持有的锁。

e

发送 SIGTERM 信号给所有进程,除了 init 进程。

f

将调用 oom killer 杀掉一个过度占用内存的进程,如果什么任务都没杀, 也不会 panic。

g

kgdb 使用(内核调试器)。

h

将会显示帮助。(实际上除了这里列举的键,其他的都将显示帮助, 但是 h 容易记住):-)

i

发送 SIGKILL 给所有进程,除了 init 进程。

j

强制性的 “解冻它” - 用于被 FIFREEZE ioctl 操作冻住的文件系统。

k

安全访问秘钥(SAK)杀掉在当前虚拟控制台的所有程序,注意:参考 下面 SAK 节重要论述。

l

显示所有活动 cpu 的栈回溯。

m

将导出当前内存信息到你的控制台。

n

用于使所有实时任务变成普通任务。

o

将关闭系统(如果配置和支持的话)。

p

将导出当前寄存器和标志位到控制台。

q

将导出每个 cpu 上所有已装备的高精度定时器(不是完整的 time_list 文件显示的 timers)和所有时钟事件设备的详细信息。

r

关闭键盘的原始模式,设置为转换模式。

s

将尝试同步所有的已挂载文件系统。

t

将导出当前所有任务列表和它们的信息到控制台。

u

将尝试重新挂载已挂载文件系统为只读。

v

强制恢复帧缓存控制台。

v

触发 ETM 缓存导出 [ARM 架构特有]

w

导出处于不可中断状态(阻塞)的任务。

x

在 ppc/powerpc 架构上用于 xmon 接口。在 sparc64 架构上用于显示全局的 PMU(性能监控单元)寄存器。在 MIPS 架构上导出所有的 tlb 条目。

y

显示全局 cpu 寄存器 [SPARC-64 架构特有]

z

导出 ftrace 缓存信息

0-9

设置控制台日志级别,该级别控制什么样的内核信息将被打印到你的 控制台。(比如 0 ,将使得只有紧急信息,像 PANICs or OOPSes 才能到你的控制台。)

===

===

3. 手动实现kdump服务

  • 1st kernel cmdline 配置 ‘crashkernel=xxx’

  • kdump服务调用 kexec -p 加载内核

  • 当panic发生时 启动2nd 内核 调用makedumpfile 将/proc/vmcore 保存到指定位置

  • 研发人员分析vmcore 找出问题

3.1. 加载转储内核

/sbin/kexec -p --command-line="BOOT_IMAGE=/vmlinuz-4.19.90-52.16.v2207-57s-tz.01  \`    `root=UUID=897cf059-6948-47ed-9f0f-d50a64b12066 ro nr_cpus=1 maxcpus=1 pci=nomsi \`    `irqpoll nousb ata_piix.prefer_ms_hyperv=0 security= audit=0 \`    `systemd.unit=kdump-tools.service" \`    `--initrd=/var/lib/kdump/initrd.img /boot/vmliuz-4.19.90

其中root=/dev/mapper/ubuntu--vg-ubuntu--lv 可以参考cat /proc/cmdline里面的参数

ro 1 irqpoll nr_cpus=1 reset_devices可以参考文档中的说明。应该也可以与上一步的kernel是同一个。运行命令后,可以使用 cat /sys/kernel/kexec_crash_loaded 查看,结果应该为1。


3.2. 手动触发 kdump

动触发panic后,电脑开始关机,屏幕花屏,然后隔几秒就开始启动内核,然后进入保护模式,中间有个提示,按ctrl+d可以继续启动内核。最后进入用来dump-capture的内核。

echo 1 >/proc/sys/kernel/sysrq``echo c >/proc/sysrg-trigger

存在/proc/vmcore文件,且大小为整个内存的大小。


3.3. 使用makedumpfile压缩vmcore

看到compressed_core的大小只有1G左右

sudo makedumpfile -l --message-level 1 -d 31 /proc/vmcore ./compressed_core

4. kdump-tools 服务

4.1. 主要文件

/etc/default/kdump-tools

配置文件,安装deb时生成

/etc/init/kdump-tools.conf

配置文件,里面引入上面的文件。感觉没有用

/etc/init.d/kdump-tools

服务脚本,包含触发后要执行的命令。可以配置不让重启。

/usr/sbin/kdump-config

kdump服务的主要脚本,有 load,unload,show,savecore 等操作。


4.2. kdump 服务

4.2.1. /etc/init.d/kdump-tool 服务脚本

这里以 V4 版本为例,分析/etc/init.d/kdump-tools服务脚本,可以发现 kdump-tools服务会根据运行在正常内核还是 crashkernel 执行不同的操作。

  • 正常内核:会执行kdump-config load,加载 crashkernel 。

  • crashkernel:会执行kdump-config savecore,加载 crashkernel 。

4.2.2. /usr/sbin/kdump-config 服务配置

kdump-tools 的所有操作都在这个脚本中,下面是主要的配置

KDUMP_DEFAULTS=/etc/default/kdump-tools``[ -r $KDUMP_DEFAULTS ] && . $KDUMP_DEFAULTS``   ``KEXEC=/sbin/kexec``[ -e $KEXEC ] || exit 1;``   ```KVER=`uname -r` ````ARCH=`uname -m` `````KDUMP_DIR="/var/lib/kdump"``KDUMP_SYSCTL=${KDUMP_SYSCTL:="kernel.panic_on_oops=1"}``MAKEDUMP_ARGS=${MAKEDUMP_ARGS:="-c -d 31"}``KDUMP_CMDLINE_APPEND=${KDUMP_CMDLINE_APPEND:="nr_cpus=1 pci=nomsi maxcpus=1 systemd.unit=kdump-tools.service irqpoll nousb ata_piix.prefer_ms_hyperv=0"}``KDUMP_KERNEL_HOOK="/etc/kernel/postinst.d/kdump-tools"``KDUMP_COREDIR=${KDUMP_COREDIR:=/var/crash}``[ -d $KDUMP_COREDIR ] || mkdir -p $KDUMP_COREDIR ;``   ``vmcore_file=/proc/vmcore``sys_kexec_crash=/sys/kernel/kexec_crash_loaded``sys_fadump_enabled=/sys/kernel/fadump_enabled``sys_fadump_registered=/sys/kernel/fadump_registered``kexec_cmd_file=$KDUMP_COREDIR/kexec_cmd``   ``#load``$KEXEC -p --command-line=\"$KDUMP_CMDLINE_APPEND\"  --initrd=$KDUMP_INITRD $KDUMP_KERNEL``#savecore``makedumpfile $MAKEDUMP_ARGS $vmcore_file $KDUMP_CORETEMP``#unload``$KEXEC -p -u

4.2.3. 加载捕获内核

下面是 kdump-config load加载捕获内核的参数,可以看出该内核启动后就会执行kdump-tools服务。

/sbin/kexec -p --command-line="BOOT_IMAGE=/vmlinuz-4.19.90-52.16.v2207-57s-tz.01  \`    `root=UUID=897cf059-6948-47ed-9f0f-d50a64b12066 ro nr_cpus=1 maxcpus=1 pci=nomsi \`    `irqpoll nousb ata_piix.prefer_ms_hyperv=0 security= audit=0 \`    `systemd.unit=kdump-tools.service" \`    `--initrd=/var/lib/kdump/initrd.img /boot/vmliuz-4.19.90

4.2.4. 捕获后不重启

把 /etc/init.d/kdump-tool 服务脚本中的reboot -f,替换成如下内容。

sbin/agetty --autologin root --noclear  tty2 linux ;
  

5. kdump 失败案例

5.1. 预留内存案例

kdump预留内存配置建议,在 grub 的linux行最后添加crashkernel=128M

内存大小

参数配置大小

>2GB

256MB

>12GB

512MB

>48GB

768MB

>128GB

1024MB

下面是由于内存配置的原因导致 kdump 启动失败。

现象

原因

No memory reserved for crash kernel

没有配置预留内存

Memory Limit: none

预留内存过小

Kernel panic - not syncing: Out of memory and no killable processes...

预留内存不足触发OOM

cannot allocate crashkernel(size:0x40000000)……Zeroed struct page in unavailable ranges: 1520 pages

发现在0~4G范围内没有连续的1G(0x40000000)空间,则导致分配失败。"high"标记完成预留内存的保留

  • 注意1: arm64构架下,若设定crashkernel参数没有标注",high",则遍历范围为0~4G,加上",high’标注后,则从最高地址往低端遍历。

  • 注意2: 若对应的内存连续地址确实都不够的情况下,则需要根据实际的内存连续空间大小进行crashkernel的适应性调整

  • 使用 cat /sys/kernel/kexec_crash_size命令查看预留内存大小。

5.2. 硬件相关案例

由于S2500的 GICD 中断全链路支持不完善,BIOS 默认开启此设置导致 vmocre 无法产生。则我们需要进行特定的 BIOS 适配。对应不同的BISO机型,配置情况不同,列举如下:

  • 机型1

擎天 EF862,FT-S2500,长城固件 v3.0630FBE07GW 服务器,此机型固件中没有 gicd 选项,需进入BIOS,将 CPU配置中的“IOMMU 选项”设置为启用,并保存退出。

  • 机型2

长城超云,FT-S2500,中电科技KL4.26.CC.S.019.120322.D.Test服务器,此机型 bios 没有 gicd 和 IOMMU选项需进入 BIOS,将启动选项中的“兼容模式”设置为启用,并保存退出。

  • 机型3

在擎天 EF862 FT-S2500 昆仑固件 V40服务器进行如下操作。重启服务进入固件配置界面,如下图进行修改配置,完成之后保存配置进入系统。设备管理器 -> CPU 配置 -> GICD 【停用】

修改/etc/sysconfig/kdump 内容如下,然后在执行kdumpctl rebuild重启系统。

KDUMP_COMMANDLINE_APPEND="1 cma=0 numa=off irgpoll reset_devicescgroup \`                          `disable=memory udev.children-max=2 panic=10 \`                          `swiotlb=noforce novmcoredd"
  

5.3. kexec 相关案例

内核对kdump预留内存分配成功后,kexec-tools 服务会加载 crashkernel 使 kdump 就绪状态,在发生内核奔溃时,进行捕获。S2500的 kexec-tool升级到 kexec-tools-2.0.20-14.p02.ky10.aarch64 版本以上。

Failed to start Crash recovery kernel arming

6. 参考

参考1

https://www.kernel.org/doc/html/next/admin-guide/kdump/kdump.html

参考2

https://www.kernel.org/doc/html/latest/translations/zh_CN/admin-guide/sysrq.html

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值