Contents

Proxmox核显开启SR-IOV直通给Win11虚拟机

环境信息

  • CPU: i5-12500T (核显UHD770)
  • PVE:8.2.2
  • Kernel: 6.8.4

BIOS设置

  • 开启VT-d
  • 开启VT-x
  • 开启IOMMU
  • 开启SR-IOV

调整内核

因为需要编译i915-sriov-dkms 这个内核相关的项目

在不同的内核编译会出现兼容性问题

比如我试过6.2.16、6.8.4、6.5.13-5、6.5.13-3

最后在6.5.13-3内核上成功编译安装了i915-sriov-dkms项目

查看当前安装的内核

root@pve:~# proxmox-boot-tool kernel list
Manually selected kernels:
None.

Automatically selected kernels:
6.5.13-3-pve
6.8.4-3-pve

Pinned kernel:
6.5.13-3-pve

6.8.4是升级pve到8.2.2版本后自动安装,参考i915-sriov-dkms项目的readme文件是明确不支持6.8的内核的,所以需要安装低版本的内核并启动,相同硬件环境的可以直接安装6.5.13-3内核,避免重蹈覆辙。

安装6.5.13-3版本内核

root@pve:~# apt install proxmox-kernel-6.5.13-3-pve

移除不需要的内核版本

root@pve:~# apt purge proxmox-kernel-6.x.x-x-pve

锁定内核版本

root@pve:~# proxmox-boot-tool kernel pin 6.5.13-3-pve

设置grub,开机的时候自动选择6.5.13-3内核

需要先重启看下,在Grub选择界面,选择Advanced Options for xxx

记录下 6.5.13-3 内核在 列表的第几项,如何说我的环境是: 因此需要的启动项处于列表的第2项(从0开始)

  • 6.8.4
  • 6.8.4 recovery
  • 6.5.13
  • 6.5.13 recovery

修改/etc/default/grub配置

root@pve:~# vim /etc/default/grub

GRUB_DEFAULT=0注释掉,并添加GRUB_DEFAULT="1>2", 1代表选择Advanced Options, 2代表选择 6.5.13-3 内核

更新grub配置

root@pve:~# update-grub

重启系统

root@pve:~# reboot

重启完成后查看当前内核版本

root@pve:~# uname -r
6.5.13-3-pve

安装i915-sriov-dkms

安装编译工具

apt update
apt install build-*
apt install git pve-headers mokutil
apt install pve-headers-$(uname -r)

清理上次编译失败的产生的文件

rm -rf /var/lib/dkms/i915-sriov-dkms*
rm -rf /usr/src/i915-sriov-dkms*
rm -rf ~/i915-sriov-dkms

设置变量 便于后续命令使用

KERNEL=$(uname -r); KERNEL=${KERNEL%-pve}

clone和配置i915-sriov-dkms项目

cd ~
git clone https://github.com/strongtz/i915-sriov-dkms.git
cd ~/i915-sriov-dkms
cp -a ~/i915-sriov-dkms/dkms.conf{,.bak}
sed -i 's/"@_PKGBASE@"/"i915-sriov-dkms"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/"@PKGVER@"/"'"$KERNEL"'"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/ -j$(nproc)//g' ~/i915-sriov-dkms/dkms.conf
cat ~/i915-sriov-dkms/dkms.conf

编译和安装

apt install --reinstall dkms -y
dkms add .
cd /usr/src/i915-sriov-dkms-$KERNEL
dkms status

dkms install -m i915-sriov-dkms -v $KERNEL -k $(uname -r) --force -j 1
dkms status

设置grub启动参数

cp -a /etc/default/grub{,.bak}
sudo sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7"' /etc/default/grub
update-grub
update-initramfs -u -k all
apt install sysfsutils -y

配置vGPU

安装工具

apt install sysfsutils -y

查看核显pci路径

root@pve:~# lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770]

编辑sysfs配置,开启vGPU拆分, 7代表将一个物理GPU拆分成7个vGPU

echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
cat /etc/sysfs.conf

reboot

查看是否拆分成功

root@pve:~# lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.3 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.4 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.5 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.6 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)
00:02.7 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 770] (rev 0c)

Win10虚拟机

创建win10虚拟机和平时的一样:

/pve-sr-iov/win-11-configure.png
0

需要注意的是:

  • CPU的类型一定要选 host,否在在虚拟机内部会驱动异常
  • Display不用选none,用VirtIO-GPU可以在pve看到windows画面,不像独立显卡直通Display必须选none
  • 选择直通的vGPU时,不要选-0的那个,不要勾选所有功能
    /pve-sr-iov/vgpu-select.png
    1
    /pve-sr-iov/vgpu-add.png
    2
  • Windows 安装完成后需要安装完整的VirtIO驱动
    /pve-sr-iov/virtio-install.png
    3
  • 安装intel显卡驱动Arc Graphics Driver

成功驱动后可以在任务管理看到gpu的监控:

/pve-sr-iov/win-11-gpu-monitor.png
4

参考

PVE-Intel-vGPU i915-sriov-dkms