PVE下直通PCI设备通用教程
根据黑苹果屋教程整理
配置文件修改前请先将原配置文件备份
| cp /*/*/***.* /*/*/***.*.bak |
一、BIOS设置
| 启用 VT-d |
| 禁用 CSM |
| ACS Enable |
| 启用 4G解码 4G Decoding |
| 禁用 Resizable BAR/Smart Access Memory智能访问内存 |
| 启用 IOMMU |
| 将主显示器设置为 CPU/iGPU |
| 预分配内存为 64M |
二、忽略错误
忽略 dmesg 输出中的一些烦人的错误,这一步对于直通来说不是必需的,但有助于保持干净.
| nano /etc/modprobe.d/kvm.conf |
| options kvm ignore_msrs=Y report_ignored_msrs=0 |
| |
三、启动内核IOMMU支持
IOMMU(Input-Output Memory Management Unit)是一种硬件功能,用于管理设备对系统内存的访问。启用 IOMMU 后,可以在虚拟机中直接访问物理设备,并允许虚拟机独立于主机操作系统运行
| nano /etc/default/grub |
| |
| GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf" |
| |
| GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf" |
| |
| GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 video=efifb:off" |
| GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off" |
| GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction" |
| GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction" |
| |
| 1.iommu=pt:启用 Intel VT-d 或 AMD-Vi 的 IOMMU。这是一种硬件功能,用于管理设备对系统内存的访问。在虚拟化环境中,启用 IOMMU 后,可以将物理设备直通到虚拟机中,以便虚拟机可以直接访问硬件设备。“iommu=pt”不是必须的,PT模式只在必要的时候开启设备的IOMMU转换,可以提高未直通设备PCIe的性能,建议添加。 |
| 2.initcall_blacklist=sysfb_init:禁用 sysfb_init 内核初始化函数。这个函数通常用于在内核启动过程中初始化系统帧缓冲。在使用 GPU 直通的情况下,这个函数可能会干扰直通操作,因此需要禁用它。 |
| 3.i915.enable_gvt=1:启用 Intel GVT-g 虚拟 GPU 技术。这个选项用于创建一个虚拟的 Intel GPU 设备,以便多个虚拟机可以共享物理 GPU 设备。启用 GVT-g 需要在支持虚拟 GPU 的 Intel CPU 和主板上运行,并且需要正确配置内核和虚拟机。想开启GVT-g的就添加这条,显卡直通的就不要添加了。 |
| 4.initcall_blacklist=sysfb_init:屏蔽掉pve7.2以上的一个bug,方便启动时候就屏蔽核显等设备驱动; |
| 5.pcie_acs_override=downstream,multifunction:便于iommu每个设备单独分组,以免直通导致物理机卡死等问题 |
| 6.pci=nommconf:意思是禁用pci配置空间的内存映射,所有的 PCI 设备都有一个描述该设备的区域(您可以看到lspci -vv),访问该区域的最初方法是通过 I/O 端口,而 PCIe 允许将此空间映射到内存以便更简单地访问。 |
参数 |
解释说明 |
quiet |
默认参数,表示在启动过程中只显示重要信息 |
intel_iommu=on |
用 intel_iommu 驱动来驱动 IOMMU 硬件单元 |
amd_iommu=on |
用 amd_iommu 驱动来驱动 IOMMU 硬件单元 |
iommu=pt |
只为使用透传功能的设备启用 IOMMU,并可以提供更好的功能和性能 |
pci=assign-busses |
部分网卡开启 SR-IOV 需要这个参数,否则可能报错 |
PCIe_acs_override=downstream |
用于将 iommu groups 拆分,方便灵活按需直通一些板载的设备 |
PCIe_acs_override=multifunction |
PCIe 直通多功能支持,提高直通完美度(可选) |
nofb |
该选项允许你不用一个frame缓冲来使用图形安装程序 |
textonly |
仅在文本模式下支持 GRUB 串行控制台 |
nomodeset |
系统启动过程中,暂时不运行图像驱动程序 |
video=vesafb:off |
禁用 vesa 启动显示设备 |
video=efifb:off |
禁用 efi 启动显示设备 |
video=simplefb:off |
5.15 内核开始直通可能需要这个参数 |
initcall_blacklist=sysfb_init |
部分 A 卡如 RX580 直通异常可能需要这个参数 |
pcie_aspm=off |
关闭 PCIe 设备的 ASPM 节能模式,解决部分 PCIe 设备 AER 报错 |
pcie_aspm=force |
强制 PCIe 设备及爱情 ASPM 节能模式,解决部分 PCIe 设备 AER 报错 |
pci=noaer |
不输出 AER 报错日志,华南主板经常会 AER 报错,建议配合使用,眼不见心不烦 |
pci=nomsi |
在系统范围内禁用 MSI 中断,主要还是解决 PCIe 相关的报错 |
四、更新grub,并重启
五、重启后,验证是否开启iommu
| dmesg | grep -e DMAR -e IOMMU -e AMD-Vi |
| # 如果没有输出,则说明有问题。你应该看到这样的东西;“DMAR: IOMMU enabled” |
| # 另外一种验证方式 |
| dmesg | grep iommu |
| # 出现如下例子。则代表成功 |
| [ 1.341100] pci 0000:00:00.0: Adding to iommu group 0 |
| [ 1.341116] pci 0000:00:01.0: Adding to iommu group 1 |
| [ 1.341126] pci 0000:00:02.0: Adding to iommu group 2 |
| [ 1.341137] pci 0000:00:14.0: Adding to iommu group 3 |
| [ 1.341146] pci 0000:00:17.0: Adding to iommu group 4 |
| # 此时输入命令 |
| find /sys/kernel/iommu_groups/ -type l |
| # 出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启 |
六、验证是否 启用IOMMU中断重映射 (与其它教程结合)
| dmesg | grep remapping |
| |
| [ 0.175675] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. |
| [ 0.177198] DMAR-IR: Enabled IRQ remapping in x2apic mode |
| |
| AMD-Vi: Interrupt remapping enabled |
| |
| |
| |
| |
| nano /etc/modprobe.d/iommu_unsafe_interrupts.conf |
| options vfio_iommu_type1 allow_unsafe_interrupts=1 |
七、启用必要的内核模块
| nano /etc/modules |
| vfio |
| vfio_iommu_type1 |
| vfio_pci |
| vfio_virqfd |
八、更改任何相关模块后,需刷新initramfs
| update-initramfs -u -k all |
九、检查是否已启用重新映射
| dmesg | grep remapping |
| “AMD-Vi: Interrupt remapping enabled” |
| “DMAR-IR: Enabled IRQ remapping in x2apic mode” |
| |
| |
| dmesg | grep remapping |
| |
| [ 0.175675] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. |
| [ 0.177198] DMAR-IR: Enabled IRQ remapping in x2apic mode |
| |
| AMD-Vi: Interrupt remapping enabled |
| |
十、驱动程序模块列入黑名单,以使虚拟机能够完全访问显卡等
| nano /etc/modprobe.d/pve-blacklist.conf |
| |
| blacklist nvidiafb |
| blacklist nouveau |
| blacklist nvidia |
| |
| |
| blacklist amdgpu |
| blacklist radeon |
| |
| |
| blacklist snd_hda_codec_hdmi |
| blacklist snd_hda_intel |
| blacklist snd_hda_codec |
| blacklist snd_hda_core |
| blacklist i915 |
| |
| |
| options vfio_iommu_type1 allow_unsafe_interrupts=1 |
| |
十一、找到您的 PCI 设备对应的 ID
| lspci -nn | grep -i “device” |
| |
| |
| |
| “0x:00.x VGA compatible controller … [1234:5678]” |
| “0x.00.x Audio Device … [1234:5678]” |
| “0x.00.x USB controller … [1234:5678]” |
十二、将主机的PCI设备ID绑定到vifo模块,并重启。
| nano /etc/modprobe.d/vfio-pci.conf |
| |
| |
| options vfio-pci ids=1234:5678,1234:5678 disable_vga=1 |
| |
| |
| rbboot |
十三、直通显卡一些注意事项
| |
| 这些复选框因卡而异,可能需要测试适合您的选项。 |
| 有些卡还需要转储显卡的.rom文件才能工作。要实现这一点,您必须使用现有的一些指南,从您的特定卡中自行转储显卡的rom文件。我们将来可能会为此添加一个指南。 |
| 独立显卡的rom下载地址https://www.techpowerup.com/vgabios |
| |
十四、挂载显卡rom方式操作
- 设备只有核显:大部分情况会出现核显直通后,即使驱动了显卡,显示信号的HDMI、DP、DVI等接口无法正常输出画面,但是也有部分电脑可以通过加载显卡的rom来实现显示信号的输出,提取rom并加载的一些方式,后续在更新对应的教程
- 设备只有独立显卡(或双独立显卡):直通后需要通过加载显卡的rom后,可实现显示信号输出,显卡信号输出正常工作.独立显卡的rom可以通过https://www.techpowerup.com/vgabios下载自己对应的型号,下载的时候需要对应显卡型号、厂商信息、显卡BIOS版本日期等信息,至于这些信息如何查看,下面的内容会介绍
- 设备核显与独立显卡同时具备:直通独立显卡一般不用加载显卡的rom,但这也不是绝对的,直通核显同样需要加载显卡的rom,不然也会出现接口无法正常输出画面的情况
- 设备有两张以上独立显卡或同时具备两张显卡:通常PCIE通道的第一张独立显卡需要加载显卡的rom,才能直通。第二张之后的独立显卡因为启动PVE系统的时候不会占用到,所以第二张之后的独立显卡不用添加rom也可以实现直通,添加了rom后反而会直通不成功。
-
获取显卡rom
-
- 在winPE环境下:您需要使用U盘制作winPE的启动盘,在winPE下使用Aida64.exe工具,可以通过显卡的BIOS版本日期、显存大小来查看这些信息.下载对应的显卡rom
- 获得显卡的信息,进入下载https://www.techpowerup.com/vgabios
-
使用GPU-Z后,界面上显示的“bios 版本”(英文版的叫“bios vision”),这一行最右边有一个小图标,点击一下,会出现菜单选项,选“保存至文件”就可以了。如果保存下来的是“*.bin”格式的文件,也是可以直接用的
-
将获取到的显卡rom上传到PVE的指定目录中(PVE开机状态),上传路径:/usr/share/kvm
-
在虚拟机硬件中添加直通显卡,然后再虚拟机的配置文件中添加显卡rom的加载
| nano /etc/pve/qemu-server/"VMID".conf |
| |
| |
| hostpci0: “0x:00”,pcie=1,x-vga=1 |
| |
| |
| |
| ,romfile=amd580.rom |
| |
| reboot |
-
在虚拟机”硬件“里高显示设置为”无“,或修改配置文件。
| nano /etc/pve/qemu-server/”VMID”.conf |
| # VMID = 例如 100、101、102 等 |
| # 请注意,将“显示”设置为“无”(vga:无)会导致控制台/noVNC 被禁用 - “任务错误:无法运行 vncproxy”。 |
| # 如有必要,恢复到 vmware。 |
| vga: none |
| # vga: vmware |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)