3. LTP 测试集概述:源码结构、用例分类与兼容性
LTP(Linux Test Project)是 Linux 内核社区最权威的回归测试套件,由 SGI、IBM、富士通等公司联合维护,至今已积累超过 5000 个测试用例。对于内核驱动开发者而言,LTP 不仅是验证驱动稳定性的“试金石”,更是理解内核接口语义的活文档。本章从源码结构、用例分类和版本兼容性三个维度,帮助你快速建立对 LTP 的整体认知。
3.1 LTP 源码结构
LTP 源码采用模块化组织,顶层目录清晰地划分了测试用例、库函数、工具和文档。理解目录结构是高效使用 LTP 的第一步。
核心目录速览: 以下表格列出了 LTP 源码树中与驱动测试最相关的目录及其作用。
| 目录 | 作用 | 驱动测试关注点 |
|---|---|---|
testcases/kernel/syscalls/ |
系统调用测试,覆盖 400+ 系统调用 | 验证驱动实现的 ioctl、mmap、read/write 等接口 |
testcases/kernel/fs/ |
文件系统测试,包括 ext4、xfs、btrfs 等 | 测试块设备驱动的文件系统兼容性 |
testcases/network/ |
网络协议栈测试,TCP/UDP/ICMP 等 | 验证网络设备驱动的数据路径完整性 |
testcases/kernel/device-drivers/ |
设备驱动专项测试(如 pci、usb、tty) | 直接运行驱动级测试用例 |
lib/ |
LTP 测试框架库(tst_*.h) | 驱动测试编写时引用的公共 API |
include/ |
公共头文件,定义测试宏和数据结构 | 包含 lapi/ 目录用于内核版本适配 |
runtest/ |
场景定义文件,组织测试用例执行顺序 | 自定义驱动稳定性测试场景 |
以下 SVG 图展示了 LTP 源码的核心模块依赖关系,帮助你理解测试用例、框架库和内核接口之间的调用链路。
3.2 测试用例分类
LTP 测试用例按测试对象和测试方法分为多个类别。对于驱动测试,以下分类最具参考价值:
3.2.1 按测试对象分类
| 分类 | 典型用例 | 驱动测试价值 |
|---|---|---|
| 系统调用 | ioctl01, mmap01, read04 |
验证驱动实现的系统调用语义是否正确 |
| 文件系统 | fs_fill, fs_stress, fsx |
测试块设备驱动在文件系统压力下的稳定性 |
| 网络 | tcp_fastopen, udp_stress |
验证网卡驱动的数据包收发和协议栈交互 |
| 设备驱动 | pci_hotplug, usb_device |
直接测试 PCI/USB 等总线驱动的热插拔和枚举 |
| 内存管理 | oom01, ksm01 |
测试驱动在内存压力下的行为 |
| 调度与定时器 | hrtimer, sched_stress |
验证驱动中断处理和定时器回调的实时性 |
3.2.2 按测试方法分类
- 功能测试:验证系统调用或驱动接口是否返回预期结果,如
ioctl01测试基本 ioctl 命令。 - 压力测试:通过并发、大负载或长时间运行暴露驱动资源泄漏或竞态条件,如
fs_stress同时执行大量文件操作。 - 边界测试:测试参数边界值(如零长度 buffer、最大文件大小),如
read04测试读取超出文件大小的行为。 - 异常测试:注入错误条件(如设备断开、内存分配失败),验证驱动的错误处理路径。
- 并发测试:多线程/多进程同时访问驱动,检测锁竞争和死锁,如
pthread_mutex_stress。
驱动测试建议:优先运行
syscalls/ 中与驱动接口相关的系统调用测试(如 ioctl、mmap、poll),然后运行 device-drivers/ 中的专项测试,最后用 fs/ 或 network/ 的压力测试验证驱动在真实负载下的稳定性。
以下 SVG 图展示了 LTP 测试用例的分类体系,以及各类别在驱动测试中的覆盖范围。
3.3 LTP 与内核版本兼容性
LTP 与内核版本之间存在明确的对应关系。使用不匹配的 LTP 版本可能导致测试用例因内核接口变化而编译失败、运行报错或产生误判。
3.3.1 版本对应关系
| LTP 版本 | 推荐内核版本 | 关键兼容性说明 |
|---|---|---|
| LTP 20230127 | Linux 5.15 ~ 6.1 | 支持新系统调用 landlock、futex_waitv |
| LTP 20240101 | Linux 6.1 ~ 6.6 | 适配 io_uring 新特性,移除过时测试 |
| LTP 20240501 | Linux 6.6 ~ 6.8 | 新增 mseal 系统调用测试,更新网络测试 |
| LTP master | Linux 6.8+ | 跟踪主线内核,可能包含未稳定 API |
3.3.2 兼容性检查清单
- 检查内核配置:运行 LTP 前,确保内核开启了
CONFIG_TEST、CONFIG_DEBUG_FS、CONFIG_FTRACE等依赖选项。 - 查看
include/lapi/:该目录存放了针对不同内核版本的兼容性宏和函数封装,如lapi/fcntl.h处理F_OFD_SETLK的版本差异。 - 运行
configure脚本:LTP 的configure会自动检测当前内核版本并启用/禁用不兼容的测试用例。 - 使用
runtest/场景文件:通过场景文件可以跳过已知不兼容的测试,避免测试中断。 - 关注 LTP 邮件列表:内核接口变更时,LTP 社区会提前在邮件列表发布适配计划。
常见兼容性问题:当内核版本低于 LTP 要求时,可能出现“未定义系统调用”错误(如
__NR_landlock 未定义)。此时应降级 LTP 版本或手动打补丁。反之,内核版本过高时,某些测试可能因内核行为变更而失败,需检查 LTP 的 CHANGELOG 确认已知问题。
以下 SVG 图展示了 LTP 版本与内核版本的兼容性矩阵,以及驱动测试在不同内核版本上的推荐策略。
3.4 驱动测试的 LTP 用例选择策略
针对不同的驱动类型,LTP 提供了差异化的测试用例组合。以下表格总结了常见驱动类型的推荐测试集:
| 驱动类型 | 推荐 LTP 测试集 | 重点关注 |
|---|---|---|
| 字符设备驱动 | syscalls/ioctl*, syscalls/read*, syscalls/write*, syscalls/poll* |
ioctl 命令码、阻塞/非阻塞读写、poll 事件 |
| 块设备驱动 | fs/fs_fill, fs/fs_stress, fs/fsx, syscalls/fallocate* |
文件系统挂载、并发 I/O、断电恢复 |
| 网络设备驱动 | network/tcp*, network/udp*, network/multicast* |
吞吐量、丢包率、MTU 配置、中断合并 |
| USB 驱动 | device-drivers/usb*, syscalls/ioctl_usb* |
热插拔、枚举、批量传输、中断传输 |
| PCI 驱动 | device-drivers/pci_hotplug, syscalls/pciconfig* |
BAR 空间访问、MSI 中断、DMA 一致性 |
最佳实践:在开发新驱动时,建议先运行对应系统调用的功能测试(如 ioctl01),确保基本接口正确;然后运行压力测试(如 fs_stress)暴露资源泄漏;最后结合场景文件(runtest/)组织长时间稳定性测试(如 24 小时循环运行)。