PVE开启IOMMU与硬件直通

moonjerx
2025-03-26 / 0 评论 / 26 阅读 / 正在检测是否收录...

硬件直通准备

1. 确认主板支持

  • 主板BIOS/UEFI设置

    • 启用 VT-d(Intel CPU)AMD-V(AMD CPU)
    • 禁用 CSM(仅限i440机型,需确保其他设置为UEFI模式)。
    • ACS Enable(若存在,需启用,自动模式无效)。
    • 启用 4G解码(4G Decoding)
    • 禁用 Resizable BAR/Smart Access Memory(AMD GPU直通时避免“代码43错误”)。
    • 启用 IOMMU(AMD主板需特别注意)。
    • 主显示器设置为CPU/iGPU(若CPU集成显卡)。
    • 预分配内存64M

启用IOMMU

2. 配置内核参数

编辑 /etc/default/grub 文件,修改 GRUB_CMDLINE_LINUX_DEFAULT 行:

Intel CPU:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf"

AMD CPU:

GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf"

其他可选配置:

# GVT-g模式(共享显卡)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 video=efifb:off"

# 独占模式(无PVE控制台输出)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off"

3. 参数释义

  1. iommu=pt:启用IOMMU,PT模式优化未直通设备性能。
  2. initcall_blacklist=sysfb_init:解决PVE 7.2+的核显驱动冲突。
  3. i915.enable_gvt=1:启用Intel GVT-g虚拟显卡技术(需支持的CPU)。
  4. pcie_acs_override=downstream:拆分IOMMU组,避免直通导致物理机崩溃。
  5. pci=nommconf:禁用PCI配置空间的内存映射,提升稳定性。

4. 更新GRUB并重启

# 更新引导配置
proxmox-boot-tool refresh
# 或
update-grub

# 重启系统
reboot

5. 验证IOMMU启用

# 检查IOMMU状态
dmesg | grep -e DMAR -e IOMMU
# 成功示例:
# [    0.000000] DMAR: IOMMU enabled

# 验证IOMMU组
find /sys/kernel/iommu_groups/ -type l

# 检查中断重映射
dmesg | grep remapping
# 成功示例(Intel):
# [    0.175675] DMAR-IR: Enabled IRQ remapping in x2apic mode
# 成功示例(AMD):
# AMD-Vi: Interrupt remapping enabled

显卡直通配置

1. 屏蔽显卡驱动

编辑 /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
blacklist i915

2. 忽略显卡警告(NVIDIA专属)

编辑 /etc/modprobe.d/kvm.conf

options kvm ignore_msrs=1 report_ignored_msrs=0

3. 配置VFIO

获取设备ID:

# 查找显卡及音频设备ID
lspci -nn | grep VGA
lspci -n -s <设备地址>

配置vfio-pci:

编辑 /etc/modprobe.d/vfio-pci.conf

options vfio-pci ids=1234:5678,1234:5678 disable_vga=1
# 替换为实际设备ID,多个ID用逗号分隔

更新内核并重启:

update-initramfs -u
reboot

4. 验证显卡接管

lspci -nnk
# 成功示例:
# Kernel driver in use: vfio-pci

添加显卡到虚拟机

1. 创建虚拟机

  • 系统选项

    • 机型:选择 q35
    • BIOS:选择 OVMF(UEFI)
    • CPU:选择 host 模式。
    • 内存:关闭 Ballooning设备

2. 直通显卡

  • 进入虚拟机管理界面,点击 硬件添加PCI设备
  • 选择目标显卡,勾选:

    • 启用所有功能
    • 主GPU(可选,可能影响启动)。
    • ROM-BarPCI-Express

Intel GVT-g虚拟化核显(Intel 5-10代CPU)

1. 配置GRUB

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 video=efifb:off"

2. 加载内核模块

编辑 /etc/modules

vfio
vfio_iommu_type1
vfio_pci
kvmgt

3. 验证GVT-g

ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
# 成功示例:
# i915-GVTg_V5_1  i915-GVTg_V5_2  ...

注意事项

  • 驱动冲突:确保所有显卡驱动被正确屏蔽。
  • 内核更新:每次内核升级后需重新运行 update-initramfs -u
  • 日志排查:使用 dmesg | tailjournalctl 检查直通失败原因。

额外笔记:

一、开启iommu,打开编辑

nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off"
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
二、加载vfio模块,打开编辑

nano /etc/modules
加上以下内容
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
三、禁用驱动(不同PVE版本可能不同)

nano /etc/modprobe.d/pve-blacklist.conf
加入以下内容:
block AMD driver
blacklist radeon
blacklist amdgpu
block NVIDIA driver
blacklist nouveau
blacklist nvidia
block INTEL driver
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915

# Nvidia
blacklist nvidiafb
blacklist nouveau
blacklist nvidia
 
# AMD
blacklist amdgpu
blacklist radeon
 
# Intel UHD
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core
blacklist i915



四、查询显卡的PCI ID

lspci|grep 570

04:00.0

查看显卡的Device ID

显卡
root@pve:~# lspci -n -s 04:00.0
04:00.0 0300: 1002:67df (rev ef)
声卡
root@pve:~# lspci -n -s 04:00.1
04:00.1 0403: 1002:aaf0
五、编辑vfio

nano /etc/modprobe.d/vfio.conf

将设备加入(两个ID就加两个)
options vfio-pci 1002:67df
options vfio-pci 1002:aaf0
或者:
options vfio-pci ids=1002:67df,1002:aaf0

六、更新grub并重启

update-grub && reboot

dmesg | grep -e DMAR -e IOMMU
从命令行运行  如果没有输出,则说明有问题。
root@pve:~# dmesg | grep -e DMAR -e IOMMU
[    0.141371] DMAR: IOMMU enabled
root@pve:~# dmesg | grep iommu
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-4-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on video=efifb:off
[    0.141295] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-4-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on video=efifb:off
[    0.621854] iommu: Default domain type: Translated
[    0.621854] iommu: DMA domain TLB invalidation policy: lazy mode


更新内核,重启


update-initramfs -u 
reboot
0

评论 (0)

取消

您的IP: