本文假定,你已经装了一个系统,机型是 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:02
和 8086: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
|
|
其他设备的直通
声卡和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