PVE硬件直通给Deepin Linux

admin2024-01-14  127

参考网上大佬的教程,在PVE里面将核显直通给虚拟机,以达到启动虚拟机之后能输出画面到显示器的效果,然后通过虚拟机安装其他应用,使其能替代电视盒子。弄了好一段时间了,终于直通成功了,但是仍然存在一些问题。

 

首先,Deepin Linux直通成功了,windows不成功,虚拟机可以启动,但没有显示,几分钟之后PVE宿主机重启了,在QQ群里面说了一下情况,群友提醒我说内存不够了吧,然后我就试着修改了虚拟机分配的内存,把原本分配的8G内存,改成了4G,结果真的成功了。而且,没有网络的问题,也通过将虚拟网卡和直通网卡桥接解决了,就是视频信号不稳定,会闪屏。

 

第二,虽然可以输出虚拟机的画面了,跟用物理主机一样,但是PVE失联了,无法通过WEB界面管理PVE,同时虚拟机的网卡不可用,无法连网。

 

这些问题留着以后慢慢解决,先记录一下直通成功的操作过程。

 

PVE硬件直通最开始是要进BIOS设置,打开VT-D功能,不是VT-X,这个在4代及以上的处理器都能支持。教程中说到还要开启CSM功能,但是我所用的机器没有这个功能,就无所谓了。

 

BIOS设置好了之后就是PVE里面的相关操作了。

 

1.修改grub

vi /etc/default/grub

 

将文件中的:GRUB_CMDLINE_LINUX_DEFAULT="quiet"修改成下面这样

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

 

pcie_acs_override=downstream

意思是:用于拆分iommu,pcie 一二槽同时插上时会共享带宽,如果不拆分iommu,当两个设备同时直通,其中一个就会显示占用

 

video=vesafb:off video=efifb:off

意思是:禁止启动和vesa驱动和efi启动的显卡

 

如果是PVE7的话,最好还加上:pcie_acs_override=downstream这一句,强制IOMMU分组,否则可能会因为IOMMU分组重复导致一系列问题。比如,之前就遇到因为分组重复,导致只要启动虚拟机,PVE就失联,无法管理,并且虚拟机也无法正常连网。PVE8就不用加,因为PVE8已经不支持了,加了也没效果。

 

修改完了之后运行命令使grub修改生效

update-grub

 

然后查询一下,IOMMU是否成功开启

命令:dmesg | grep -e DMAR -e IOMMU

 

如果显示有:DMAR: IOMMU enabled,说明IOMMU成功开启

 

2.modprobe设置

vi /etc/modules

 

添加下面的内容:

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

 

修改/etc/modprobe.d/pve-blacklist.conf文件

vi /etc/modprobe.d/pve-blacklist.conf

 

看看有没有如下内容:

blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi

 

有的话就删除,没有的话就不用管,有些处理器可能需要添加以上内容才能正常直通,比如,J4125的处理器。

 

运行命令刷新initramfs并重启PVE,使以上修改生效

update-initramfs -u -k all

reboot

 

3.创建虚拟机,并正常安装系统,安装完系统后关闭虚拟机,然后将显卡、声卡、USB都添加为PCI设备

 

4.修改虚拟机配置文件

vi /etc/pve/qemu-server/<VMID>.conf

VMID就是虚拟机的ID号,PVE的虚拟机ID号是从100开始的,看看要直通硬件的虚拟机ID号是多少,修改成对应的即可。

 

在直通核显一行后面添加“legacy-igd=1”,如下所示

hostpci0: 0000:00:02.0,legacy-igd=1

 

在首行添加以下内容:

args: -set device.hostpci0.x-igd-gms=1

 

操作到这里之后,如果要启动虚拟机的话,需要将虚拟机的显示改成“无”。

 

启动虚拟机(假设虚拟机的ID是102)

qm start 102

 

如果成功了,就会看到显示器显示虚拟机开机画面了。

 

如果前面的操作没有问题,可以增加钩子脚本实现虚拟机关机后直通的硬件返回宿主机。

 

1.克隆相关代码仓库到/root目录,gitee和github二选一

git clone https://gitee.com/hellozhing/pvevm-hooks.git

git clone https://github.com/HelloZhing/pvevm-hooks.git

 

如果无法执行,报错git找不到命令,执行下面的命令安装git

apt-get install git

 

安装完之后再执行上面的克隆代码仓库命令。

 

2.添加可执行权限

cd pvevm-hooks

chmod a+x *.sh *.pl

 

脚本中默认没有启用USB直通返回,如需启用,请取消vm-stop.sh中“echo $usb_addr…”两行注释。

 

如果想要关闭虚拟机之后对宿主机有控制权,还是要启用USB直通返回功能。

cd pvevm-hooks

vi vm-stop.sh

将“echo $usb_addr…”两行注释删除,保存退出即可。

 

3.复制perl脚本至snippets目录

mkdir /var/lib/vz/snippets

cp hooks-igpupt.pl /var/lib/vz/snippets/hooks-igpupt.pl

 

mkdir报错不用管,加上这一条是因为直装PVE7.2没有这个文件夹,而从之前版本升级到7.2会有,PVE8.0的不会报错。

 

4.将钩子脚本应用至虚拟机

qm set <VMID> --hookscript local:snippets/hooks-igpupt.pl

这里的VMID与上面的是一样的。

 

如果想对钩子脚本进行其他修改,可参照脚本与PVE模板文件进行对比 /usr/share/pve-docs/examples/guest-example-hookscript.pl

 

应用钩子脚本后即可实现虚拟机关机后返回到PVE宿主机的显示。

 

PVE8不支持ACS,无法让iommu强制分组,实在是有些蛋疼。除非是自己编译内核,自己编译内核要挂梯子,不然下载会非常慢,内核源码有5G左右的大小,而且编译源码,6核12线程的R5 5600G处理器也需要1个多小时。实在太费时间了。

 

比较折中的办法就是windows里面将虚拟网卡和直通网卡进行桥接,这样虚拟机能上网,也有声音,同时也能访问到PVE的管理界面,比较魔性的就是虚拟网卡必须要添加两块网卡,另外还有一个更蛋疼的问题,就是虚拟机关之后,PVE又双叒叕失联了。必须强行重启宿主机才行。最后就是Linux还不知道要怎么弄才能像windows一样,既能有声音有网络,还能访问PVE管理界面。

 

修改了GRUB,增加了iommu=pt这个参数,同时在pve-blacklist.conf文件中增加了J4125处理器可能需要增加的几条参数:

blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi

 

刚开始还是闪屏,不知道什么时候,突然就正常了。后来经过排查,发现正是添加了blacklist i915才让虚拟机正常显示不闪屏的。但是这又引发一个新的问题。那就是添加了这个参数后,虚拟机关机了,宿主机没有显示。

 

宿主机无显示的原因是屏蔽了i915的显示驱动核心模块,这个又没办法动态修改,因为只要做了屏蔽模块的操作,必须重启才能生效。不知道有没有什么办法可以像Deepin Linux一样的兼容显示。

 

弄来弄去还是windows的显示驱动有问题。只要显卡驱动正常了,马上就开始闪屏,驱动不正常的时候很正常。

 

PVE的管理界面如果想要正常访问,两块虚拟网卡只能用其中一块和直通网卡进行桥接,要是两块一起桥接的话,别的电脑可以访问PVE管得界面,但是虚拟机就无法访问到。

 

最后就是虚拟机关机之后PVE无法访问的问题,可能要修改钩子脚本,再研究研究。

转载请注明原文地址:http://www.198484.com/?read-149.html
0

最新回复(0)