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 源码的核心模块依赖关系,帮助你理解测试用例、框架库和内核接口之间的调用链路。

LTP 源码核心模块依赖关系 系统调用测试 文件系统测试 网络测试 LTP 测试框架库 (lib/tst_*.h) 系统调用接口 VFS / 文件系统 网络协议栈 说明: • 测试用例通过 LTP 框架库调用内核接口,框架库封装了测试结果判断、超时控制、资源清理等公共逻辑。 • 驱动开发者应重点关注 syscalls/ 和 device-drivers/ 目录,它们直接验证驱动与内核的交互。 • include/lapi/ 目录存放了针对不同内核版本的兼容性适配代码。

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 测试用例的分类体系,以及各类别在驱动测试中的覆盖范围。

LTP 测试用例分类与驱动测试覆盖 LTP 测试用例 系统调用测试 文件系统测试 网络测试 设备驱动测试 ioctl / mmap 块设备压力 网卡数据路径 PCI/USB 枚举 热插拔 驱动测试覆盖要点: • 系统调用测试:验证驱动实现的 read/write/ioctl/mmap 等接口语义。 • 文件系统测试:验证块设备驱动在 ext4/xfs 等文件系统下的稳定性。 • 网络测试:验证网卡驱动的数据包收发、校验和、中断处理。

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 兼容性检查清单

  1. 检查内核配置:运行 LTP 前,确保内核开启了 CONFIG_TEST、CONFIG_DEBUG_FS、CONFIG_FTRACE 等依赖选项。
  2. 查看 include/lapi/:该目录存放了针对不同内核版本的兼容性宏和函数封装,如 lapi/fcntl.h 处理 F_OFD_SETLK 的版本差异。
  3. 运行 configure 脚本:LTP 的 configure 会自动检测当前内核版本并启用/禁用不兼容的测试用例。
  4. 使用 runtest/ 场景文件:通过场景文件可以跳过已知不兼容的测试,避免测试中断。
  5. 关注 LTP 邮件列表:内核接口变更时,LTP 社区会提前在邮件列表发布适配计划。
常见兼容性问题:当内核版本低于 LTP 要求时,可能出现“未定义系统调用”错误(如 __NR_landlock 未定义)。此时应降级 LTP 版本或手动打补丁。反之,内核版本过高时,某些测试可能因内核行为变更而失败,需检查 LTP 的 CHANGELOG 确认已知问题。

以下 SVG 图展示了 LTP 版本与内核版本的兼容性矩阵,以及驱动测试在不同内核版本上的推荐策略。

LTP 版本与内核版本兼容性矩阵 内核版本演进 Linux 5.15 Linux 6.1 Linux 6.6 Linux 6.8 6.9+ LTP 20230127 LTP 20240101 LTP 20240501 建议:驱动测试时选择与内核版本匹配的 LTP 稳定版,避免使用 master 分支进行生产环境测试。

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 小时循环运行)。