外观
硬件直通
直通(passthrough)是把一个物理 PCI 设备整个从宿主机剥离,交给某一台虚拟机独占。它让 NAS 虚拟机能直接管硬盘、让转码虚拟机能用核显、让软路由虚拟机能用真网卡。
这是 PVE 里最容易出问题的功能,也是本站最谨慎对待的章节。
先认清代价
直通不是免费的
一台挂了直通设备的虚拟机,会失去这些能力:
- 不能打快照(多数情况下)。设备状态没法保存。
- 不能在线迁移。目标节点上没有同一个物理设备。
- 内存必须全部预分配,气球驱动不可用。
- 宿主机看不到这个设备了。直通 HBA 之后,宿主机上的
lsblk不再显示那些硬盘。
决定直通之前,确认这些代价你能接受。特别是「不能快照」这一条——它会改变你的备份策略。
直通配错可能让宿主机无法启动
把宿主机正在使用的设备(系统盘控制器、唯一的网卡、正在输出显示的显卡)直通出去,会导致宿主机启动失败或失去管理能力。
开始之前确保你有:物理控制台,或者一个不依赖被直通设备的管理路径。
前提条件
| 条件 | 怎么确认 |
|---|---|
| CPU 支持 VT-d / AMD-Vi | 规格页 |
| 主板支持并已在 BIOS 中开启 | BIOS 里找 IOMMU / VT-d |
| 内核启用了 IOMMU | 见下文 |
| 目标设备在一个干净的 IOMMU 分组里 | 见下文 |
快速确认 IOMMU 是否已生效:
sh
dmesg | grep -e DMAR -e IOMMU | head看到 IOMMU enabled 之类的行说明内核这边开了。完全没有输出,说明 BIOS 里没开或者内核参数没加。
看分组情况:
sh
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/}; n=${n%%/*}
printf 'Group %s: ' "$n"
lspci -nns "${d##*/}"
done | sort -V分组决定了能不能直通
IOMMU 分组是硬件层面的隔离单位。一个分组里的设备只能整组直通。如果你的显卡和 USB 控制器、网卡挤在同一个分组里,就只能一起给出去——而如果那个分组里还有宿主机需要的设备,这个直通就做不了。
分组情况由主板的 PCIe 拓扑决定,换插槽有时会改变分组。
本章文章
- 开启 IOMMU:GRUB 与 systemd-boot:让内核认得到 VT-d/AMD-Vi,两种引导方式的不同改法。
- 读懂 IOMMU 分组:判断你的目标设备能不能干净地单独直通出去。
- 显卡直通:独显与核显:绑定 vfio-pci、配置 OVMF,避免常见黑屏原因。
- SR-IOV 与 vGPU:把一张网卡或显卡拆成多个虚拟功能,分给不同虚拟机。
- 硬盘与 HBA 直通:NAS 虚拟机的正确做法:直通整张 HBA 卡而不是单块硬盘。
- USB 与串口直通:比 PCI 直通简单得多的场景,例如 Zigbee 网关和许可证狗。
- 资源映射(Resource Mapping):把直通配置和物理地址解耦,方便集群迁移和分权限。
- 直通常见问题:黑屏、Code 43 与设备无法重置:三类最常见故障的排查思路。
内容状态:对照官方文档整理,尚未在本站实机验证
以上文章已逐项对照 Proxmox 官方 Wiki 的 PCI(e) Passthrough / PCI Passthrough 条目和管理指南的 qm 章节核实过菜单路径、命令语法和配置项含义,但本站还没有在自己的硬件上完整跑通验证(文章顶部因此只标注"资料核查"而不是"实机核验")。
直通行为对 CPU 代次、主板型号、固件版本、显卡/网卡型号高度敏感,你的实际结果可能和文章描述不同,尤其是 Code 43、复位缺陷这类和具体芯片相关的问题。动手前预留回退时间,遇到和本站描述不一致的地方,优先信任你自己机器上的实际现象,并参考文末列出的官方资料确认。
一个更简单的替代方案
很多人做直通是为了让 NAS 虚拟机管理硬盘。如果你只有一两块数据盘,还有两个更简单的选项:
- 直通整个磁盘(不是 PCI 控制器):用
qm set <vmid> -scsi1 /dev/disk/by-id/<磁盘ID>。比 PCI 直通简单,但客户机拿不到 SMART 信息,ZFS 的一些特性也受影响。 - 宿主机管盘,容器做共享:宿主机上建 ZFS 池,用 LXC 容器跑 Samba。省掉整个直通话题。
直通 HBA 卡才是 NAS 虚拟机的推荐做法
如果确实要跑 TrueNAS 这类依赖直接访问磁盘的系统,直通整张 HBA 卡(而不是单块盘)才是官方推荐的做法——ZFS 需要真正看到磁盘和它的 SMART 数据。这需要一张独立的 HBA 卡,以及它在一个干净的 IOMMU 分组里。