IOMMU 与设备直通
IOMMU(Intel VT-d 与 AMD-Vi)是设备直通与 DMA 隔离的基础:开启后内核按硬件拓扑把设备划分成组,同一组内的设备只能整组直通。检查分三步——内核命令行是否有 intel_iommu=on 或 amd_iommu=on、dmesg 里是否有 DMAR 或 IOMMU 记录、/sys/kernel/iommu_groups/ 下是否出现分组。分组粒度太粗意味着隔离不完整,需要评估 ACS 覆盖或更换平台。
基本信息
| 内核参数 | cat /proc/cmdline 查 intel_iommu=on / amd_iommu=on |
|---|---|
| 内核日志 | dmesg | grep -i -e DMAR -e IOMMU |
| 分组目录 | ls /sys/kernel/iommu_groups/ |
| 组成员 | ls /sys/kernel/iommu_groups/<组号>/devices/ |
| 直通前提 | 设备绑定到 vfio-pci 且未被宿主占用 |
典型使用场景
- 为虚机直通网卡、HBA 或 GPU 前确认 IOMMU 已就绪
- 排查分组过粗导致无法单独直通某块设备
- 升级内核或固件后确认直通能力没有回退
- 为高性能场景评估 SR-IOV 与直通的可行性
- 安全加固中评估 DMA 隔离是否完善
检查三件套
检查三件套
cat /proc/cmdline # 确认是否有 iommu 相关参数
dmesg | grep -i -e DMAR -e IOMMU | head # 确认内核是否识别到 IOMMU
ls /sys/kernel/iommu_groups/ | head # 是否已生成分组
ls /sys/kernel/iommu_groups/0/devices/ # 查看某个分组里的设备
lspci -nn | head # 取 PCI 地址与设备标识,便于对照分组检查点与判定
| 检查点 | 命令 | 期望与异常 |
|---|---|---|
| 内核参数 | /proc/cmdline | 缺少 iommu 参数说明未开启 |
| 内核日志 | dmesg 中的 DMAR/IOMMU | 无记录说明固件未启用或参数未生效 |
| 分组目录 | /sys/kernel/iommu_groups/ | 目录为空说明 IOMMU 未生效 |
| 组内成员 | 各分组 devices 目录 | 多个关键设备同组说明隔离不完整 |
| 设备占用 | 对照 lspci 与宿主驱动 | 宿主正在使用的设备无法直接直通 |
若分组粒度太粗(多设备同组),可评估 ACS 覆盖或换用支持更好隔离的平台,强行直通会把同组其他设备一起从宿主剥离。
直通前要把设备从宿主驱动解绑并绑定到 vfio-pci,且确认设备未被宿主使用,否则绑定会失败或导致宿主侧功能异常。
开启顺序
- 先在固件里启用 VT-d 或 AMD-Vi,再配置内核参数
- 把 iommu 参数写入内核命令行并重启,重启后复查参数与 dmesg
- 确认已生成 iommu_groups 并按组清点设备
- 把目标设备绑定到 vfio-pci 并在宿主侧确认不再被占用
- 直通后在 guest 内核对设备识别与驱动加载情况