4. 硬件要求与检查:CPU、BIOS 与内核启动参数
在开始绑定 VFIO 驱动之前,必须确认硬件平台满足虚拟化与直通的基本条件。IOMMU(I/O Memory Management Unit)是 VFIO 工作的基石,它负责将物理设备地址空间映射到用户态进程的虚拟地址空间,并提供 DMA 隔离保护。如果 CPU 不支持 IOMMU 或 BIOS/内核未正确开启,后续所有操作都将失败。
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 enabledIntel-IOMMU |
VT-d 通常与 VT-x 同时存在,但需 BIOS 单独开启 |
| AMD | svm(AMD-V)iommu(AMD-Vi) |
AMD-Vi: IOMMU enabledAMD IOMMU |
AMD-Vi 是 AMD 的 IOMMU 实现 |
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 RemappingIntel VT for Directed I/O
- AMD 平台:
AMD-Vi(AMD I/O Virtualization Technology)IOMMUEnable IOMMU
- 通用名称:
I/O VirtualizationSR-IOV Support(与 IOMMU 相关但不同)
4.2.2 典型 BIOS 操作步骤
- 重启服务器/工作站,按
Del、F2、F10或Esc进入 BIOS 设置界面。 - 导航至 Advanced → CPU Configuration 或 System Configuration。
- 找到 VT-d 或 AMD-Vi 选项,设置为 Enabled。
- 部分 BIOS 还需要在 North Bridge 或 PCI Subsystem 中开启 DMA Remapping。
- 保存设置并退出(通常按
F10)。
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 隔离:
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 |
perf 或 iommu=pt 模式验证性能影响。直通模式(iommu=pt)可以显著降低 IOMMU 翻译开销,是 DPDK 场景的推荐配置。