什么是直通?
在虚拟化环境中,虚拟机的硬件通常是靠软件模拟的,共享宿主机的硬件资源。这样可以把宿主机的硬件资源分配给多个虚拟机使用。但是,由于不是直接将硬件给虚拟机使用,性能上会有所损失,而且还可能享受不到硬件的某些特定功能。直通就是将指定的宿主机硬件直接交给某个虚拟机独占使用,使这个硬件在这个虚拟机中发挥直接的、最大的性能。当配置了直通之后,这个硬件就不能再给其他虚拟机甚至宿主机使用了。
我的直通需求
我的直通需求主要集中在黑群虚拟机上。首先我需要直通网卡,这是我额外添加一个4口2.5g网卡的主要目的。另外还要直通核显,为黑群开启硬件解码,虽然我觉得这个对我来说意义不大,不过我也没啥其他的核显需求了,直通给黑群算了。再就是直通硬盘,这个好办,一条命令的事,我没有选择直通SATA控制器,因为我主机上的硬盘不打算全都给黑群。直通SATA控制器的好处是可以获得最高的读写效率,缺点是该SATA控制器下的硬盘都跟着一起给了这个虚拟机,其他虚拟机和宿主机都没法用了。直通硬盘确实是虚拟机直接读写该硬盘,不过实际上还是映射给虚拟机,虚拟机没法获取到完整的SMART信息,从而无法监控到硬盘的健康度。这点我觉得倒是没啥,可以在PVE里查看硬盘SMART。
PVE配置PCIE设备直通
PVE默认未开启PCIE设备直通。这时如果向一个虚拟机添加PCIE硬件,就会报错。
1、启动内核IOMMU支持 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream,multifunction iommu=pt video=efifb:off,vesafb:off pci=assign-busses"
简单解释下:
Intel_iommu=on:启用IOMMU功能。AMD CPU要换成amd。
iommu=pt:不是必须的,PT模式只在必要的时候开启设备的IOMMU转换,可以提高未直通设备PCIe的性能,建议添加。这个解释是网上搜到的,我不是很理解。
pcie_acs_override=downstream,multifunction:IOMMU分组。如果没有这一句,我的4口网卡就会被分在同一组,那样的话,几个网口就不能分给不同的虚拟机,分了就只能启动一个。有坛友提到,没有加multifunction也可以实现分组,所以multifunction的作用不甚明了,请知道的大神解释下。
efifb:off:禁用efi启动的显示设备。不直通核显可以不加。
vesafb:off:禁用vesa启动的显示设备。不直通核显可以不加。
保存后命令行运行下面命令更新grub。
update-grub
2、内核加载硬件直通相关模块
/etc/modules vfio vfio_iommu_type1 vfio_pci vfio_virqfd
3、添加驱动黑名单/etc/modprobe.d/pve-blacklist.conf
blacklist snd_hda_intel blacklist snd_hda_codec_hdmi blacklist i915
这些是PVE系统核显相关的驱动,添加到“pve-blacklist.conf”文件后,PVE系统将不加载核显的驱动,重启后PVE主机接显示器键盘鼠标将不再有命令行显示了。
上面几句是intel核显的驱动名称,其他显卡请百度一下,很好找。
4、绑定核显到vfio模块
查看一下自己的核显的供应商和设备ID。命令行运行查看PCIE设备信息命令
lspci -nn
找到核显信息,下面是我的:
00:02.0 VGA compatible controller [0300]:Intel Corporation CometLake-S GT2 [UHD Graphics 630] [8086:3e92]
新建/etc/modprobe.d/vfio.conf
options vfio-pci ids=8086:3e92
不要照抄,记得把ID改成自己的。运行命令更新内核配置信息。
update-initramfs -u -k all
5、重启PVE
检查模块是否正常加载,运行下面命令:
lsmod | grep vfio
应该显示已加载的vfio模块。总的来说,我的直通需求还是比较简单的,所以上面写的步骤并不复杂。我没有用到SR-IOV、GVT-g之类的技术,这些技术可以把一个网卡显卡虚拟成多个子设备透传给虚拟机,大家有兴趣可以尝试下。