HACK#55 崩溃测试

本节使用lkdtm进行内核的崩溃测试。

介绍为了测试HACK#54中介绍的内核崩溃转储功能是否正常运行,使用lkdtm功能在内核的各种位置使用崩溃测试的方法。

崩溃转储功能虽然在开发过程中非常完善,但也有可能因为PC的各种设备或设备驱动程序的操作导致运行失败。事先找出这些问题并进行修正,才能保证系统的品质。

lkdtm是Linux Kernel Dump Test Module的缩写,能通过各种处理使内核崩溃。这个模块可以测试Kdump等崩溃转储功能是否能够正常运行。lkdtm是用来进行崩溃测试这种特殊测试的,因此一般发布版内核中并未安装它。使用lkdtm时,需要启用CONFIG_LKDTM编译内核。CONFIG_LKDTM可以通过选择下列内核选项来启用。


Kernel hacking—->

<M>Linux Kernel Dump Test Tool Module


lkdtm的崩溃测试运行通过内核模块的变量或debugfs文件系统的接口来指定。需要指定发生崩溃的位置和崩溃原因这两个值作为崩溃测试运行的参数。将这些值作为内核模块参数时,分别作为cpoint_name和cpoint_type变量。cpoint_name的种类、cpoint_type的种类分别如表7-7、表7-8所示。

HACK#55 崩溃测试 - 图1

HACK#55 崩溃测试 - 图2

HACK#55 崩溃测试 - 图3

除这些选项以外,还有下列追加选项(见表7-9)。

HACK#55 崩溃测试 - 图4

通过组合指定上述选项,就可以造成需要的崩溃。例如,在下例中,如果从文件系统进行20次I/O,就会产生例外(访问NULL指针)。


modprobe lkdtm cpoint_name=FS_DEVRW cpoint_type=EXCEPTION cpoint_count=20


稍微过一段时间内核就会出现重大故障。也可以通过debugfs来指定崩溃位置和崩溃原因。如果在不指定cpoint_name和cpoint_type的情况下将lkdtm安装到内核中,就会出现/sys/kernel/debug/provoke-crash目录。这个目录下存在表示崩溃位置的特殊文件,如果表7-8中表示崩溃原因的字符串写入这些文件中的某一个,就会发生相应的内核崩溃。下例通过debugfs进行与前面同样的操作。


modprobe lkdtm cpoint_count=20

cd/sys/kernel/debug/provoke-crash

ls

DIRECT IDE_CORE_CP INT_HW_IRQ_EN MEM_SWAPOUT TIMERADD

FS_DEVRW INT_HARDWARE_ENTRY INT_TASKLET_ENTRY SCSI_DISPATCH_CMD

echo EXCEPTION>FS_DEVRW


小结

本节介绍了使用LKDTM功能在内核中造成崩溃的方法。一般情况下,必须避免内核崩溃,但在想要检查系统品质和故障时,LKDTM却是非常有效的功能。尤其是在Kdump和集群系统(cluster system)的测试中更能发挥作用。

——Masami Hiramatsu