Open itgoyo opened 1 year ago
在 PVE 上搭建软路由、NAS 等虚拟系统都相对容易,而 HTPC 却因为核显或显卡的直通问题而相对复杂,本文将详细介绍 PVE 虚拟环境下,直通给 WIN10 做 HTPC 并实现 HDMI 输出的详细步骤,以及避坑指南。
先上成果:左边屏是 PVE 下直通给 WIN10 核显 HDMI 输出的,右边屏 PVE 控制台看到的虚拟屏。
⑴ 一台 X86 物理机,已经完成 PVE 虚拟环境的安装配置(版本 6.1-7)
⑵ PVE 物理机 BIOS 开启 VT-x 虚拟化技术
⑶ Win10 最新镜像。
⑷ Win10 虚拟机驱动包:virtio-win.iso。
打开 PVE 节点的 shell,输入命令:
nano /etc/default/grub
开启 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"
其中 “iommu=pt” 不是必须的,PT 模式只在必要的时候开启设备的 IOMMU 转换,可以提高未直通设备 PCIe 的性能,建议添加。
编辑完文件后按 “Ctrl + X” > “Y” > “回车”,确认保存并退出,然后更新一下引导配置:
update-grub
在 PVE 的 shell 中输入:
nano /etc/modules
查看 modules 中是否有这些 PVE 硬件直通相关的模块,如果没有就添加到文件末尾。
vfio vfio_iommu_type1 vfio_pci vfio_virqfd
编辑 PVE 系统的驱动黑名单配置文件:
nano /etc/modprobe.d/blacklist.conf
这个文件原来不存在,打开里面是空白的,添加以下内容:
blacklist snd_hda_intel blacklist snd_hda_codec_hdmi blacklist i915
这些是 PVE 系统核显相关的驱动,添加到 “blacklist.conf” 文件后,PVE 系统将不加载核显的驱动,留给虚拟机用。
查看核显以及声卡的供应商和设备 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 虚拟机,BIOS 用默认 SeaBIOS,机器改为 q35,硬盘格式用 SATA 格式不然会找不到硬盘,两个光驱一个挂载 WIN10 的 iso 镜像,另一个挂载 virtio-win 的 iso 驱动包,Win10 虚拟机有个 PCI 设备的驱动要在里面找。
显卡和声卡先不添加,如果添加了请接上显示器,不然可能造成宿主机死机。
⑴ 从 WIN10 的安装光盘启动虚拟机,在 PVE 的控制台完成 WIN10 的安装,安装过程中记得给用户账户设密码,后面远程桌面登录必须要有密码的账户才能登录。
⑵ 启用 Win10 客户机的远程桌面(RDP)
⑶ 把 Win10 的客户机的网络改成专用,方便连接远程桌面,。
适用于英特尔五代 (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”,我试了几次,有些时候安装完这个驱动屏幕就亮了,但是核显还不能被调用。
核显的驱动自动搜索就能找到:
核显安装过程还是可能会出现死机,可以尝试:
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
下面这张图是华擎(ASRock)Z390M-ITX/ac 主板核显直通成功截到的,可以看到 UHD630 核显被成功识别了。
⑶ 输出设置
UPT 核显直通模式因为主显卡是虚拟显卡,很多程序默认先调用虚拟显卡而且改不了,所以会有一定性能损失。
如果设置双屏扩展或者复制显示,程序默认都不会调用的核显;如果设置成仅在物理显示器显示,分辨率又调不了。
可行性比较高的是在设备管理器里面禁用虚拟显卡,双屏复制显示,这种情况分辨率可调,程序(包括 Kodi)能默认调用核显,不过因为双屏的存在还是有性能损失。
适用于英特尔二代 (Sandy Bridge) 及以后的 CPU,直通的核显为主显卡占用 addr=0x02 通道,所以不能添加虚拟显卡,这种模式实测成功率比较低,不过性能损失较小,推荐尝试。
机器类型改成 "i440fx",如果你之前试过 UPT 模式,删除核显直通配置,先成功启动一次 Win10 客户机系统。
args: -device vfio-pci,host=00:02.0,addr=0x02 vga: none
给 PVE 物理机接上屏幕,启动虚拟机,在网络邻居里面找到 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。
在 PVE 上搭建软路由、NAS 等虚拟系统都相对容易,而 HTPC 却因为核显或显卡的直通问题而相对复杂,本文将详细介绍 PVE 虚拟环境下,直通给 WIN10 做 HTPC 并实现 HDMI 输出的详细步骤,以及避坑指南。
在 PVE 上搭建软路由、NAS 等虚拟系统都相对容易,而 HTPC 却因为核显或显卡的直通问题而相对复杂,本文将详细介绍 PVE 虚拟环境下,直通给 WIN10 做 HTPC 并实现 HDMI 输出的详细步骤,以及避坑指南。
先上成果:左边屏是 PVE 下直通给 WIN10 核显 HDMI 输出的,右边屏 PVE 控制台看到的虚拟屏。
一、准备工作
⑴ 一台 X86 物理机,已经完成 PVE 虚拟环境的安装配置(版本 6.1-7)
⑵ PVE 物理机 BIOS 开启 VT-x 虚拟化技术
⑶ Win10 最新镜像。
⑷ Win10 虚拟机驱动包:virtio-win.iso。
二、开启 PVE 核显直通
1、启动内核 IOMMU 支持
打开 PVE 节点的 shell,输入命令:
开启 IOMMU 支持:
amd CPU 修改为:
其中 “iommu=pt” 不是必须的,PT 模式只在必要的时候开启设备的 IOMMU 转换,可以提高未直通设备 PCIe 的性能,建议添加。
编辑完文件后按 “Ctrl + X” > “Y” > “回车”,确认保存并退出,然后更新一下引导配置:
2、加载硬件直通相关模块
在 PVE 的 shell 中输入:
查看 modules 中是否有这些 PVE 硬件直通相关的模块,如果没有就添加到文件末尾。
3、添加驱动黑名单
编辑 PVE 系统的驱动黑名单配置文件:
这个文件原来不存在,打开里面是空白的,添加以下内容:
这些是 PVE 系统核显相关的驱动,添加到 “blacklist.conf” 文件后,PVE 系统将不加载核显的驱动,留给虚拟机用。
4、绑定核显到 vfio 模块
查看核显以及声卡的供应商和设备 ID:
回显如下:
其中 “8086:5a85” 和 “8086:5a98” 分别就是核显和声卡的供应商 ID 和设备 ID,把它们绑定到 vifo 模块:
注意,这里是华擎 J3455-ITX 主板的数据,其他主板或 CPU 核显和声卡的硬件 ID 会不一样,请根据实际情况添加。
最后更新配置信息并重启 PVE 主机:
重启上来之后检查模块是否正常加载:
有类似回显说明就是正常的:
三、WIN10 虚拟机设置
1、虚拟机环境
创建 Win10 虚拟机,BIOS 用默认 SeaBIOS,机器改为 q35,硬盘格式用 SATA 格式不然会找不到硬盘,两个光驱一个挂载 WIN10 的 iso 镜像,另一个挂载 virtio-win 的 iso 驱动包,Win10 虚拟机有个 PCI 设备的驱动要在里面找。
显卡和声卡先不添加,如果添加了请接上显示器,不然可能造成宿主机死机。
2、安装配置 WIN10
⑴ 从 WIN10 的安装光盘启动虚拟机,在 PVE 的控制台完成 WIN10 的安装,安装过程中记得给用户账户设密码,后面远程桌面登录必须要有密码的账户才能登录。
⑵ 启用 Win10 客户机的远程桌面(RDP)
⑶ 把 Win10 的客户机的网络改成专用,方便连接远程桌面,。
3、UPT 模式直通核显
适用于英特尔五代 (Broadwell) 及以后的 CPU,直通的核显为第二显卡,虚拟 vga 为主显卡,因为虚拟显卡的存在有一定性能损失,推荐性能较好的机器使用。
⑴ 直通核显
打开虚拟机配置文件 (“100” 为虚拟机 ID):
加上这两行:
其中 “00:02.0” 为核显的 IOMMU 分组信息(“lspci” 命令可以查看),请根据实际情况更改。
⑵ 安装驱动
给 PVE 物理机接上屏幕,启动虚拟机,在 PVE 的控制台安装直通的核显和其他设备的驱动。
“PCI 设备” 的驱动在 virtio-win 驱动包里面,从挂载的虚拟光驱搜索就能找到,安装过程才知道这个设备叫 “VirtIO Balloon Driver”,我试了几次,有些时候安装完这个驱动屏幕就亮了,但是核显还不能被调用。
核显的驱动自动搜索就能找到:
核显安装过程还是可能会出现死机,可以尝试:
下面这张图是华擎(ASRock)Z390M-ITX/ac 主板核显直通成功截到的,可以看到 UHD630 核显被成功识别了。
⑶ 输出设置
UPT 核显直通模式因为主显卡是虚拟显卡,很多程序默认先调用虚拟显卡而且改不了,所以会有一定性能损失。
如果设置双屏扩展或者复制显示,程序默认都不会调用的核显;如果设置成仅在物理显示器显示,分辨率又调不了。
可行性比较高的是在设备管理器里面禁用虚拟显卡,双屏复制显示,这种情况分辨率可调,程序(包括 Kodi)能默认调用核显,不过因为双屏的存在还是有性能损失。
4、**Legacy 模式直通核显**
适用于英特尔二代 (Sandy Bridge) 及以后的 CPU,直通的核显为主显卡占用 addr=0x02 通道,所以不能添加虚拟显卡,这种模式实测成功率比较低,不过性能损失较小,推荐尝试。
⑴ 直通核显
机器类型改成 "i440fx",如果你之前试过 UPT 模式,删除核显直通配置,先成功启动一次 Win10 客户机系统。
打开虚拟机配置文件 (“100” 为虚拟机 ID):
加上这两行:
⑵ 安装驱动
给 PVE 物理机接上屏幕,启动虚拟机,在网络邻居里面找到 Win10 客户机,用远程桌面进行连接。
驱动安装过程和 UPT 模式一样,还是先安装 PCI 设备的驱动再安装直通核显的驱动,成功率比较随缘,各种死机花屏蓝屏,假如你成功了那么恭喜你,后续运行会很稳定。
四、其他问题
1、加上 “pcie_acs_override=downstream” 尝试拆分 IOMMU 分组:
不一定有用,碰碰运气吧。
2、N 卡和 A 卡的驱动黑名单:
如果是 N 卡还需要加入下面的配置到 kvm.conf(PVE 官方稳定说可以避免死机):
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。