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

在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虚拟机直通核显的驱动程序

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

  • 安装完“VirtIO Balloon Driver”PCI设备的驱动后正常关闭虚拟机再启动安装核显驱动
  • 先去掉“x-igd-opregion=on”参数,在核显不输出画面的情况下安装驱动,安装完再加上
  • 在主板BIOS把共享显存调到最大,提高虚拟机的CPU内存等配置
  • 远程桌面连接安装核显驱动
  • 试下这个配置:
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

原创文章,作者:10bests,禁止任何形式转载:https://www.10bests.com/win10-htpc-on-pve/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

评论列表(33条)

  • Astro Zhang
    Astro Zhang 2020年6月20日 下午11:25

    你好,我也是华擎J3455-ITX主板,用两种方式直通核显都不成功,是硬盘格式设置为VirtIO Block的原因吗?一定要SATA才行?

    • 10bests
      10bests 2020年6月22日 上午8:00

      @Astro Zhang你好,我当时Win10是重新安装了,用SATA格式安装过程中才能找到硬盘,你可以按我贴图的配置重新配个Win10看看。

  • zzzzzzzhohe
    zzzzzzzhohe 2020年8月3日 下午2:16

    首先赞一个,教程很有用,之前在uefi下没输出的问题解决了,但是现在仍然有问题,大致是这样:
    首次运行报错:
    kvm: -device vfio-pci,host=00:02.0,addr=0x18,x-igd-opregion=on: vfio 0000:00:02.0: device is already attached
    TASK ERROR: start failed: QEMU exited with code 1
    然后我把win10虚拟机->硬件->pci设备00.20(核显)给删了,就work了
    但是,还没完,当我第二次启动的时候:
    vfio 0000:00:02.0: failed to open /dev/vfio/1: No such file or directory
    我又把pci设备00.20(核显)添加上,报错:device is already attached
    我又又把pci设备00.20(核显)删除,系统正常启动。。
    每次开启win10虚拟机的时候我都要先在win10虚拟机->硬件->添加pci设备00.20(核显),又删除,才能正常启动,这是什么问题??

    • 10bests
      10bests 2020年8月4日 上午7:15

      @zzzzzzzhohe谢赞,看起来像是配置文件里面添加的核显和GUI里面添加的重复了,排查一下。

    • wishacom
      wishacom 2021年11月2日 下午12:41

      @10bests大佬。怎么解决呢

    • tigers
      tigers 2020年8月17日 下午4:46

      @zzzzzzzhohe同样的问题,等待大佬解答

    • zyh888168
      zyh888168 2021年12月11日 上午5:51

      @zzzzzzzhohe一样的问题,检查了一下,有一个步骤是绑定核显到vfio模块,重新做一下绑定就好了。

    • AZO
      AZO 2022年5月4日 上午2:09

      @zzzzzzzhohe兄弟,同样的问题,每次宿主机重启就会这样,请问你解决了吗

    • gp00
      gp00 2022年5月6日 上午9:13

      @zzzzzzzhohe层主我的问题和你完全一样啊,只要宿主机一重启就必须添加再删除才能启动win10,请问你解决了吗?按zyh888168说的重新绑定没效果呀。

  • eX
    eX 2020年9月7日 下午11:32

    Hi webmaster,
    Can you tell me which PVE version you're using in this tutorial?
    I had follow and tried over hundred times but so no luck, can you help me to take a look what the hell with my igpu?
    http://210.6.104.244/img/1.png
    It always keep in IOMMU group -1. And only can iGFX with remote. But i'm looking for is passthrough 1VM and physical output primary iGPU to monitor. I hv set RDP already.

    PVE 6.2-4, Broadwell E3 v4, and Iris Pro 6300.

    • 10bests
      10bests 2020年9月8日 上午12:27

      @eXHi eX,

      The PVE Version was 6.1-7。

      I have checked your screenshot,the hardware config seens to be quite different with mine, plz be aware that this matters, and so do the order in which the VMs were built,I had tried dozenz of configs before any success.

      As to the IOMMU groups,there is no way you can change it,and devices under same group cann't be assigned to different VMs(IOMMU groups can be separated,which requires luck...lots of luck...)

      Finally,if you are doing this for HTPC,plz make sure that you also check these solutions out:
      PVE Gnome HTPC
      PVE Ubuntu HTPC
      PVE LibreELEC HTPC

  • cheng2624
    cheng2624 2020年9月15日 下午11:05

    我运行update-initramfs -u显示错误如下,运行lsmod | grep vfio也没有任何显示,请问需要做什么检查,谢谢
    root@pve:~# update-initramfs -u
    update-initramfs: Generating /boot/initrd.img-5.4.34-1-pve
    Running hook script 'zz-pve-efiboot'..
    Re-executing '/etc/kernel/postinst.d/zz-pve-efiboot' in new private mount namespace..
    No /etc/kernel/pve-efiboot-uuids found, skipping ESP sync.

    • 10bests
      10bests 2020年9月16日 上午11:51

      @cheng2624先把PVE版本升级到最新吧,核显直通记得是PVE 6.0还是5.8之后的功能。

    • qq12568648
      qq12568648 2021年1月1日 下午12:37

      @10bests我也是这样,最新版的pve

    • bird6
      bird6 2021年4月10日 下午9:16

      @cheng2624我也一样,pve6.3.1

    • 破管
      破管 2021年7月19日 下午10:44

      @bird6我也是一样

    • gp00
      gp00 2022年5月6日 上午9:14

      @cheng2624层主我的问题和你完全一样啊,只要宿主机一重启就必须添加再删除才能启动win10,请问你解决了吗?按zyh888168说的重新绑定没效果呀。

  • ccjsky
    ccjsky 2020年11月12日 下午9:28

    大佬,请教个问题,我upt直通核显没用试了Legacy模式直通核显成功,但有个问题,每次pve开机后都不能直接打开win10,需要添加pci设备启动一次后再删除pci设备就能直通成功,这个有办法解决吗,我想让它自启动

    • 10bests
      10bests 2020年11月12日 下午11:30

      @ccjsky我想到一个思路:对比PVE重启前后虚拟机配置文件是不是有变化,如果有变化的话就用chattr +i保护。我这没碰到你这问题,你测试一下看有没有用。

  • aldkjg
    aldkjg 2021年1月18日 上午12:50

    大佬您好 想請問下
    我使用UTP模式 核顯都正常運作
    但聲卡直通後網卡就無法使用 這有解決辦法嗎

  • pxl
    pxl 2021年2月10日 上午12:08

    华擎j3455没加romfile参数没有视频输出,加了虽然有视频输出但是安装不了核显驱动,死机卡死各种问题

  • hxs
    hxs 2021年2月15日 上午2:43

    我成功直通了4代cpu核显,用的是“Legacy模式直通核显”
    但没有声音,我再加音频设备ich9-intel-hda或者pci设备 00:03.0都不行,找不到音频设备,请问你是怎么解决的,我的是win10系统

  • misc1999
    misc1999 2021年6月30日 上午8:28

    你好,我的主板是微星B460M爆破弹和i3 10100,按照《PVE直通核显搭建虚拟Win10 HTPC避坑指南》步骤做到win10系统安装好显卡驱动和pcl驱动,能正常进系统,就是用那种直通都不能核显输出显示器,每次重启pve显示器都显示Loading
    Linux 5.4.73-1pve... Loading initial ramdisk... 这两行,一启动虚拟的win10系统屏幕就黑屏了,然后我又试了LireElec方案 也是不能核显输出显示器。 最后我试了PVE直接安装Gnome,到下载安装GNOME步骤就一直秒显示失败(100).直通核显太难了o(╥﹏╥)o。能帮找找原因吗

    • 10bests
      10bests 2021年6月30日 上午8:48

      @misc1999你好,GNOME可以换个时间下看看,我当时下的也很纠结,或者挂个代理?

    • 9435
      阿弥陀佛 2021年12月19日 下午9:10

      @misc1999显示器显示Loading initial ramdisk... 是正常的,说明你直通了半前步骤做好了。PVE加载到这里就交出了显示功能了。一启动虚拟的win10系统屏幕就黑屏,你要不断试切换一下配置文件的这代码,看哪一条适合你:
      args: -device vfio-pci,host=00:02.0,addr=0x02,x-vga=on,x-igd-opregion=on
      vga: none

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

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

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

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

    • test
      test 2023年2月10日 下午6:54

      @misc1999不用试了,微星B460不支持pve核显直通,换主板才行。

  • 5212
    5212 2021年7月13日 下午5:07

    你好,我用的cpu是10400,按照你的方法成功了,还直通了个声卡,但是刚开始进win有hdmi音频输出,但是重启win10后,英特尔显示器音频就没了,除了重启PVE,再重启win10,请问有遇到类似的情况吗

  • 5212
    5212 2021年7月13日 下午6:37

    主板是华擎H470ITX双网口,CPU是10400,刚开PVE,然后开win10,机子连电视有音频输出,显示也正常,但是重启win10之后,显示正常,没有电视音频输出了

  • 水寒
    水寒 2021年11月16日 下午1:43

    我已经按照方法直通成功了,但是显示器HDMI不亮是为什么呢?用NOVNC黑屏,用远程连接没问题,求解!

  • 水寒
    水寒 2021年11月16日 下午1:45

    我已经按照方法直通成功了,但是显示器HDMI不亮是为什么呢?用NOVNC黑屏,用远程连接没问题,求解!

  • 9435
    阿弥陀佛 2021年12月19日 下午9:07

    我的是E3 1275L V3 CPU是四代的,换用这个成功实现了WIN10直通核显:
    args: -device vfio-pci,host=00:02.0,addr=0x18,x-vga=on,x-igd-opregion=on
    vga: none
    尝试驱动的时候,有些版本确实经常会掉,每次开机又要重装驱动。
    每次要将显示为默认,或代码=vga: std,这样在PVE下又可以有VNC连接界面出来,
    反复试了好多次。addr=0x20的都不行,vga: non才能直通到显示器。
    之前WIN7会花屏,我直接换成了WIN10 19H44,就好了。

    关于驱动:难找的话用这个助手安装也是可以的,Intel® Driver & Support Assistant,
    我安装的版本 15.40.7.64.4279 的英特尔® Graphics Driver Windows® 10,64 位。
    有好几个版本也可以用。改/etc/pve/nodes/amtf/qemu-server里配置文件的时候是和界面改同步的。
    根据出错信息来断问题很重要!微笑花

  • mnba
    mnba 2022年4月11日 下午9:01

    你好,系统用的uefi集显搞不定,独显能输出画面吗?

    • test
      test 2022年10月17日 下午4:02

      @mnba我也是uefi集显搞不定,后来改用独显很简单,比核显简单100倍,可以输出面面到显示器。