虚拟机PCIe穿透,本质是把物理主机的PCIe设备直接分配给虚拟机独占使用,跳过宿主机的抽象层,具体操作需要三件事:确认平台支持、隔离设备、修改虚拟机配置,下面逐步拆开讲。
虚拟机PCIe穿透怎么操作?先过这四道前提关
很多人卡在第一步,不是命令写错,而是硬件或系统层面根本没准备好,PCIe穿透又叫直通(Passthrough),它的前提条件比普通虚拟化苛刻得多。
硬件平台与BIOS设置
CPU和主板必须支持并开启IOMMU,Intel平台对应VT-d,AMD平台对应AMD-Vi,在BIOS里找到“Advanced”或“Northbridge”相关选项,把VT-d或AMD-Vi设为Enabled,注意,不少主板默认关闭,而且开启后可能会占用少量内存,但这是必经之路。
CPU最好支持ACS(Access Control Services),否则直通时设备可能无法正确分组,如果设备分组不理想,后面需要额外打补丁或换主板,行业共识认为这是最让人头疼的坑。
宿主系统与虚拟机配置
宿主机操作系统需要支持IOMMU,以Linux为例,内核启动参数里要加上intel_iommu=on或amd_iommu=on,并配置iommu=pt提升性能,Windows宿主机则依赖Hyper-V的“离散设备分配”(DDA)功能,步骤更复杂,日常折腾服务器时很少用。
虚拟机要使用Q35主板芯片组,不要用i440fx,Q35才支持PCIe直通,老芯片组只有PCI总线,很多设备无法识别,虚拟机系统最好是Windows 10以上或较新的Linux发行版,老系统对直通设备驱动的兼容性很差。
需要直通的设备类型
不是所有设备都能无缝直通,显卡、网卡、硬盘控制器、USB控制器是常见目标,但声卡和部分入门级显卡容易出中断冲突,导致宿主机死机,业内专家指出,直通最好从网卡或硬盘控制器开始练手,成功率远高于显卡。
确认IOMMU分组
在Linux宿主机上执行:
find /sys/kernel/iommu_groups/ -type l
查看每个设备是否单独在一个组里,如果同一组包含多个设备,且你要直通其中一个,那么整组设备都必须隔离给虚拟机,这一步经常被忽略,结果虚拟机启动后设备报错,根本原因就是分组没理清。
PVE PCIe直通显卡教程:从命令行到配置文件的完整路径
Proxmox VE(PVE)是目前最流行的虚拟化平台之一,底层基于KVM,以下操作在PVE 7.x和8.x版本上验证过,核心逻辑一致。
开启IOMMU并加载内核模块
编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX_DEFAULT,添加:
intel_iommu=on iommu=pt
如果CPU是AMD,则改为amd_iommu=on,然后运行update-grub重启。
重启后,加载必要的内核模块:
modprobe vfio modprobe vfio_iommu_type1 modprobe vfio_pci
为了永久生效,在/etc/modules里加入这三行,注意,某些PVE版本自带vfio相关模块,但还是要确认加载状态,否则后续直通时报“设备忙”。
查找设备ID并隔离显卡
先查看显卡的PCI地址和厂商ID:
lspci -nn | grep -i nvidia
输出类似10de:2206这种格式,前者是厂商ID,后者是设备ID,把这两个ID绑定到vfio-pci驱动,编辑/etc/modprobe.d/vfio.conf:
options vfio-pci ids=10de:2206,10de:1aeb
如果显卡有HDMI音频功能,需要把音频设备的ID也加进去,否则直通后GPU能显示但没声音。
为虚拟机添加PCIe设备
在PVE的Web界面中,进入虚拟机的“硬件”选项卡,点击“添加”,选择“PCI设备”,注意勾选“PCI-Express”,否则设备会被降级到PCI模式,直通显卡时,建议勾选“主GPU”,但PVE的显示输出仍然需要保留一个虚拟VGA,或者改为SPICE显示模式,否则虚拟机黑屏。
如果真的在命令行操作,编辑虚拟机配置文件/etc/pve/qemu-server/<VMID>.conf,添加:
hostpci0: 0000:01:00.0,pcie=1
0000:01:00.0是显卡的PCI地址,保存后启动虚拟机,进入系统后安装对应驱动即可,如果直通的是NVIDIA显卡,在PVE下需要隐藏KVM标志,否则驱动报错43。
ESXi和KVM的PCIe直通差异,以及虚拟机网卡直通性能损失
不同虚拟化平台的直通逻辑大同小异,但操作路径差异明显,很多人会在PVE和ESXi之间做选择,这里对比一下。
ESXi直通硬盘的图形化操作
VMware ESXi的直通配置集中在Web Client里,登录后,进入“主机” -> “管理” -> “硬件” -> “PCI设备”,点击“支持直通”,但麻烦在于,ESXi默认不会把所有设备标记为可直通,需要先重启开启IOMMU。
直通硬盘控制器时,先在“存储”中确认控制器型号,然后标记为直通,再创建一个虚拟机,在虚拟机的“编辑设置”中添加“PCI设备”并选择刚标记的控制器,ESXi的图形化做得比PVE简单,但限制也多部分板载SATA控制器无法直通,反而添加一张独立HBA卡会更稳定。
直通网卡与虚拟网卡的性能差距
虚拟机网卡直通性能损失问题,是很多企业纠结的点,直通网卡意味着虚拟机独占物理网卡,绕过虚拟交换机,延迟可降低到接近物理机水平,据统计,在DPDK场景下,直通网卡吞吐量比virtio虚拟网卡高出约10%-20%,延迟低30%以上。
但直通也有代价:物理网卡一旦分配给虚拟机,宿主机就无法用它管理网络,只能依赖另一块网卡,目前多数场景下,多队列virtio网卡已经能满足99%的业务需求,除非是云计算边缘节点或核心网元,否则不建议为了性能强行直通网卡。
PCIe穿透故障排查:先看IOMMU分组,再查中断冲突
直通失败时,不要急着怀疑设备坏了,按顺序排查,大部分问题出在配置细节上。
常见错误与对应解法
- 设备在宿主机上被占用:执行
lspci -nnk,查看设备使用的内核驱动,如果是nvidia或i915,说明驱动没被屏蔽,需要在/etc/modprobe.d/里加入blacklist清单,同时设置vfio-pci的ID。 - 虚拟机启动报“Error: Failed to setup memory”:内存大页配置不正确,对直通设备,PVE要求关闭内存共享,并分配固定内存,不能使用“热插拔”或“Ballooning”。
- 开机后虚拟机直接重启循环:最常见的是MSI中断冲突,对于显卡直通,把声卡设备从同一个IOMMU组中分离出来,或者改用旧版PCI模式,能解决相当一部分问题。
- Windows系统内显示代码43
:NVIDIA驱动检测到虚拟机环境,主动禁用GPU,需要配置
hv-vendor-id为任意自定义ID,同时隐藏KVM状态,具体参数为cpu: host,hidden=1,flags=+pcid。
对于IOMMU分组不正确的情况,一个土办法是尝试在BIOS中关闭CSM,改用UEFI启动,分组往往更干净,如果主板支持ACS override补丁,也可以给内核添加pcie_acs_override=downstream参数,但这有风险,只推荐实验环境使用。
虚拟机PCIe穿透相关问题解答
问:虚拟机PCIe穿透和SR-IOV有什么区别?
PCIe穿透是把完整物理设备独占给一台虚拟机,其他虚拟机完全看不到这块设备,SR-IOV则是把物理设备切成多个虚拟功能(VF),每个VF都能单独分配给不同虚拟机,穿透配置简单,但灵活性差;SR-IOV支持共享,却依赖设备硬件支持,如果只是给一台虚拟机用,穿透更容易;如果要多台虚拟机共享网卡或存储,SR-IOV是更合理的选择。
问:pve pcie直通显卡教程里的“主GPU”选项到底要不要勾?
这取决于你的宿主机有没有独立显卡作为显示输出,如果宿主机本身用集成显卡跑PVE管理界面,而直通显卡专门给虚拟机打游戏或跑AI,那么不勾“主GPU”也行,只需要保持虚拟机显示为SPICE或虚拟VGA,如果宿主机没有其他显示输出,需要把直通显卡设为宿主机主GPU,但这样会导致PVE后台界面丢失,操作时要提前配置好网络访问。
问:直通硬盘后虚拟机性能真的能跑满吗?
接近跑满,但并非无损耗,直通SATA控制器后,磁盘延迟和吞吐量基本等同物理机,但ACA和缓存策略仍受制于虚拟化层,值得留意的是,直通硬盘后虚拟机无法使用快照功能,迁移也只能整机迁移,运维灵活性大幅下降,如果追求性能且需要快照,不如换用支持SR-IOV的NVMe控制器或开启PCIe NVMe直通,后者性能提升显著,代价是需要额外硬件支持。
PCIe穿透是一条“非对称”的优化路径:它用牺牲宿主机灵活性的方式,换来了虚拟机的极致性能,只要事先把IOMMU分组、设备隔离和中断处理这三件事想清楚,操作过程并不复杂,遇到失败时,回到硬件配置层面逐项排查,比盲目改参数更有效。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/614307.html





