使用 Linux 内核转储测试模块 (LKDTM) 触发崩溃¶
lkdtm 模块提供了一个接口,用于在预定义的代码位置中断(通常会导致崩溃)内核,以评估内核异常处理的可靠性,并测试使用不同转储解决方案获得的崩溃转储。该模块使用 KPROBE 来检测触发位置,但也可能通过 debugfs 直接触发内核,而无需 KPROBE 支持。
您可以通过插入模块时的模块参数或通过 debugfs 接口来选择触发位置(“崩溃点名称”)和操作类型(“崩溃点类型”)。
用法
insmod lkdtm.ko [recur_count={>0}] cpoint_name=<> cpoint_type=<>
[cpoint_count={>0}]
- recur_count
堆栈溢出测试的递归级别。默认情况下,此值是基于内核配置动态计算的,目的是刚好足够耗尽内核堆栈。该值可以在/sys/module/lkdtm/parameters/recur_count中看到。
- cpoint_name
在内核中的哪个位置触发操作。它可以是 INT_HARDWARE_ENTRY、INT_HW_IRQ_EN、INT_TASKLET_ENTRY、FS_SUBMIT_BH、MEM_SWAPOUT、TIMERADD、SCSI_QUEUE_RQ 或 DIRECT 之一。
- cpoint_type
指示在命中崩溃点时要执行的操作。这些操作有很多,最好直接从 debugfs 查询。一些常见的操作是 PANIC、BUG、EXCEPTION、LOOP 和 OVERFLOW。有关完整列表,请参阅/sys/kernel/debug/provoke-crash/DIRECT的内容。
- cpoint_count
指示在触发操作之前崩溃点被命中的次数。默认值为 10(DIRECT 除外,它始终立即触发)。
您还可以通过挂载 debugfs 并将类型写入 <debugfs>/provoke-crash/<crashpoint> 来引发故障。例如:
mount -t debugfs debugfs /sys/kernel/debug
echo EXCEPTION > /sys/kernel/debug/provoke-crash/INT_HARDWARE_ENTRY
特殊文件 DIRECT 将直接诱发操作,而无需 KPROBE 检测。当模块为不支持 KPROBE 的内核构建时,此模式是唯一可用的模式。
# Instead of having a BUG kill your shell, have it kill "cat":
cat <(echo WRITE_RO) >/sys/kernel/debug/provoke-crash/DIRECT