pve 核显直通钩子 实现 vm开机直通关机换给pve- 初步尝试

本文部分内容过期,请查看新版

https://dev.leiyanhui.com/pve/pve-uhd-hook-win-11-1

另外文中没有直通声卡进去,所以虚拟机HDMI也没有声音。 请另外加进去即可

# 目标

pve 桌面环境日用win和macos 偶尔使用。
win1 开机 ,不直通 usb 和 显卡,使用rdp远程桌面操作。
win2 开机 独占显卡 声卡和usb键鼠 以及其他usb设备。 win2关机后 直通的硬件 返给pve.
macos 也是一样(本文目前只有win部分的内容,macos的稍后整理)。

注意 部分cpu/主板 暂时是不能完全支持的。我这里可以正常挂载和自动退还给宿主。但是实际使用存在一下几个问题:

  • 开机画面,Q35模式下没搞定i440fx下可用,但是需要挂载定制主板bios文件,可以和macos直通核显需要的bios文件通用。这个不是大问题。
  • vm开机后,显卡会直通给vm 宿主机桌面的软件都会退出,这个挺不爽的哈。这个后期可以修改ledisbest大佬的脚本来实现,可以考虑把桌面下的所有软件丢到vnc,而后vm模式下可以用vnc继续操作,vm关机后再返给宿主的桌面。暂时留一个坑。
1
2
3
4
5
6
7
> 我的硬件配置 :
- qnct  i7 8850h   
- 技嘉 B150M-PIO-SI R3
- OS: Proxmox VE 8.0.3 x86_64
- Kernel: 6.2.16-3-pve  pve版本8.0.3
- 核显 uhd630 
- 桌面是i3w  桌面管理器本来是用的 xinit,但是发现zhing和ledisbest大佬的脚本不支持,所以干脆先换了lightdm

硬件QNCT 实际测试有几种方案(均不限制win版本和驱动版本)

1、i440fx seaf 实际测试 效果不好,操作有卡顿感,系统更新的时候重启黑屏无法环境 可以有开机画面,winpe之类无驱动模式 可用
2、i440fx ovmf 性能可以 操作流畅 可以有开机画面,winpe之类无驱动模式 可用
3、q35 ovmf 性能可以 操作流畅 暂时没研究明白怎么添加开机画面,pve控制台屏幕可用,winpe之类驱动模式 无法使用。win要安装驱动后才可以点亮直通核显。

关于tpm,可以用win下用bat脚本处理iso文件然后就脱离tpm安装。也可以 q35 ovmf+tpm 安装成功后修改为 i440fx。

后面内容有一部分使用了显卡的rom文件,但是实际测试在我的设备上不需要

# bios的配置

只需要开启 vt-d 即可,gms无要求,可以uefi也可以传统模式启动pve.

# pve安装一个windows

VM ID 是 811 用uefi q35机型,驱动用的 虚拟化驱动用的 virtio-win-0.1.215.iso。参考配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
agent: 1
bios: ovmf
boot: order=virtio0
cores: 12
cpu: host
efidisk0: local:811/vm-811-disk-0.qcow2,efitype=4m,pre-enrolled-keys=1,size=528K
ide0: local:iso/virtio-win-0.1.240.iso,media=cdrom,size=612812K
ide2: local:iso/Win11_22H2_Chinese_Simplified_x64v2.iso,media=cdrom,size=5723780K
machine: pc-q35-8.0
memory: 10240
meta: creation-qemu=8.0.2,ctime=1695825773
net0: virtio=0E:01:BC:9D:02:51,bridge=vmbr0,firewall=1
numa: 1
ostype: win11
scsihw: virtio-scsi-single
smbios1: uuid=37977c80-49d4-49f8-8cda-cc03b4ca2fc6
sockets: 1
tpmstate0: local:811/vm-811-disk-1.raw,size=4M,version=v2.0
virtio0: local:811/vm-811-disk-2.qcow2,cache=unsafe,iothread=1,size=30G
virtio1: local:811/vm-811-disk-3.qcow2,iothread=1,size=64G
vmgenid: 6328352c-225d-4a86-b7ee-643a781aafe0

正常安装,找不到硬盘的时候 加载一下驱动,提示联网的时候,正常跳过: fn + shift + f10 然后终端输入 oobe\bypassnro.cmd 回车重启
装完后 安装驱动 关闭休眠(必须关闭)安装完成后,固定win11的ip(也可以修改计算机名或者路由器里面查看),并打开远程桌面(要先测试确定没问题) 关闭休眠等。

# 复制一个虚拟机

这样可以在不影响811单独启动的情况下 创建一个新的911虚拟机,两个虚拟机磁盘一样 所以不能同时启动。

1
sudo cp /etc/pve/qemu-server/811.conf /etc/pve/qemu-server/911.conf

编辑这个文件 添加三行 args设置 核显直通(vbios_gvt_uefi.rom是非必须的,如果需要可以放到/usr/share/kvm/)和 钩子脚本(后文获取)

1
2
3
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=1 -set device.hostpci0.x-igd-opregion=on
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=vbios_gvt_uefi.rom
hookscript: local:snippets/hooks-igpupt.pl

然后返回pve 网页控制台给911 添加一个usb设备。并设置显示none,机型修改为i440fx。

启动911后 pve 会黑屏。 用另外一个设备比如iphone iSH 连接到pve,运行 qm start 911​ 手动启动并看下能否启动,而后用 远程桌面app 连接到win(可以用win计算机名或者路由器查看ip)

# 最终参考如下
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
agent: 1
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=1 -set device.hostpci0.x-igd-opregion=on
bios: ovmf
boot: order=virtio0
cores: 12
cpu: host
efidisk0: local:811/vm-811-disk-0.qcow2,efitype=4m,pre-enrolled-keys=1,size=528K
hookscript: local:snippets/hooks-igpupt.pl
hostpci0: 0000:00:02.0,legacy-igd=1
hostpci1: 0000:00:1f.3
ide0: local:iso/virtio-win-0.1.240.iso,media=cdrom,size=612812K
ide2: local:iso/Win11_22H2_Chinese_Simplified_x64v2.iso,media=cdrom,size=5723780K
machine: pc-i440fx-8.0
memory: 10240
meta: creation-qemu=8.0.2,ctime=1695825773
net0: virtio=0E:01:BC:9D:02:51,bridge=vmbr0,firewall=1
numa: 1
ostype: win11
scsihw: virtio-scsi-single
smbios1: uuid=37977c80-49d4-49f8-8cda-cc03b4ca2fc6
sockets: 1
tpmstate0: local:811/vm-811-disk-1.raw,size=4M,version=v2.0
usb0: host=4037:2804,usb3=1
usb1: host=1ea7:0064,usb3=1
usb2: host=260d:0013,usb3=1
vga: none
virtio0: local:811/vm-811-disk-2.qcow2,cache=unsafe,iothread=1,size=30G
virtio1: local:811/vm-811-disk-3.qcow2,iothread=1,size=64G
vmgenid: 6328352c-225d-4a86-b7ee-643a781aafe0

不出以外的话,在驱动安装完成后,屏幕可以被点亮。

# 进阶

上面的操作911 这个虚拟机有三个问题

  • 没有开机画面
  • 会直接关掉当前宿主机器的所有软件

开机画面不显示这个问题在q35机型上 好像是无法避免的。在i440fx有的机器可以直接显示,有的需要特殊方法。

# 开机画面

# 主板vbios方案 - 有开机画面

尝试继续处理 这次创建一个新的711 的虚拟机 这次先解决开机画面问题,我这次引用了一个修改后的主板bios文件。如果你没有,可以不加args里面的bios的配置,或从ls -lh /usr/share/kvm/*.bin 里自带的逐个试试,我这里不引用修改后的bios的话,可以显示kvm的bios界面但是最终,会卡到 boot form disk 的命令界面。

最终配置文件参考如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
args: -bios /opt/pve-igpu-hooks/b150m.bin  -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=2 -set device.hostpci0.x-igd-opregion=on  -smbios type=2 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -cpu host,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on
boot: order=virtio0
cores: 12
cpu: host
hostpci0: 0000:00:02.0,legacy-igd=1
hostpci1: 0000:02:00.0
memory: 10241
meta: creation-qemu=8.0.2,ctime=1695825773
name: w11-test
net0: virtio=0E:01:BC:9D:02:51,bridge=vmbr0,firewall=1
numa: 1
ostype: other
scsihw: virtio-scsi-single
smbios1: uuid=0c5111fb-3e27-41eb-80f7-c097ad453e7b
sockets: 1
usb0: host=4037:2804,usb3=1
usb1: host=1ea7:0064,usb3=1
usb2: host=260d:0013,usb3=1
vga: none
tpmstate0: local:811/vm-811-disk-1.raw,size=4M,version=v2.0
efidisk0: local:811/vm-811-disk-0.qcow2,efitype=4m,pre-enrolled-keys=1,size=528K
virtio0: local:811/vm-811-disk-2.qcow2,cache=unsafe,iothread=1,size=30G
virtio1: local:811/vm-811-disk-3.qcow2,iothread=1,size=64G
vmgenid: 6328352c-225d-4a86-b7ee-643a781aafe0
hookscript: local:snippets/hooks-igpupt.pl
# 继续研究 q35方案 - 无开机画面
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
agent: 1
args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-opregion=on,romfile=igd.rom
bios: ovmf
boot: order=virtio0
cores: 12
cpu: host
efidisk0: local:811/vm-811-disk-0.qcow2,efitype=4m,pre-enrolled-keys=1,size=528K
hookscript: local:snippets/hooks-igpupt.pl
ide0: local:iso/virtio-win-0.1.240.iso,media=cdrom,size=612812K
ide2: local:iso/Win11_22H2_Chinese_Simplified_x64v2.iso,media=cdrom,size=5723780K
machine: pc-q35-8.0
memory: 10240
meta: creation-qemu=8.0.2,ctime=1695825773
net0: virtio=0E:01:BC:9D:02:51,bridge=vmbr0,firewall=1
numa: 1
ostype: win11
scsihw: virtio-scsi-single
smbios1: uuid=37977c80-49d4-49f8-8cda-cc03b4ca2fc6
sockets: 1
tpmstate0: local:811/vm-811-disk-1.raw,size=4M,version=v2.0
usb0: host=4037:2804,usb3=1
usb1: host=1ea7:0064,usb3=1
usb2: host=260d:0013,usb3=1
vga: none
virtio0: local:811/vm-811-disk-2.qcow2,cache=unsafe,iothread=1,size=30G
virtio1: local:811/vm-811-disk-3.qcow2,iothread=1,size=64G
vmgenid: 6328352c-225d-4a86-b7ee-643a781aafe0

可以启动,但是 卡开机画面

# 尝试黑名单

/etc/modprobe.d/pve-blacklist.conf 修改完成后 sudo update-initramfs -u -k all

1
2
3
4
5
6
7
8
9
# This file contains a list of modules which are not supported by Proxmox VE 

# nvidiafb see bugreport https://bugzilla.proxmox.com/show_bug.cgi?id=701
blacklist nvidiafb


blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi

实际测试 在pve8下,这个黑名单在直通核显的时候,屏蔽后除了会导致pve没有显示之外并没有别的任何作用。

# 获取钩子

我这里所有操作都放到 /opt/pve-uhd630-hooks/ 这个目录

1
2
3
4
5
6
7
8
sudo mkdir -p /opt/pve-igpu-hooks/ && cd /opt/pve-igpu-hooks/
sudo wget https://github.com/HelloZhing/pvevm-hooks/archive/refs/heads/main.zip 
sudo unzip main.zip # apt install unzip
sudo chown -R yanhui:yanhui /opt/pve-igpu-hooks/  # 临时修改为当前用户yanhui所有方便后面直接在pve桌面下修改编辑
mv /opt/pve-igpu-hooks/pvevm-hooks-main/*.sh /opt/pve-igpu-hooks/
mv /opt/pve-igpu-hooks/pvevm-hooks-main/hooks-igpupt.pl /opt/pve-igpu-hooks/hooks-igpupt.pl
rm main.zip && rm -r pvevm-hooks-main # 删掉无用文件
chmod a+x *.sh *.pl # 运行权限

需要几个地方修改

  • hooks-igpupt.pl 里面的 路径 /root/pvevm-hooks​ 全部替换为 /opt/pve-igpu-hooks

  • vm-start.sh 里面的 #$(dirname0)/vfio-startup.sh​ 这行注射下面 添加一行 /opt/pve-igpu-hooks/vfio-startup.sh​ 同理把 vm-stop.sh中 有 vfio-teardown.sh​ 那行注射下面添加一行 /opt/pve-igpu-hooks/vfio-teardown.sh

钩子函数复制到

1
2
sudo rm /var/lib/vz/snippets/hooks-igpupt.pl
sudo cp /opt/pve-igpu-hooks/hooks-igpupt.pl /var/lib/vz/snippets/hooks-igpupt.pl

# 新虚拟配置

返回到pve平台,编辑多出来的911的虚拟机,添加直通设备,我这里暂时只直通usb键鼠标

然后编辑/etc/pve/qemu-server/911.conf

  • 顶部添加一行 ​ args: -devive vfio-pci,host=00:02.0,addr=0x02,x-idg-gms=1,x-ide-opregion-on ​

然后在pve 运行命令 添加 hooks

1
sudo qm set 911 --hookscript local:snippets/hooks-igpupt.pl # 会多出一行 hookscript: local:snippets/hooks-igpupt.pl

# 准备另外一台设备

可能需要另外一个设备操作pve 和 win11的远程桌面。
我这里用iphone + ish+RD Client上面 win11 我固定了ip是 10.1.1.11 所以 在启动911 后,在手机 ish 一直ping 这个ip 就好

本文参考,并做了一些小修改:https://zhing.fun/pve_igpupt/

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计