PVE8开启IOMMU硬件直通功能直通核显

发布员1号 发布于 2023-08-27 1763 次阅读


1、进入SHELL命令窗口下

nano /etc/default/grub
#修改行
“GRUB_CMDLINE_LINUX_DEFAULT="quiet",
#使其为
“GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off",

如果是amd cpu请改为: 

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt video=efifb:off,vesafb:off",

如果是直通网卡,直通PCI网卡以后,PCI网卡上面的各个网口不能单独直通,下述代码可以实现单独的网口直通

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream"

2、更新grud

update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.2.16-3-pve
Found initrd image: /boot/initrd.img-6.2.16-3-pve
Found memtest86+x64 image: /boot/memtest86+x64.bin
done

3、新增模块。修改文件/etc/modules,加入如下的行

nano /etc/modules
#内容为
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
#网卡直通相关的用下面这套
vfio
vfio_iommu_type1
vfio_pcioptions
vfio_virqfd

上述就完成了PVE层的PCI直通设置,加下来我们将PVE系统禁止加载显卡驱动,目的是不与需要显卡直通的虚拟机冲突争夺HDMI通道,找到这个路径/etc/modprobe.d/pve-blacklist.conf添加一下

nano /etc/modprobe.d/pve-blacklist.conf
#内容如下
#Intel核显
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915
#N卡
blacklist radeon
blacklist nouveau
blacklist nvidia
N卡还需要加入下面的配置到kvm.conf(据老外说是避免一些莫名其妙的错误):
echo “options kvm ignore_msrs=1” > /etc/modprobe.d/kvm.conf

其他参数

# 允许不安全的中断
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
 
# 忽略异常,防止虚拟机异常导致宿主机崩溃
#   ignore_msrs             :   忽略异常
#   report_ignored_msrs     :   是否报告异常
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

输入命令 lspci -nn|grep  Graphics,查找所有PCI总线的所有设备的供应商ID和设备ID

找到显卡的设备ID(如:[8086:591d])并复制

lspci -nn|grep  Graphics
#显示内容如下
00:02.0 Display controller [0380]: Intel Corporation HD Graphics P630 [8086:591d] (rev 04)

找到目录 /etc/modprobe.d/ 并在目录下新建一个vfio.conf的文件

在内容里面填入

举例:options vfio-pci ids=设备ID,设备ID

#创建并编辑
nano /etc/modprobe.d/vfio.conf
options vfio-pci ids=8086:591d

完成上面的配置文件修改后, 输入命令让系统更新配置

update-initramfs -u
#或者是下面的命令来更新initramfs
update-initramfs -u -k all

执行后可能会出现以下提示

update-initramfs: Generating /boot/initrd.img-6.5.11-7-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
System booted in EFI-mode but 'grub-efi-amd64' meta-package not installed!
Install 'grub-efi-amd64' to get updates.
#按提示安装grub-efi-amd64
apt install grub-efi-amd64

重启系统后再次更新配置可能会出现以下提示

update-initramfs: Generating /boot/initrd.img-6.5.11-7-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.

4、重启系统生效

reboot

重启的过程中,我们观察一下主机输出的HDMID显示,如果看上去卡着不动,无法进入到PVE 的登陆命令行界面,表示你禁用显卡成功了, 可以继续下面的操作,如果会显示输入命令行的界面,那就表示没有成功禁用显卡,还需要回炉重来。

PVE重启后,我们来验证一下PVE层的显卡直通是否已经开启

lsmod | grep vfio

如果出现回调这样类似的信息,表示成功了

vfio_pci               16384  0
vfio_pci_core          86016  1 vfio_pci
irqbypass              12288  2 vfio_pci_core,kvm
vfio_iommu_type1       49152  0
vfio                   57344  3 vfio_pci_core,vfio_iommu_type1,vfio_pci
iommufd                77824  1 vfio

查看GPU设备ID:

lspci -nn|grep Graphics

类似的回显:

00:02.0 Display controller [0380]: Intel Corporation HD Graphics P630 [8086:591d] (rev 04)

再执行下面的命令:

lspci -vvv -s 00:02.0

看有没有Kernel driver in use这一行,正常情况下应该是没有的。

如果有那么就说明你之前肯定是哪里没配置好(一般是i915的驱动没屏蔽成功)。


题外话:

查看核显以及声卡的供应商和设备ID:

lspci -n | grep -E “0300|0403”

回显如下:

00:02.0 0300: 8086:5a85 (rev 0b)
00:0e.0 0403: 8086:5a98 (rev 0b)

其中“8086:5a85”和“8086:5a98”分别就是核显和声卡的供应商ID和设备ID,把它们绑定到vifo模块:

echo “options vfio-pci ids=8086:5a85,8086:5a98” > /etc/modprobe.d/vfio.conf

5、可以在PVE WEB界面添加需要直通的PCI设备了。