4. 硬件要求与检查:CPU、BIOS 与内核启动参数

在开始绑定 VFIO 驱动之前,必须确认硬件平台满足虚拟化与直通的基本条件。IOMMU(I/O Memory Management Unit)是 VFIO 工作的基石,它负责将物理设备地址空间映射到用户态进程的虚拟地址空间,并提供 DMA 隔离保护。如果 CPU 不支持 IOMMU 或 BIOS/内核未正确开启,后续所有操作都将失败。

⚠️ 常见误区:很多开发者认为只要 CPU 支持 VT-x/AMD-V(虚拟化扩展)就足够了,但实际上 VFIO 依赖的是 VT-d(Intel) 或 AMD-Vi(AMD),这是独立的 I/O 虚拟化特性,与 CPU 虚拟化指令集不同。

4.1 检查 CPU 是否支持 VT-d / AMD-Vi

首先需要确认 CPU 的硬件能力。Intel 平台查找 VT-d 标志,AMD 平台查找 AMD-Vi 或 IOMMU 标志。最可靠的方法是通过 grep 命令检查 /proc/cpuinfo 或 dmesg 输出。

4.1.1 命令行检查方法

# 方法一:检查 CPU 标志位(Intel)
grep -E "vmx|svm" /proc/cpuinfo | head -1

# 方法二:检查 dmesg 中 IOMMU 相关日志
dmesg | grep -i "iommu"

# 方法三:检查是否支持 DMA 重映射(Intel 专用)
dmesg | grep -i "dmar"

# 方法四:检查 AMD IOMMU 支持
dmesg | grep -i "amd-vi"

如果输出为空或没有相关行,说明 CPU 可能不支持 IOMMU,或者 BIOS 中未开启该特性。下表总结了不同平台的关键检查项:

平台 检查标志 dmesg 关键字 说明
Intel vmx(VT-x)
dmar(VT-d)
DMAR: IOMMU enabled
Intel-IOMMU
VT-d 通常与 VT-x 同时存在,但需 BIOS 单独开启
AMD svm(AMD-V)
iommu(AMD-Vi)
AMD-Vi: IOMMU enabled
AMD IOMMU
AMD-Vi 是 AMD 的 IOMMU 实现
💡 提示:部分服务器级 CPU(如 Intel Xeon Scalable、AMD EPYC)默认支持 IOMMU,但消费级 CPU(如 Core i5/i7、Ryzen 5/7)可能需要查阅具体型号的规格表。使用 lscpu 或 cat /proc/cpuinfo | grep "model name" 获取 CPU 型号后,前往官网确认。

4.2 BIOS 中开启 IOMMU

即使 CPU 硬件支持,BIOS/UEFI 设置中也可能默认关闭 IOMMU。不同厂商的 BIOS 菜单名称和位置差异较大,但核心选项通常位于 Advanced 或 Virtualization 菜单下。

4.2.1 常见 BIOS 选项名称

  • Intel 平台:
    • VT-d(Intel Virtualization Technology for Directed I/O)
    • DMA Remapping
    • Intel VT for Directed I/O
  • AMD 平台:
    • AMD-Vi(AMD I/O Virtualization Technology)
    • IOMMU
    • Enable IOMMU
  • 通用名称:
    • I/O Virtualization
    • SR-IOV Support(与 IOMMU 相关但不同)

4.2.2 典型 BIOS 操作步骤

  1. 重启服务器/工作站,按 Del、F2、F10 或 Esc 进入 BIOS 设置界面。
  2. 导航至 Advanced → CPU Configuration 或 System Configuration。
  3. 找到 VT-d 或 AMD-Vi 选项,设置为 Enabled。
  4. 部分 BIOS 还需要在 North Bridge 或 PCI Subsystem 中开启 DMA Remapping。
  5. 保存设置并退出(通常按 F10)。
🔍 验证 BIOS 生效:重启后再次运行 dmesg | grep -i "iommu",如果看到类似 DMAR: IOMMU enabled 或 AMD-Vi: IOMMU enabled 的日志,说明 BIOS 设置已生效。

4.3 内核启动参数配置

BIOS 开启 IOMMU 后,还需要在 Linux 内核启动参数中显式启用 IOMMU 支持。这是通过 GRUB 或 systemd-boot 的引导配置完成的。

4.3.1 必需的内核参数

平台 内核参数 说明
Intel intel_iommu=on 强制启用 Intel IOMMU 驱动
AMD amd_iommu=on 强制启用 AMD IOMMU 驱动
通用 iommu=pt 将 IOMMU 设置为直通模式,减少 DMA 重映射开销
通用 iommu.passthrough=1 与 iommu=pt 等效,用于较新内核

4.3.2 配置 GRUB 启动参数

以最常见的 GRUB2 引导器为例,修改 /etc/default/grub 文件:

# 编辑 GRUB 配置文件
sudo vim /etc/default/grub

# 找到 GRUB_CMDLINE_LINUX 行,添加参数
# Intel 平台示例:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"

# AMD 平台示例:
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"

# 如果同时使用 DPDK 和 VFIO,建议添加:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1"

保存文件后,更新 GRUB 配置并重启:

# 更新 GRUB 配置(BIOS 系统)
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 或(UEFI 系统)
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

# 对于 Ubuntu/Debian 系统
sudo update-grub

# 重启系统
sudo reboot

4.3.3 验证内核参数是否生效

重启后,通过以下命令确认参数已正确加载:

# 查看内核命令行参数
cat /proc/cmdline

# 检查 IOMMU 是否启用
dmesg | grep -i "iommu"

# 检查 IOMMU 组是否创建(关键验证)
ls /sys/kernel/iommu_groups/

如果 /sys/kernel/iommu_groups/ 目录下存在数字编号的子目录(如 0、1、2...),说明 IOMMU 已成功启用并创建了隔离组。

⚠️ 常见问题:如果重启后 dmesg 显示 IOMMU not found 或 DMAR: IOMMU not available,请检查:
1. BIOS 中 VT-d/AMD-Vi 是否确实设置为 Enabled。
2. 内核是否编译了 IOMMU 支持(CONFIG_INTEL_IOMMU 或 CONFIG_AMD_IOMMU)。
3. 某些主板需要同时开启 Above 4G Decoding 选项。

4.4 IOMMU 硬件架构与数据流

下图展示了从 CPU 到 PCIe 设备的 IOMMU 硬件架构,以及 VFIO 如何利用 IOMMU 实现 DMA 隔离:

IOMMU 硬件架构与 VFIO 数据流 IOMMU 硬件架构与 VFIO DMA 隔离数据流 CPU 核心 物理地址访问 系统内存 物理地址空间 IOMMU DMA 重映射 地址翻译 & 隔离 PCIe Root Complex 总线枚举 配置空间 PCIe 设备 网卡/NVMe DMA 请求 VFIO 用户态驱动 DPDK / QEMU 内存访问请求 翻译后物理地址 DMA 重映射 PCIe 事务 DMA 请求(设备发起) IOMMU 组绑定 📌 关键流程说明: 1. PCIe 设备发起 DMA 请求,目标为设备看到的“总线地址”。 2. IOMMU 拦截该请求,根据 I/O 页表将总线地址翻译为物理地址。 3. 翻译后的物理地址被限制在 VFIO 分配的 DMA 区域内,实现隔离。 4. 未经允许的 DMA 访问将被 IOMMU 阻止,防止设备越权访问内存。

4.5 硬件检查清单

为方便实际操作,以下是一份完整的硬件检查清单,建议逐项确认:

步骤 检查项 验证命令 / 方法 预期结果
1 CPU 支持 VT-d/AMD-Vi grep -E "vmx|svm" /proc/cpuinfo 输出包含 vmx 或 svm 标志
2 BIOS 开启 IOMMU 进入 BIOS 设置界面检查 VT-d / AMD-Vi 设置为 Enabled
3 内核启动参数 cat /proc/cmdline 包含 intel_iommu=on 或 amd_iommu=on
4 IOMMU 驱动加载 dmesg | grep -i "iommu" 显示 IOMMU enabled 或 DMAR: IOMMU enabled
5 IOMMU 组创建 ls /sys/kernel/iommu_groups/ 存在数字编号的子目录(如 0, 1, 2...)
6 VFIO 内核模块 lsmod | grep vfio 显示 vfio、vfio_iommu_type1、vfio_pci
💡 生产环境建议:在服务器上启用 IOMMU 后,建议进行 DMA 压力测试,使用 perf 或 iommu=pt 模式验证性能影响。直通模式(iommu=pt)可以显著降低 IOMMU 翻译开销,是 DPDK 场景的推荐配置。