第二章 测试环境搭建:硬件平台选型与软件准备

各位同学,咱们直接进入正题。做NVMe驱动兼容性测试,环境搭建是第一步,也是决定成败的一步。我见过太多人,代码写得漂亮,结果板子点不亮,查了半天发现是硬件选型出了问题。所以这一章,咱们把硬件平台、操作系统、驱动源码这些事儿,一次性说清楚。

2.1 硬件平台选型:FPGA还是ASIC验证板?

先问个问题:你手头有现成的NVMe SSD吗?如果有,那恭喜你,可以直接用ASIC验证板。但如果你像我一样,经常需要调试底层协议,或者要验证一些非标行为,那FPGA验证板才是你的好伙伴。

FPGA验证板,说白了就是一块可以反复烧录逻辑的板子。它的好处是灵活。我在项目中遇到过,某款SSD的NVMe命令超时处理有bug,用ASIC板根本复现不了,因为固件已经固化。但FPGA板,我改几行RTL代码,重新综合一下,问题就暴露出来了。

选型建议:

  • FPGA验证板:适合协议开发、异常场景模拟、早期驱动调试。推荐Xilinx VCU118或Intel Arria 10系列。
  • ASIC验证板:适合量产前兼容性测试、性能摸底。比如直接用M.2转PCIe转接卡插到PC上。

嗯,这里要注意一点:FPGA板的PCIe链路稳定性往往不如ASIC。我曾经因为FPGA板子的PCIe参考时钟抖动过大,导致NVMe初始化失败,查了整整两天。所以如果你用FPGA,记得先跑一下PCIe链路训练,确认Gen3/Gen4能稳定协商。

2.2 操作系统与内核版本选择

操作系统选什么?我个人习惯用Ubuntu LTS版本,比如20.04或22.04。为什么?因为社区支持好,遇到问题随便一搜就有答案。但如果你做的是嵌入式Linux,那Yocto或Buildroot可能是更好的选择。

内核版本呢?我建议选长期支持版(LTS),比如5.10或6.1。为什么?因为NVMe驱动在这些版本上相对稳定,而且bug修复及时。我记得有一次,我用了一个非LTS的5.15内核,结果NVMe驱动在热插拔时直接panic,后来查了邮件列表才知道是已知问题,但LTS版本早就修了。

我的经验:

  • 如果你只是做功能测试,Ubuntu 22.04 + 内核5.15 LTS 足够。
  • 如果你要测深度睡眠、电源管理等特性,建议用内核6.1以上,因为NVMe电源管理在旧内核上支持不完整。

你想想看,如果内核版本太老,NVMe驱动可能连TP(Temperature Threshold)这类新特性都不支持,那测试还有什么意义?

2.3 NVMe驱动源码获取与编译

驱动源码从哪来?两个途径:

  1. 内核自带驱动:在Linux内核源码的 drivers/nvme/host/ 目录下。这是最稳定的版本,但更新慢。
  2. Git仓库:从 git://git.infradead.org/nvme.git 拉取。这是NVMe官方维护的仓库,更新快,但可能不稳定。

我个人建议,测试兼容性时用内核自带驱动,因为经过大量验证。但如果你要测新特性,比如NVMe 2.0的Endurance Group Management,那就得用Git仓库的最新代码。

编译驱动其实不复杂,但有几个坑。我直接给你看步骤:

# 1. 下载内核源码(以5.15 LTS为例)
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.150.tar.xz
tar -xf linux-5.15.150.tar.xz
cd linux-5.15.150

# 2. 配置内核,确保NVMe驱动被编译为模块
make menuconfig
# 进入 Device Drivers → NVME Support → 选中 "NVM Express block device"
# 建议也选中 "NVM Express over Fabrics" 如果你要测试NVMe-oF

# 3. 编译驱动模块
make -j$(nproc) modules_prepare
make -j$(nproc) M=drivers/nvme/host

# 4. 安装模块
sudo make modules_install
sudo depmod -a

# 5. 加载驱动
sudo modprobe nvme

# 6. 验证
lsmod | grep nvme
dmesg | grep nvme

避坑指南:

  • 我曾经因为没执行 make modules_prepare,直接编译驱动,结果加载时报 Unknown symbol 错误。记住,这一步不能省。
  • 如果你用的是Ubuntu的预编译内核,记得安装 linux-headers-$(uname -r) 包,否则编译会报找不到头文件。

编译完成后,我习惯用 nvme list 命令看看设备是否识别。如果能看到你的NVMe设备,那恭喜,环境搭建成功了。

2.4 小结

这一章内容不多,但都是实打实的经验。硬件选型决定了你能测什么,操作系统和内核版本决定了你的测试环境是否稳定,驱动编译则是动手的第一步。我建议你按照这个流程走一遍,遇到问题别慌,先看dmesg,再看内核文档。下一章咱们开始讲具体的测试用例设计,到时候你会感谢今天把环境搭好的自己。

好了,今天就到这儿。有问题随时交流。