如何测试Linux内核
如何测试Linux内核
概述
在本文中,我们将讨论用于测试Linux内核的各种框架和工具。首先,我们将介绍LTP( Linux Test Project)项目。然后,我们将讨论其他测试工具和框架。最后,我们将讨论我们无法使用常规内核测试工具测试的新Linux驱动程序的测试。
本文将持续更新,最新版本参见https://www.cnblogs.com/testing-/p/17579543.html。
LTP
网址:https://github.com/linux-test-project/ltp
LTP是自动化工具的开源集合,我们可以用它来创建构建流程、执行自动化测试和调试 Linux 内核。LTP 项目由 IBM、Cisco、RHEL 和其他组织共同开发。
构建系统
LTP的构建系统为Linux内核项目提供了结构。不仅如此,它还使用了新的Makefile系统,该系统提供了增强的构建过程,从而使 Linux 项目的维护更加易于管理。
C测试用例
我们可以用C语言或可移植的POSIX兼容shell语言编写LTP测试用例。测试用例使用LTP测试应用程序接口(API),该程序接口完全由C语言编写。此外,我们还可以为glibc和musl C库编写测试用例。
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- https://www.baeldung.com/linux/kernel-testing
Autotest
网址:https://github.com/autotest/autotest
Autotest是专为测试Linux内核而设计的测试框架。它提供了用于建立完全自动化测试网格的模块。
Autotest模块包括
- 客户端模块,用于在项目目录内实际执行测试
- 服务器模块,方便我们管理多个远程机器上的测试客户端
- Autotest 数据库模块,用于存储测试网格的结果
- 调度程序,用于执行与测试网格相关的cron作业
- 使用Autotest的命令行界面
- 用于可视化测试结果和调度工作的网络前端
为了进行严格的测试,我们还可以将LTP测试用例与Autotest调度器结合起来,因为Autotest并不提供用于测试 Linux 内核的 C 测试 API。
Kmemleak
Kmemleak是主线Linux内核的一项开发功能。内核分配的内存有时无法释放。因此,它既可能成为性能问题,也可能成为安全隐患。
利用Kmemleak,我们可以检查内核产生的内存泄漏。不过,它不会修复问题,而是追踪可能的泄露并将其报告到/sys/kernel/debug/memleak。在某种程度上,Kmemleak与Java和C#等高级语言中的垃圾回收器非常相似。
此外,如果我们使用的是Linux内核,还可以通过在内核配置中启用"CONFIG_DEBUG_KMEMLEAK"来使用该功能。在大多数流行的发行版中,该功能默认为禁用:
$ zgrep "CONFIG_DEBUG_KMEMLEAK" /proc/config.gz
# CONFIG_DEBUG_KMEMLEAK is not set
这是有道理的,因为我们在生产中并不需要它。
Kmemcheck
与Kmemleak一样,Kmemcheck也是Linux内核的一项开发功能。不过,它们执行的任务不同。
Kmemcheck负责检查内核代码是否访问了内存中未初始化的结构。例如,内核分配了内存块,但没有填满,然后就会尝试访问该位置。这会导致严重的错误和性能问题。
需要注意的是,该功能仅适用于 x86 系统。
Linaro LAVA
LAVA(Linaro自动化和验证架构)是一种持续集成,用于将操作系统部署到物理和虚拟硬件上以运行测试。这些测试包括启动、引导加载器和系统级测试。它专为 ARM 系统设计。
我们可以使用LAVA来检查我们对内核代码所做更改的有效性。不仅如此,我们还可以检查内核是否在速度和大小方面都进行了优化。然后,LAVA 会将这些指标写入一个文件,供我们进一步分析。
LAVA 框架主要用于测试移动操作系统,因为大多数手机都使用 ARM 或某种形式的 ARM 架构。
调试器
调试器是一种允许我们逐行执行程序代码的工具。它为我们提供了一种监控程序流程和找出模糊错误的简便方法。不过,我们应该知道,步骤调试器并不执行单元测试。
GDB
在Linux上,我们有GDB(GNU调试器)和KGDB(内核GDB)。GDB是一个通用调试器,允许我们调试包括C语言在内的多种编程语言的代码。虽然我们不能直接使用GDB调试内核代码,但我们可以通过GDB设置QEMU,轻松查看执行中的内核代码。
KGDB
KGDB是一款适用于BSD操作系统和Linux的调试器。要使用KGDB,我们需要两台通过串行连接或火线连接的机器。一台运行内核,另一台运行调试器。这两台机器通过 GDB 远程协议进行通信。
设备驱动测试
测试Linux设备驱动程序可能会变得非常乏味,因为没有测试Linux设备驱动程序的灵丹妙药。因此,所有测试都必须在物理硬件上手动完成。虽然我们可以在虚拟机上测试驱动程序,但由于虚拟机添加了抽象层,可能无法正常工作。
为了测试驱动程序,我们需要在启动Linux后手动加载驱动程序,检查是否存在初始化错误。之后,我们可以使用调试器,在某些情况下还可以执行自动测试。