一直想把机顶盒的功能集成到PVE的虚拟机之中,但是PVE是命令行的系统,虚拟机都是在后台运行的,根本不会有图形界面显示。就算安装了安卓系统,也无法让虚拟机输出显示信号到电视或显示器。但是,如果能够将显卡直通,就可以做到将虚拟机的显示信号输出到显示设备上来。折腾了几次,都失败了,每次弄完都把PVE系统给弄挂掉,然后重装,又继续折腾。还好有一台闲置的电脑做实验。前几次折腾的过程都没有记录,瞎弄的。看过两位大佬的文章之后,稍微有了点眉目,再折腾一下,把步骤记录下来,看看哪里出了问题。
首先,PVE因为是基于Debian的,vi命令有点不太习惯,需要修改一下:
编辑vimrc.tiny文件
vi /etc/vim/vimrc.tiny
将set compatible这句修改成:
set nocompatible
保存退出即可。
修改好之后,开始硬件直通的相关操作。
1. 确认自己的电脑主板及CPU能支持VT-D功能,不支持就搞不了直通。intel要b75以上芯片组才支持。也就是说intel4代酷睿处理器以上,都支持。amd不明。
VT-D是io虚拟化。不是VT-X
大佬说:有很多新手,以为主板开启虚拟化功能,就能直通了,其实不是!要开启VT-D才能io虚拟化。AMD平台是iommu,某些OEM主板上叫SRIOV。请注意。
2. 开启iommu:
编辑grub,请不要盲目改。根据自己的环境,选择设置
vi /etc/default/grub
在里面找到:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
然后修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
如果是amd cpu请改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
据说增加了iommu=pt的参数之后,性能更好一些。
修改完成之后,直接更新grub
update-grub
3. modprobe设置
修改/etc/modules,添加以下内容(非必需,虚拟机直通时会自动加载相关模块)
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
修改/etc/modprobe.d/pve-blacklist.conf,删除以下内容,没有的话就不用管。
blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
某些硬件(比如J4125)需要添加以上内容才能输出正常分辨率和HDMI音频,此类硬件可能不能实现本文完整效果。
如果您此前将核显和声卡ID添加到vfio,请删除/etc/modprobe.d/vfio.conf
运行命令刷新initramfs,使以上修改生效
update-initramfs -u -k all
4. 验证是否开启iommu
重启之后,在终端输入
dmesg | grep iommu
出现如下例子。则代表成功
[ 1.341100] pci 0000:00:00.0: Adding to iommu group 0
[ 1.341116] pci 0000:00:01.0: Adding to iommu group 1
[ 1.341126] pci 0000:00:02.0: Adding to iommu group 2
[ 1.341137] pci 0000:00:14.0: Adding to iommu group 3
[ 1.341146] pci 0000:00:17.0: Adding to iommu group 4
此时输入命令
find /sys/kernel/iommu_groups/ -type l
出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
5. Win虚拟机设置
重启PVE之后新建Windows虚拟机
BIOS设置为默认的“SeaBIOS”,显示设置为“无”,机型设置为“i440fx”
直接通过web页面添加核显、声卡等PCI设备
如果需要直通NVME固态硬盘,目前需要将pve-qemu-kvm降级至6.1.1-2(截止6.2.0-10较新版本均不可直通NVME)
apt update
apt install pve-qemu-kvm=6.1.1-2
虚拟机添加CD驱动器,挂载Windows系统安装ISO镜像
以及VirtIO驱动ISO镜像,下面是下载地址,这个驱动貌似只有windows用得上。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
编辑/etc/pve/qemu-server/<VMID>.conf
在直通核显一行后面添加“legacy-igd=1”,如下所示
hostpci0: 0000:00:02.0,legacy-igd=1
J4125之类的硬件可能需要加载romfile,不然可能会有显示器分辨率和HDMI音频的问题。
这类需要romfile的机器,/sys/bus/pci/devices/0000:00:02.0/下并没有rom,需要从主板bios中提取vbios
经网友测试,即使硬件没问题,如果新安装的PVE没进行过更新,/sys/bus/pci/devices/0000:00:02.0/rom也可能不存在,这时直通就会不成功。
请在安装PVE后进行必要的更新,重启后再看,如果rom存在,那么大概率不需要romfile。
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=vbios.bin
在首行添加以下内容
args: -set device.hostpci0.x-igd-gms=1
6. 启动虚拟机,即可在物理显示器中使用键鼠安装系统。
系统安装完成后,打开挂载的VirtIO驱动盘安装相关驱动,然后可以直接通过Windows更新自动安装核显驱动。
注意:驱动安装完成后,请务必关闭系统休眠。
现在虚拟机核显已经可以正常使用了,OpenCL正常。
7. 钩子脚本设置
如果前面的操作没有问题,可以增加钩子脚本实现虚拟机关机后直通的硬件返回宿主机。
克隆我的相关代码仓库到/root目录,gitee和github二选一
gitee:
git clone https://gitee.com/hellozhing/pvevm-hooks.git
github:
git clone https://github.com/HelloZhing/pvevm-hooks.git
添加可执行权限
cd pvevm-hooks
chmod a+x *.sh *.pl
vm-start.sh和vm-stop.sh在视频中基础上进行过修改,会自动识别核显ID和声卡addr。
现在既可以适应我上面的直通方面也能适应q35(UPT)直通方案。
脚本中默认没有启用USB直通返回,如需启用,请取消vm-stop.sh中“echo $usb_addr…”两行注释。
复制perl脚本至snippets目录
mkdir报错不用管,加上这一条是因为直装PVE7.2没有这个文件夹,而从之前版本升级到7.2会有
mkdir /var/lib/vz/snippets
cp hooks-igpupt.pl /var/lib/vz/snippets/hooks-igpupt.pl
将钩子脚本应用至虚拟机
qm set <VMID> --hookscript local:snippets/hooks-igpupt.pl
如果你想对钩子脚本进行其他修改,可参照我的脚本与PVE模板文件进行对比 /usr/share/pve-docs/examples/guest-example-hookscript.pl
应用钩子脚本后即可实现虚拟机关机后返回到PVE宿主机的显示。
按照以上教程弄过了,windows没有成功,Deepin Linux成功了,可能是windows没有提前把系统安装好,Deepin Linux是提前安装好了的,大佬说直通成功了可以直接用鼠标键盘在宿主机上操作虚拟机进行系统安装,但是windows就是无法成功启动。以后再折腾。