本技能用于指导智能体对 Linux 内核进行测试,涵盖内核内单元测试、系统调用回归、模糊测试与持续集成等环节。
用途:
该技能面向 Linux 内核的测试工作,包含五种主要手段:KUnit 内核内单元测试、kselftest 测试框架、带 kcov 覆盖率的 syzkaller 模糊测试、Linux Test Project(LTP)系统调用回归测试,以及用于持续测试的 KernelCI 集成。
适用时机:
为内核库代码或驱动辅助代码编写单元测试;向 tools/testing/selftests/ 添加回归测试;使用 syzkaller 对系统调用和 ioctl 接口进行模糊测试;使用 kcov 测量内核代码覆盖率;运行 LTP 进行系统调用兼容性验证;为内核补丁搭建持续集成。
主要能力与使用方式:
-
KUnit——内核内单元测试。以 test_example.c 为例,通过 #include <kunit/test.h> 引入头文件,使用 KUNIT_EXPECT_EQ、KUNIT_ASSERT_NOT_ERR_OR_NULL 等断言宏编写测试函数,用 KUNIT_CASE 注册测试用例,用 kunit_test_suite 注册测试套件,并以 MODULE_LICENSE("GPL") 声明许可证。Makefile 中通过 obj-$(CONFIG_KUNIT) += test_example.o 引入。运行方式为 ./tools/testing/kunit/kunit.py run,可用 --filter 指定测试,也可通过 --cross_compile 与 --arch 进行交叉编译运行。KUnit 在内核上下文中运行(UMH 或专用 kunit 内核),测试分配建议使用 kunit_kmalloc。
-
kselftest 测试框架。进入 tools/testing/selftests 目录,用 make -j$(nproc) 构建全部测试,用 make run_tests 运行全部测试,也可单独运行某个测试(如 ./memfd/memfd_test)。新增自测时,在 tools/testing/selftests/mytest/ 下放置 Makefile、mytest.c 与可选的 config 文件;Makefile 中设置 CFLAGS、TEST_GEN_FILES、TEST_PROGS 并包含 ../lib.mk,然后在顶层用 make -C tools/testing/selftests/mytest run_tests 运行。
-
syzkaller 模糊测试。通过 git clone https://github.com/google/syzkaller 并 make 安装。manager.cfg 中配置 target、http、workdir、kernel_obj、syzkaller、procs、type 为 qemu 以及 vm 的 count、kernel、cpu、mem 等参数,用 ./bin/syz-manager -config manager.cfg 启动,用 ./bin/syz-repro -config manager.cfg crash-report.txt 复现崩溃。内核需要 CONFIG_KCOV、CONFIG_DEBUG_FS,建议开启 CONFIG_KASAN。
-
kcov——内核覆盖率。需在内核配置中设置 CONFIG_KCOV=y;syzkaller 会自动使用 kcov,也可通过 debugfs 在 /sys/kernel/debug/kcov/ 下手动查看。覆盖率用于引导 syzkaller 探索未覆盖的内核路径。
-
Linux Test Project(LTP)。通过 git clone https://github.com/linux-test-project/ltp 获取源码,依次执行 make autotools、./configure、make -j$(nproc)、make install。在 /opt/ltp 下用 ./runltp -f syscalls 运行系统调用测试,用 -s 指定单个测试(如 pipe01)。LTP 类别包括 syscalls、FS、network、IPC、controllers、security。
-
KernelCI。KernelCI 会针对多个 defconfig 测试补丁;提交构建需项目特定令牌,参考 https://kernelci.org/docs/;可在 KernelCI 仪表盘查看启动与 kselftest 结果。典型流水线为:补丁 → 构建(allmodconfig)→ 启动测试(QEMU)→ kselftest → LTP 子集。
-
测试决策树:纯内核函数逻辑选 KUnit;用户态可见行为(系统调用、ioctl)选 kselftest;安全或崩溃发现选 syzkaller + KASAN;跨发行版回归选 LTP;上游补丁 CI 选 KernelCI。
-
调试友好的测试内核配置:CONFIG_KUNIT=y、CONFIG_KCOV=y、CONFIG_KASAN=y、CONFIG_DEBUG_INFO_DWARF5=y、CONFIG_FRAME_POINTER=y、CONFIG_FTRACE=y;可先 make kvm_guest.config 作为合理测试配置基础,再用 scripts/config --enable KUNIT KCOV KASAN,最后 make olddefconfig。
常见问题与排查:KUnit 测试未找到通常是 CONFIG_KUNIT 未启用,需在 .config 中启用并重新构建;kselftest 显示 SKIP 多为缺少内核特性,需检查 config 文件要求;syzkaller 无崩溃多因 VM 配置错误,需确认 QEMU 能启动并检查内核命令行;kcov 覆盖率为零通常是 CONFIG_KCOV 未开启,需带 kcov 重新构建内核;LTP 大量失败多因环境不正确,应以 root 运行并检查 README 中的前置条件;kunit.py 挂起多因 UML 与硬件不匹配,需指定 --arch 并交叉编译。
相关技能包括:low-level-programming/linux-kernel-modules(被测模块)、kernel/device-drivers(待单元测试的驱动逻辑)、kernel/kernel-debugging(调试测试发现的失败)、runtimes/fuzzing(用户态模糊测试概念,libFuzzer)、runtimes/sanitizers(内核的 KASAN/KMSAN)、virtualization/qemu-kvm(用于内核启动测试的 QEMU)。
限制:该技能面向 Linux 内核测试,需要对应的内核源码树与构建环境;syzkaller、LTP、KernelCI 等的具体配置与令牌、平台支持情况需参考各自官方文档,本资料未提供更多细节。