PVE虚拟机核显直通及返回宿主机显示
时间:2023-06-25 15:18:01 | 来源:网站运营
时间:2023-06-25 15:18:01 来源:网站运营
PVE虚拟机核显直通及返回宿主机显示:本文是我的视频《
PVE虚拟机核显直通及返回宿主机显示钩子脚本》的文字说明版,如果有看不明白的地方,可以参照我视频中的操作。
首先介绍一下我的PVE核显直通方案能够实现怎样的效果。
1. 可以正常驱动,对核显驱动版本没有特别需求,OpenCL使用正常。
2. 显示器能输出画面和HDMI音频,分辨率正常,可以显示虚拟机开机画面。
3. PVE开机能够正常显示,对于大多硬件配置还能在PVE上安装KDE界面不受影响。
4. 虚拟机关机后直通的硬件返回到宿主机,PVE恢复正常显示输出。
注:
本文操作在PVE7.2下没有问题,选择PVE7.1.8是有其他的原因。
硬件平台及BIOS设置
本篇仅针对支持legacy启动的intel核显机器,建议intel 7~10代。
我们知道11代开始intel核显只支持UEFI启动,很多人说核显不能直通了…其实不对,关于纯UEFI启动的核显直通会有一些差别,这个以后再讲。(目前我已经在N5105工控机上实现了UEFI启动核显直通Windows虚拟机,但还不太完善)
BIOS设置
首先确保VT-D是启用的状态,然后要开启CSM,PCI或Video等项目选择legacy
主板BIOS中引导选项,选择对应硬盘项,不要选择UEFI。
如果选择UEFI,在安装图形界面后,直通核显可能会出现Failed to mmap 0000:00:02.0 BAR 2. Performance may be slow 这样的错误。
在安装了独显的情况下,要直通核显输出请启用“IGPU多监视器”,并将主图形适配器设置为“板载”
PVE直通设置
简单说,就是只对IOMMU和Kernel Modules进行基本的配置,不要屏蔽核显和声卡
修改/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
如果你之前添加了”video=efifb:off,vesafb:off”请删除
运行命令使grub修改生效
update-grub
modprobe设置
修改/etc/modules,添加以下内容(非必需,虚拟机直通时会自动加载相关模块)
vfiovfio_iommu_type1vfio_pcivfio_virqfd
看看你是否在黑名单中添加了下面的内容
修改/etc/modprobe.d/pve-blacklist.conf,
删除以下内容某些硬件(比如J4125)需要添加以下内容才能输出正常分辨率和HDMI音频,此类硬件可能不能实现本文完整效果。
blacklist i915blacklist snd_hda_intelblacklist snd_hda_codec_hdmi
如果您此前将核显和声卡ID添加到vfio,
请删除/etc/modprobe.d/vfio.conf运行命令刷新initramfs,使以上修改生效
update-initramfs -u -k all
Win虚拟机设置
重启PVE之后新建Windows虚拟机
BIOS设置为默认的“SeaBIOS”,显示设置为“无”,机型设置为“i440fx”
直接通过web页面添加核显、声卡等PCI设备
如果需要直通NVME固态硬盘,目前需要将pve-qemu-kvm降级至6.1.1-2(截止6.2.0-10较新版本均不可直通NVME)
apt updateapt install pve-qemu-kvm=6.1.1-2
虚拟机添加CD驱动器,挂载Windows系统安装ISO镜像
https://github.com/AveYo/MediaCreationTool.bat以及VirtIO驱动ISO镜像
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
启动虚拟机,即可在物理显示器中使用键鼠安装系统。
系统安装完成后,打开挂载的VirtIO驱动盘安装相关驱动,然后可以直接通过Windows更新自动安装核显驱动。
注意:驱动安装完成后,请务必关闭系统休眠。
现在虚拟机核显已经可以正常使用了,OpenCL正常。
钩子脚本设置
如果前面的操作没有问题,可以增加钩子脚本实现虚拟机关机后直通的硬件返回宿主机。
克隆我的相关代码仓库到/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-hookschmod 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/snippetscp 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宿主机的显示。
PVE图形界面相关
我们知道PVE是基于Debian的,所以可以像普通Debian一样安装图形界面,在安装图形界面后需要做以下修改。
vfio-startup.sh和vfio-teardown.sh 默认情况下不会被调用,但在PVE安装图形界面的情况下,就需要用到这两个脚本。
取消vm-start.sh中(dirname0)/vfio-startup.sh该行注释
取消vm-stop.sh中(dirname0)/vfio-teardown.sh该行注释
感谢 @ledisthebest 提供的脚本vfio-startup.sh和vfio-teardown.sh
重要设置
PVE安装图形界面后与LXC会有冲突,导致启动LXC时CPU占用过高
运行以下命令停用udisks2服务可解决这一问题
systemctl mask udisks2.servicesystemctl stop udisks2.service
KDE桌面启动虚拟机图标
输入以下命令创建脚本并赋予可执行权限
echo -e '#!/bin/bash/nqm start <VMID> &' > start_win.shchmod a+x start_win.sh
桌面新建“链接到应用程序”,应用程序命令中选择创建的脚本,“高级选项”中“用户”填写“root”
双击图标,输入密码即可启动Windows虚拟机
PVE平台基于legacy启动的核显直通基本就是这样了,之后可以和大家聊聊怎么给PVE安装KDE图形界面,以及KDE界面下输入法和浏览器视频硬解等操作。
至于较新平台UEFI启动的核显直通操作,11代及之后硬件和N5105之类的工控机需要基于UEFI做核显直通,(其实10代及之前的硬件做UEFI核显直通也有一个好处,就是能安装黑苹果)等我弄得比较清楚了再来和大家分享。