PVE PCIe 直通与 GPU 虚拟化完全指南

PVE PCIe 直通与 GPU 虚拟化完全指南 本文详解 PVE 8.x 环境下 PCI 设备直通技术,涵盖 IOMMU 配置、显卡直通、驱动屏蔽等核心内容,帮助读者实现显卡、网卡等硬件设备直通给虚拟机使用。 什么是 PCIe 直通 PCIe 直通(PCI Passthrough)是一种虚拟化技术

PVE PCIe 直通与 GPU 虚拟化完全指南

本文详解 PVE 8.x 环境下 PCI 设备直通技术,涵盖 IOMMU 配置、显卡直通、驱动屏蔽等核心内容,帮助读者实现显卡、网卡等硬件设备直通给虚拟机使用。

什么是 PCIe 直通

PCIe 直通(PCI Passthrough)是一种虚拟化技术,允许将物理 PCI 设备直接分配给虚拟机使用。直通后,虚拟机可以直接操作硬件,性能接近物理机水平。

适用场景

  • GPU 直通(游戏、AI 计算、视频转码)
  • 网卡直通(高性能网络、SR-IOV)
  • USB 控制器直通(USB 设备稳定性)
  • 存储控制器直通(硬盘性能优化)

IOMMU 基础配置

检查硬件支持

首先确认 CPU 和主板支持 IOMMU/VT-d:

# Intel 平台
dmesg | grep -e DMAR -e IOMMU

# AMD 平台
dmesg | grep AMD-Vi

内核参数配置

传统 GRUB 引导

编辑 /etc/default/grub

# Intel 平台
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream"

# AMD 平台  
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream"

更新引导:

update-grub
update-grub2

UEFI (systemd-boot) 引导

编辑 /etc/kernel/cmdline

# 推荐配置(Intel)
echo 'quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf' > /etc/kernel/cmdline

# 应用配置
pve-efiboot-tool refresh

参数说明

  • intel_iommu=on / amd_iommu=on:启用 IOMMU
  • iommu=pt:直通模式,提高性能
  • pcie_acs_override=downstream:拆分 IOMMU 分组
  • initcall_blacklist=sysfb_init:解决某些显卡问题
  • video=efifb:off:禁用 EFI 帧缓冲(显卡直通必需)

加载 VFIO 模块

编辑 /etc/modules,添加以下内容:

vfio
vfio_pci
vfio_virqfd
vfio_iommu_type1

验证模块加载:

dmesg | grep remapping
# 成功输出示例:
# DMAR-IR: Enabled IRQ remapping in x2apic mode
# AMD-Vi: Interrupt remapping enabled

驱动屏蔽配置

为确保直通设备在 Host 上不被占用,需要屏蔽相关驱动。

创建黑名单配置

编辑 /etc/modprobe.d/pve-blacklist.conf

# Nvidia 显卡
blacklist nvidiafb
blacklist nouveau
blacklist nvidia

# AMD 显卡
blacklist amdgpu
blacklist radeon

# Intel 核显
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core

启用不安全中断

某些设备需要允许不安全中断:

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

更新 initramfs

update-initramfs -u -k all

显卡直通实战

查询显卡信息

# 查看所有 PCI 设备
lspci

# 查看显卡详细信息
lspci -v | grep NVIDIA

# 查看设备 ID
lspci -n -s 04:00.0
# 输出示例:04:00.0 0300: 10de:0fc6 (rev a1)

PVE 8.x 直通步骤

PVE 8.0+ 版本大幅简化了直通流程,不再需要手动编辑配置文件:

  1. Web 界面操作

    • 进入虚拟机硬件配置
    • 点击 "添加" -> "PCI 设备"
    • 选择目标显卡
    • 勾选:
      • ☑️ 所有功能(直通同组所有设备)
      • ☑️ ROM-Bar(显卡显示输出必需)
      • ☑️ PCI-Express
      • ☑️ 主 GPU(虚拟机主显示输出)
  2. 安装驱动

    • 通过远程桌面/串口进入虚拟机
    • 安装显卡官方驱动
    • 重启虚拟机
  3. 验证直通

    # 虚拟机内执行
    nvidia-smi
    # 或
    lspci | grep VGA
    

传统配置方式(PVE 7.x 及更早)

如需手动配置设备 ID:

# 创建 VFIO 配置
echo "options vfio-pci ids=10de:0fc6 disable_vga=1" > /etc/modprobe.d/vfio-pci.conf

# 编辑虚拟机配置
vim /etc/pve/qemu-server/100.conf

# 添加以下配置
hostpci0: 0000:04:00,pcie=1
machine: q35
cpu: host,hidden=1,flags=+pcid
args: -cpu 'host,+pdpe1gb,+kvm_pv_unhalt,+kvm_pv_eoi,hv_spinlocks=0x1fff,hv_vapic,hv_time,hv_reset,hv_vpindex,hv_runtime,hv_relaxed,hv_synic,hv_stimer,kvm=off,hv_vendor_id=whatever' -machine q35,kernel_irqchip=on
vga: std

Resource Mappings 配置

PVE 8.x 引入的 Resource Mappings 功能简化了设备管理:

  1. 进入 数据中心 -> Resource Mappings
  2. 点击 添加-
  3. 选择要映射的设备
  4. 设置权限(哪些用户/组可以使用)

虚拟机中使用:

  1. 添加硬件 -> PCI 设备
  2. 选择 "Mapped Device"
  3. 从列表中选择预配置的映射设备

Windows 虚拟机配置

基础配置建议

操作系统:Windows 10/11 / Server 2016/2019/2022

系统设置:
- 机型:Q35(推荐,支持 PCIe 原生)
- BIOS:OVMF (UEFI)
- 显卡:默认(安装完成后再直通)
- SCSI 控制器:VirtIO SCSI

磁盘:
- 总线:SATA 或 SCSI (VirtIO)
- 缓存:直接同步(数据安全)或 回写(性能优先)

CPU:
- 核心数:根据需求配置
- 类型:host(直通 CPU 特性)
- 启用 NUMA:是(多核推荐)

显卡直通特殊处理

GTX 650 等老显卡显示问题

  1. 屏蔽 nouveau 驱动(Host):
echo "blacklist nouveau" > /etc/modprobe.d/disable-nouveau.conf
echo "options nouveau modeset=0" >> /etc/modprobe.d/disable-nouveau.conf
update-initramfs -u -k all
  1. 下载显卡 ROM:

驱动安装流程

  1. 安装 Windows 系统
  2. 安装 VirtIO 驱动(使用 virtio-win ISO)
  3. 配置并启用远程桌面
  4. 直通显卡
  5. 通过远程桌面安装显卡驱动
  6. 重启,完成

常见问题与解决

问题1:直通后虚拟机无法启动

原因:IOMMU 分组问题

解决

# 安装 ACS patch 覆盖
# 编辑 /etc/default/grub,添加:
pcie_acs_override=downstream,multifunction

问题2:显卡代码 43 错误(Nvidia)

原因:Nvidia 驱动检测到虚拟化环境

解决:在虚拟机配置中添加隐藏虚拟化标志:

cpu: host,hidden=1,flags=+pcid
args: -cpu host,kvm=off,hv_vendor_id=proxmox

问题3:直通后显示器无信号

排查步骤

  1. 确认 ROM-Bar 已勾选
  2. 确认显卡 ROM 正确(必要时手动指定)
  3. 确认主 GPU 已勾选
  4. 检查显示器连接的是直通显卡接口

问题4:音频无法输出

解决

  1. 直通显卡时勾选 "所有功能"(会自动包含音频设备)
  2. 或在 PCI 设备中单独添加显卡音频控制器

性能优化建议

  1. CPU 亲和性:将虚拟机绑定到特定 NUMA 节点
  2. 大页内存:启用 HugePages 减少 TLB miss
  3. CPU 隔离:使用 isolcpus 隔离专用核心
  4. 设备分组优化:合理规划 IOMMU 分组

小结

PCIe 直通是 PVE 高级功能,可以显著提升虚拟机硬件性能:

  1. 准备工作:启用 IOMMU、加载 VFIO 模块
  2. 驱动屏蔽:防止 Host 占用直通设备
  3. 直通配置:Web 界面操作(PVE 8.x)或手动配置
  4. 虚拟机设置:选择合适的机型和 BIOS 类型

通过合理的直通配置,可以在虚拟机中实现接近物理机的显卡、网卡性能。


参考资料

Comment