Loading... <div class="tip share">请注意,本文编写于 1733 天前,最后修改于 933 天前,其中某些信息可能已经过时。</div> ##### Summary 这个教程朋友催了我好久,最近直通核显到PVE虚拟机里的黑群晖成功了,趁热打铁记录下来吧 三月份的时候入手了一台J5005,因为他的核显性能强大,同时J5005的功耗低,因此打算打造一台ALL IN ONE的HTPC。在打造过程中,想出了一些方案,同时研究了两种不同直通方法,记录下来给后人参考少踩坑 ##### 直通前提 无论是哪种直通方法,都需要先按照步骤开启PCI直通 * 步骤 * **需要在BIOS设置中将UEFI改为Legacy** ,不然后面没有办法处理ROM文件,会出现报错 * 按照以下操作,开启PCI设备直通 ```bash vi /etc/default/grub # 编辑GRUB文件,添加intel_iommu=on video=efifb:off,vesafb:off ----- # 编辑 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off,vesafb:off" ----- update-grub # 更新GRUB,使下次开机时生效 vi /etc/modules # 编辑modules文件,添加vfio、vfio_iommu_type1、vfio_pci、vfio_virqfd ----- # 编辑 vfio vfio_iommu_type1 vfio_pci vfio_virqfd ----- vi /etc/modprobe.d/blacklist.conf # 编辑黑名单,添加blacklist snd_hda_intel、blacklist snd_soc_skl、blacklist snd_hda_codec_hdmi、blacklist i915 ----- # 编辑 blacklist snd_hda_intel blacklist snd_soc_skl blacklist snd_hda_codec_hdmi blacklist i915 ----- echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf # 防止增加PCI设备后虚拟机无法启动 echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf lspci -v # 找到核显的总线地址,此处总线地址为00:02.0 lspci -n -s 总线地址 # 根据核显的总线地址查找vender id,此处为总线地址为00:02.0,vender id为8086:3184 echo "options vfio-pci ids=vender id" > /etc/modprobe.d/vfio.conf # vender id为显卡vender id,此处为8086:3184 update-initramfs -u # 更新initramfs,再重启宿主机 ----- lspci -v # 查看核显是否为Kernel driver in use: vfio-pci,如果不为vfio-pci,则说明核显直通失败 ```  ##### 直通方法一 这种方法比较简单,直接选择需要直通的设备就行,不支持Windows虚拟机输出HDMI图像,AndroidTV虚拟机支持输出HDMI图像的,其他没测试过。如果需要输出Windows虚拟机HDMI图像,请选择方法二 在我的设计方案中,需要直通核显给黑群晖进行硬件加速转码。因为不涉及HDMI输出,因此只需要在PVE虚拟机硬件设置界面上添加**PCI设备-核显**即可,以下以群晖虚拟机作为例子 * 步骤 * 在虚拟机**硬件**页,点击 **添加-添加PCI设备-设备-选择核显设备** (我这里就没有显示设备名称,自己对应设备总线地址(即ID)添加吧)  * 选择完PCI设备后,勾上**所有功能**和 **ROM Bar**,然后点击**OK**完成添加  * 完成添加后,开启虚拟机,安装系统,即可直通核显 * 其他(以下仅针对群晖虚拟机,非群晖虚拟机绕过即可其他系统) * 有的论坛说是需要更改**机器**为Q35,实际上是不需要更改的,保留默认的**i440fx**即可 * 有的论坛说需要把**显示**改为无,但是在实际操作中并不需要,因为他并没有使用HDMI输出,所以同样保持**默认**即可 * 检验 * 对于是否直通成功,一般检测虚拟机系统中的`/dev/dri`是否有`card0`和`renderD128` 即直通成功(Linux)  ##### 直通方法二 对于Windows HDMI输出虚拟机图像的情景则需要使用另外一种方法进行核显直通。 因为默认的VGA ROM里面的vender id是不正确的,因此需要修改VGA ROM的vender id为实际的核显vender id以实现HDMI输出 (注:**一定要将BIOS的UEFI改为Legacy,否则不能导出VGA ROM** ) * **步骤** * 开启虚拟机,安装Windows,安装完成后**开启远程桌面**,然后关机 * 导出原来的VGA ROM,例子中导出的VGA ROM文件在/root目录下 ```bash cd /sys/bus/pci/devices/0000:02:00.0/ # 进入核显设备目录 echo 1 > rom # 打开编辑模式 cat rom > /root/igpu-nofix.bin # 导出VGA ROM为bin文件进行读写 echo 0 > rom # 关闭编辑模式 ``` * 修改导出的VGA ROM文件 ```bash git clone https://github.com/awilliam/rom-parser cd rom-parser make # 如果make过程中出现问题,请自行补全gcc和g++套件 pwd ---- 显示 /root/rom-parser ---- ./rom-fixer /root/igpu-nofix.bin # 根据提示进行修复,需要用到核显的vender id,此处修复后的VGA ROM文件名为igpu.bin,其他不要修改 ``` * 进入虚拟机配置文件目录,修改对应虚拟机配置文件(注意:如果修改虚拟机配置文件,则**不要**在控制台添加PCI设备) ```bash cd /etc/pve/qemu-server vi 102.conf # 假设我的虚拟机ID为102 ----- .... args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-gms=1,romfile=/root/igpu.bin vga: none ... ``` * host的参数是核显的总线地址,addr我暂时不知道是什么,但是也只有参数0x02是可以直通核显并让HDMI输出虚拟机图像的,romfile参数是你修改VGA ROM文件的绝对路径。 * 由于使用HDMI,需要更改VGA为NONE。即Web页面的显示为无。 * 重新打开虚拟机,通过远程桌面进行连接,然后下载驱动人生或者驱动精灵给核显打驱动,完成后进行重启。(注:**不要**去Intel下载最新的核显驱动或使用Windows更新进行安装驱动,会导致开机花屏卡死)重启后,即可在显示器看到HDMI正常输出虚拟机的图像信号,直通完成。  ##### 最后 以上就是这半年来折腾的经验,现在安装了黑群晖918+使用核显进行硬件加速转码  ##### 参考链接 * [https://club.tgfcer.com/viewthread.php?tid=7657483&page=1](https://club.tgfcer.com/viewthread.php?tid=7657483&page=1) 最后修改:2022 年 10 月 03 日 © 允许规范转载 赞 0 如果对你有帮助,可以请我喝杯奶茶哦