在pve上 efi q35 直通显卡显示,以及声卡和蓝牙 wifi等的直通 win/macos

本文假定,你已经装了一个系统,机型是 q35 efi启动。

目标,再q35 机型上 用efi 启动win 以及 opencore efi 启动的macos 可以点亮HDMI

macos安装请查看在pve上直接安装macos13 Ventura 初步优化

本文基于 efi grub pve7.2.11 更多环境参数查看 本文末尾

首先搞定相对比较简单的win10的显卡直通,以便后续调试macos

# 显卡直通

# vbois文件

因为是efi启动,所以必须提取显卡的vbois,如果你是独立显卡可以去这里下载 https://www.techpowerup.com/vgabios/

如果是核显,可以网上搜一下你的核显型号,看能不能找到可用的vbios,如果 依旧没有,就需要自己提取编译,具体网上搜一下教程我这里就不重复

我的是uhd630 , 网上找到了一份 在unraid下测试没问题的。https://github.com/joyanhui/file.leiyanhui.com/blob/main/pve-unraid-kvm/vbios_gvt_uefi.rom

下载到pve里面 备用

cd /usr/share/kvm/
wget https://file.leiyanhui.com/pve-unraid-kvm/vbios_gvt_uefi.rom

# 开启pve的显卡直通

# grub的处理 开启IOMMU支持

cp /etc/default/grub /etc/default/grub-bak
nano /etc/default/grub

修改GRUB_CMDLINE_LINUX_DEFAULT这行为

 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

如果是amd的cpu 前面intel_iommu=on改为 amd_iommu=on
如果多显卡,可能还需要再这里做一下屏蔽处理 就是 羡慕的 =on 后面添加空格 video=efifb:off

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on  video=efifb:off"

解释:

iommu开启直通分组
efifb:off 禁用efi启动的显示设备
vesafb:off 禁用legacy启动的显示设备

# modprobe的处理 VT-D功能的内核模块

cp /etc/modules /etc/modules-bak
nano  /etc/modules 

添加

vfio
vfio_iommu_type1
vfio_pc
vfio_virqfd

# 检查黑名单

因为pve启动时会尝试加载显卡驱动,为了避免pve占用显卡,需要阻止pve的显卡驱动加载。只有显卡直通才需要这个 模块(驱动)黑名单,即让GPU设备在下次系统启动之后不使用这些驱动,把设备腾出来给vfio驱动用: /etc/modprobe.d/pve-blacklist.conf 看看有没有下面的内容,如果你后面要用钩子函数,就需要删除下面的内容,不用的话,最好是添加进去

cp /etc/modprobe.d/pve-blacklist.conf  /etc/modprobe.d/pve-blacklist.conf-bak
nano /etc/modprobe.d/pve-blacklist.conf

内容

blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi

其他显卡

# block AMD driver
blacklist radeon
blacklist amdgpu

# block NVIDIA driver
blacklist nouveau
blacklist nvidia
blacklist nvidiafb

# 处理一个kvm的配置项,可以避免一些特殊问题

如果是N卡还需要加入下面的配置到kvm.conf(据老外说是避免一些莫名其妙的错误),

如果你要跑macos的话 最好也添加一下,据说也可以避免macos无限重启

echo "options kvm ignore_msrs=Y" > /etc/modprobe.d/kvm.conf

也有国外教程是

echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf

不清楚那个是最合适的,我用第一个,只添加这行的话,会却会导致pve的母鸡控制台刷屏kvm [2205]: vcpu0 ignored RDMSR: 0x1b8类似的代码,你如果觉得烦躁。 你可以 修改成 options kvm ignore_msrs=Y report_ignored_msrs=N

重启生效,或者 echo 0 > /sys/module/kvm/parameters/report_ignored_msrs 强制生效

# 允许不安全的中断

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

# 添加显卡到直通设备中 写入vfio

# 查看pci设备

lspci -nn  | grep 显卡名称

例如

lspci -nn  | grep UHD
00:02.0 VGA compatible controller [0300]: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630] [8086:3e9b]

记住前面和最后的地址 00:028086:3e9b

由于我们需要让设备直通虚拟机, 那就不能让宿主机的驱动去接管这些硬件, 我们需要一个 dummy 驱动模块去接管这些要被直通的硬件. 找到你想要直通的设备的 ID, 并且注意每个设备所在组的其他设备(编辑文件 /etc/modprobe.d/vfio.conf.

echo "options vfio-pci ids=8086:3e9b" > /etc/modprobe.d/vfio.conf

ps:执行此操作后可能无法输出到外接显示器,若出现此情况,请撤回该步骤

另外有一个 参数 disable_vga=1 也可能会影响

echo "options vfio-pci ids=8086:3e9b disable_vga=1" > /etc/modprobe.d/vfio.conf

但是为了避免 initrd 引入的内核模块中 vfio 位于物理驱动的后面, 这里有两套方案: 根据 lspci –nnk 的内容, 找到每个设备对应的驱动, 修改 (arch) /etc/blacklist.conf 或者(pve)/etc/modprobe.d/pve-blacklist.conf 我们前面已经处理过

另外有一个usb控制器 可能后面也要用到

lspci -nn  | grep USB
00:14.0 USB controller [0c03]: Intel Corporation 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller [8086:a12f] (rev 31)

我主板只有一个usb控制器,直通其他usb设备没问题,pcie板载蓝牙的话,是不行的

# 重启

重启之前 需要更新一下 grub和 update-initramfs -u

update-grub
update-initramfs -u

执行结果

update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.15.64-1-pve
Found initrd image: /boot/initrd.img-5.15.64-1-pve
Found linux image: /boot/vmlinuz-5.15.30-2-pve
Found initrd image: /boot/initrd.img-5.15.30-2-pve
Found memtest86+ image: /boot/memtest86+.bin
Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin
Adding boot menu entry for UEFI Firmware Settings ...
done

update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.15.64-1-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.

如果你和我一样是 ventoy引导的pve 还需要执行一下,不然就启动不起来了

 cd /root/vtoyboot-1.0.24/
 sh vtoyboot.sh

执行结果

**********************************************
      vtoyboot 1.0.24
      longpanda admin@ventoy.net
      https://www.ventoy.net
**********************************************

Current system use initramfstool as initramfs tool
updating the initramfs, please wait ...
update-initramfs: Generating /boot/initrd.img-5.15.64-1-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.
grub mkconfig ...
PROBE_PATH=/usr/sbin/grub-probe MKCONFIG_PATH=/usr/sbin/grub-mkconfig
/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.15.64-1-pve
Found initrd image: /boot/initrd.img-5.15.64-1-pve
Found linux image: /boot/vmlinuz-5.15.30-2-pve
Found initrd image: /boot/initrd.img-5.15.30-2-pve
Found memtest86+ image: /boot/memtest86+.bin
Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin
Adding boot menu entry for UEFI Firmware Settings ...
done
This is ventoy enviroment
replace shim efi ...
shimx64.efi no need 0

vtoyboot process successfully finished.

重启之前,检查一下每一个文件,可以参考我的结果

cat /etc/default/grub

cat /etc/modules

cat /etc/modprobe.d/pve-blacklist.conf

cat /etc/modprobe.d/kvm.conf

cat /etc/modprobe.d/iommu_unsafe_interrupts.conf

cat /etc/modprobe.d/vfio.conf

# 我的检查 执行结果

cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
-----------------------------------
cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
vfio
vfio_iommu_type1
vfio_pc
vfio_virqfd
-----------------------------------
cat /etc/modprobe.d/pve-blacklist.conf
# This file contains a list of modules which are not supported by Proxmox VE

# nidiafb see bugreport https://bugzilla.proxmox.com/show_bug.cgi?id=701
blacklist nvidiafb
blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
-----------------------------------
cat /etc/modprobe.d/kvm.conf
options kvm ignore_msrs=Y
-----------------------------------
cat /etc/modprobe.d/iommu_unsafe_interrupts.conf
options vfio_iommu_type1 allow_unsafe_interrupts=1
-----------------------------------
cat /etc/modprobe.d/vfio.conf
cat: /etc/modprobe.d/vfio.conf: No such file or directory

# 检查没问题后 重启

reboot

# 查看模块是否有问题

lsmod | grep vfio

结果

vfio_virqfd            16384  0
vfio_iommu_type1       40960  0
vfio                   45056  1 vfio_iommu_type1

# 虚拟机添加显卡

再这里可以直接在虚拟机里面添加硬件 选择这个显卡了。但是如果是efi启动的 虚拟机能找到设备,但是显卡输出黑屏的。 可以先进去win 用vnc或者 远程桌面 装好直通进去的显卡的驱动。 所以我们还需要手动处理一下虚拟配置文件。我要操作的虚拟机 是macos+win的这双系统主机 102。

 cp  /etc/pve/qemu-server/102.conf  /etc/pve/qemu-server/102.conf-bak
 nano /etc/pve/qemu-server/102.conf

在显卡那条hostpci的最后加上,romfile=vbios_gvt_uefi.rom ,如果其他显卡 前面的地址可能不太一样

hostpci0: 0000:00:02.0,pcie=1,romfile=vbios_gvt_uefi.rom

如果上面的方法不行,那就删掉hostpci0那行,在文件最上面加上这行,并且把 显示 设置成 无,不加romfile有可能也能用,可以先试试

args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-gms=1,romfile=vbios_gvt_uefi.rom

还有一种写法 是

args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-opregion=on,romfile=vbios_gvt_uefi.rom

经过我的测试,后者写法可以再q35 efi模式下 顺利点亮,另外 虚拟显卡 可以保留,但是win10直通的鼠标不显示指针

如果你和我一样 要装黑苹果,可能已经有args这行,那就大概改成 下面这样

args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-opregion=on,romfile=vbios_gvt_uefi.rom -device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global>

另外你可能需要把显示 设置成 无 多试试

如果启动的时候,提示 failed to open /dev/vfio/1: No such file or directory 那是因为 我们用args的时候 系统没有自动将设备重新绑定到vfio-pci模块,

就需要我们

1、删除或注释/etc/modprobe.d中绑定显卡id到vfio-pci的操作,如#options vfio-pci ids=8086:3184,8086:3198

rm -rf /etc/modprobe.d/vfio.conf

2、编辑/etc/default/grub 添加vfio-pci.ids=8086:3184 8086:3198到 GRUB_CMDLINE_LINUX= “"(添加到引号内,id就是显卡id,有时需要将声卡id一并加入)

     GRUB_CMDLINE_LINUX= "vfio-pci.ids=8086:3e9b"

3、更新重启

    update-grub
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
agent: 1
args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-opregion=on,romfile=vbios_gvt_uefi.rom -device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" >
bios: ovmf
boot: order=virtio0
cores: 8
cpu: Penryn
efidisk0: local:102/vm-102-disk-0.qcow2,efitype=4m,size=528K
machine: q35
memory: 8192
meta: creation-qemu=7.0.0,ctime=1667039767
net0: virtio=EA:46:2B:E6:EF:5F,bridge=vmbr0,firewall=1
numa: 1
ostype: other
sata1: none,media=cdrom
scsihw: virtio-scsi-pci
smbios1: uuid=cbc57782-404a-4a2c-8500-78d072f75125
sockets: 1
vga: vmware
virtio0: local:102/vm-102-disk-2.raw,size=512M
virtio1: local:102/vm-102-disk-1.qcow2,size=32G
virtio3: local:102/vm-102-disk-3.qcow2,cache=unsafe,size=16G
vmgenid: f216093f-9c67-4801-934e-0a6c31fbb4fe

# 其他设备的直通

声卡和USB的直通 pve7.2 目前已经可以直接直通进去,不需要任何额外操作 HDMI 声音的直通,参考上面显卡 的 蓝牙的直通,如果是外置的usb蓝牙简单,如果是类似笔记本 或者 黑苹果的wifi上的的蓝牙,可能不一定可以驱动,可以尝试吧整个usb控制器直通进去先试试,如果可以再想办法尝试 通过pcei usb扩展卡 或者其他方法解决

参考: https://zhuanlan.zhihu.com/p/577161166 https://zyyme.com/pve-igpu-passthrough.html https://www.right.com.cn/forum/thread-4055200-1-1.html 一个比较简单的显卡vbois提取教程:https://www.jianshu.com/p/3ec6891ac5c8 一个比较易懂的kvm教程 https://zhuanlan.zhihu.com/p/60389508

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