itgoyo / 500Days-Of-Github

⭐ 瞎JB折腾Mac/Linux/Windows过程中遇到的所有问题和解决方式 ⭐
https://itgoyo.github.io/500Days-Of-Github
142 stars 14 forks source link

PVE 直通核显搭建虚拟 Win10 HTPC 避坑指南 #309

Open itgoyo opened 1 year ago

itgoyo commented 1 year ago

在 PVE 上搭建软路由、NAS 等虚拟系统都相对容易,而 HTPC 却因为核显或显卡的直通问题而相对复杂,本文将详细介绍 PVE 虚拟环境下,直通给 WIN10 做 HTPC 并实现 HDMI 输出的详细步骤,以及避坑指南。

在 PVE 上搭建软路由、NAS 等虚拟系统都相对容易,而 HTPC 却因为核显或显卡的直通问题而相对复杂,本文将详细介绍 PVE 虚拟环境下,直通给 WIN10 做 HTPC 并实现 HDMI 输出的详细步骤,以及避坑指南。

先上成果:左边屏是 PVE 下直通给 WIN10 核显 HDMI 输出的,右边屏 PVE 控制台看到的虚拟屏。

PVE下直通核显给WIN10做HTPC HDMI输出

一、准备工作

⑴ 一台 X86 物理机,已经完成 PVE 虚拟环境的安装配置(版本 6.1-7)

⑵ PVE 物理机 BIOS 开启 VT-x 虚拟化技术

⑶ Win10 最新镜像。

⑷ Win10 虚拟机驱动包:virtio-win.iso

二、开启 PVE 核显直通

1、启动内核 IOMMU 支持

打开 PVE 节点的 shell,输入命令:

nano /etc/default/grub

PVE虚拟黑群晖实现硬盘休眠避坑指南教程3

开启 IOMMU 支持:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off"

amd CPU 修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt video=efifb:off,vesafb:off"

PVE开启硬件直通支持

其中 “iommu=pt” 不是必须的,PT 模式只在必要的时候开启设备的 IOMMU 转换,可以提高未直通设备 PCIe 的性能,建议添加。

编辑完文件后按 “Ctrl + X” > “Y” > “回车”,确认保存并退出,然后更新一下引导配置:

update-grub
2、加载硬件直通相关模块

在 PVE 的 shell 中输入:

nano /etc/modules

查看 modules 中是否有这些 PVE 硬件直通相关的模块,如果没有就添加到文件末尾。

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd 

PVE加载硬件直通所需的模块

3、添加驱动黑名单

编辑 PVE 系统的驱动黑名单配置文件:

nano /etc/modprobe.d/blacklist.conf

这个文件原来不存在,打开里面是空白的,添加以下内容:

blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915

这些是 PVE 系统核显相关的驱动,添加到 “blacklist.conf” 文件后,PVE 系统将不加载核显的驱动,留给虚拟机用。

4、绑定核显到 vfio 模块

查看核显以及声卡的供应商和设备 ID:

lspci -n | grep -E "0300|0403"

回显如下:

00:02.0 0300: 8086:5a85 (rev 0b)
00:0e.0 0403: 8086:5a98 (rev 0b)

其中 “8086:5a85” 和 “8086:5a98” 分别就是核显和声卡的供应商 ID 和设备 ID,把它们绑定到 vifo 模块:

echo "options vfio-pci ids=8086:5a85,8086:5a98" > /etc/modprobe.d/vfio.conf

注意,这里是华擎 J3455-ITX 主板的数据,其他主板或 CPU 核显和声卡的硬件 ID 会不一样,请根据实际情况添加。

最后更新配置信息并重启 PVE 主机:

update-initramfs -u
reboot

重启上来之后检查模块是否正常加载:

lsmod | grep vfio

有类似回显说明就是正常的:

vfio_pci               49152  0
vfio_virqfd            16384  1 vfio_pci
irqbypass              16384  2 vfio_pci,kvm
vfio_iommu_type1       28672  0
vfio                   32768  2 vfio_iommu_type1,vfio_pci

三、WIN10 虚拟机设置

1、虚拟机环境

创建 Win10 虚拟机,BIOS 用默认 SeaBIOS,机器改为 q35,硬盘格式用 SATA 格式不然会找不到硬盘,两个光驱一个挂载 WIN10 的 iso 镜像,另一个挂载 virtio-win 的 iso 驱动包,Win10 虚拟机有个 PCI 设备的驱动要在里面找。

显卡和声卡先不添加,如果添加了请接上显示器,不然可能造成宿主机死机。

PVE下直通核显的WIN10虚拟机设置

2、安装配置 WIN10

⑴ 从 WIN10 的安装光盘启动虚拟机,在 PVE 的控制台完成 WIN10 的安装,安装过程中记得给用户账户设密码,后面远程桌面登录必须要有密码的账户才能登录。

⑵ 启用 Win10 客户机的远程桌面(RDP

Win10怎么启用远程桌面

⑶ 把 Win10 的客户机的网络改成专用,方便连接远程桌面,。

Win10的网络配置改成专用才能被其他电脑发现

3、UPT 模式直通核显

适用于英特尔五代 (Broadwell) 及以后的 CPU,直通的核显为第二显卡,虚拟 vga 为主显卡,因为虚拟显卡的存在有一定性能损失,推荐性能较好的机器使用。

⑴ 直通核显

打开虚拟机配置文件 (“100” 为虚拟机 ID):

nano /etc/pve/qemu-server/100.conf

加上这两行:

args: -device vfio-pci,host=00:02.0,addr=0x18,x-igd-opregion=on
vga: std

其中 “00:02.0” 为核显的 IOMMU 分组信息(“lspci” 命令可以查看),请根据实际情况更改。

⑵ 安装驱动

给 PVE 物理机接上屏幕,启动虚拟机,在 PVE 的控制台安装直通的核显和其他设备的驱动。

“PCI 设备” 的驱动在 virtio-win 驱动包里面,从挂载的虚拟光驱搜索就能找到,安装过程才知道这个设备叫 “VirtIO Balloon Driver”,我试了几次,有些时候安装完这个驱动屏幕就亮了,但是核显还不能被调用。

PVE安装Win10虚拟机PCI设备的驱动

核显的驱动自动搜索就能找到:

PVE远程桌面安装Win10虚拟机直通核显的驱动程序

核显安装过程还是可能会出现死机,可以尝试:

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

下面这张图是华擎(ASRock)Z390M-ITX/ac 主板核显直通成功截到的,可以看到 UHD630 核显被成功识别了。

PVE直通核显WIN10成功识别-HMID输出

⑶ 输出设置

UPT 核显直通模式因为主显卡是虚拟显卡,很多程序默认先调用虚拟显卡而且改不了,所以会有一定性能损失。

如果设置双屏扩展或者复制显示,程序默认都不会调用的核显;如果设置成仅在物理显示器显示,分辨率又调不了。

可行性比较高的是在设备管理器里面禁用虚拟显卡,双屏复制显示,这种情况分辨率可调,程序(包括 Kodi)能默认调用核显,不过因为双屏的存在还是有性能损失。

4、**Legacy 模式直通核显**

适用于英特尔二代 (Sandy Bridge) 及以后的 CPU,直通的核显为主显卡占用 addr=0x02 通道,所以不能添加虚拟显卡,这种模式实测成功率比较低,不过性能损失较小,推荐尝试。

⑴ 直通核显

机器类型改成 "i440fx",如果你之前试过 UPT 模式,删除核显直通配置,先成功启动一次 Win10 客户机系统。

打开虚拟机配置文件 (“100” 为虚拟机 ID):

nano /etc/pve/qemu-server/100.conf

加上这两行:

args: -device vfio-pci,host=00:02.0,addr=0x02
vga: none

⑵ 安装驱动

给 PVE 物理机接上屏幕,启动虚拟机,在网络邻居里面找到 Win10 客户机,用远程桌面进行连接。

使用远程桌面连接Win10

驱动安装过程和 UPT 模式一样,还是先安装 PCI 设备的驱动再安装直通核显的驱动,成功率比较随缘,各种死机花屏蓝屏,假如你成功了那么恭喜你,后续运行会很稳定。

四、其他问题

1、加上 “pcie_acs_override=downstream” 尝试拆分 IOMMU 分组:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off pcie_acs_override=downstream"

不一定有用,碰碰运气吧。

2、N 卡和 A 卡的驱动黑名单:

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf

如果是 N 卡还需要加入下面的配置到 kvm.conf(PVE 官方稳定说可以避免死机):

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

3、romfile 选项

romfile 是核显直通的另一个参数,它不是必须的,某些主板无法直通第一个 PCI(e)插槽上的 GPU 显卡,才需要用到 romfile 选项,详情可以参考:PVE 核显直通实现 HDMI 输出搭建 LibreELEC KODI HTPC

五、总结

本教程详细介绍了 PVE 虚拟环境下直通核显给 Win10 虚拟机,并实现核显 HDMI 输出做 HTPC 的详细步骤和避坑指南,难点主要在 PVE 的核显直通设置和 Win10 客户机核显驱动的安装,一般情况下 SeaBIOS 引导的 Win10 客户机如果直通的核显驱动安装成功都会有 HDMI 输出,而 OVMF(UEFI)引导的 Win10 客户机核显驱动安装简单但是大多数情况下只能解码没有输出。

用 Win10 虚拟机搭建 HTPC 大部分人用起来会比较顺手,但是如果机器性能比较一般的话就可以考虑 Ubuntu 方案、LireElec 方案或者直接在 PVE 环境安装 KODI