|
本帖最后由 lk_yeah 于 2024-9-23 00:07 编辑
这个直通篇,距离上一个帖子间隔时间有点久,因为我发现直通操作中遇到的疑惑相当多,网上搜到的教程贴都是直接给出操作步骤,很少将原理的,能讲明白的就更少了。所以我操作过程中,即使是搞成功了,经常还是挺懵的。下面我的讲解也是基于我的理解,肯定会有错误和不足,诚心请大家多多指导。
什么是直通?
在虚拟化环境中,虚拟机的硬件通常是靠软件模拟的,共享宿主机的硬件资源。这样可以把宿主机的硬件资源分配给多个虚拟机使用。但是,由于不是直接将硬件给虚拟机使用,性能上会有所损失,而且还可能享受不到硬件的某些特定功能。直通就是将指定的宿主机硬件直接交给某个虚拟机独占使用,使这个硬件在这个虚拟机中发挥直接的、最大的性能。当配置了直通之后,这个硬件就不能再给其他虚拟机甚至宿主机使用了。
我的直通需求
我的直通需求主要集中在黑群虚拟机上。首先我需要直通网卡,这是我额外添加一个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"
复制代码 quiet:让系统在启动过程中输出较少的启动信息,使启动过程看起来更“安静”。Linux系统通常都会默认带这个参数的。
Intel_iommu=on:启用IOMMU(Input/Output Memory Management Unit,输入输出内存管理单元)功能,IOMMU是虚拟化环境中非常关键的一个组件,它允许虚拟机直接访问物理设备(如显卡、硬盘控制器等),而无需通过宿主机的操作系统。这一句是硬件直通最关键的配置。AMD CPU要换成amd。
iommu=pt:允许硬件资源(如PCI设备)直接分配给虚拟机,而无需经过宿主机的干预。这句不是必须的,可以提高直通设备PCIe的性能,PVE手册建议添加。
pcie_acs_override=downstream,multifunction:IOMMU分组。如果没有这一句,我的4口网卡就会被分在同一组,那样的话,几个网口就不能分给不同的虚拟机,分了就只能启动一个。
efifb:off:关闭了EFI帧缓冲。不直通核显可以不加。
vesafb:off:VESA帧缓冲。不直通核显可以不加。
pci=assign-busses: 这个参数使得PCI总线编号在设备分配给虚拟机时重新分配,有助于避免在虚拟机中因PCI总线编号冲突而导致的问题。
保存后命令行运行下面命令更新grub。
2、内核加载硬件直通相关模块
/etc/modules
- vfio
- vfio_iommu_type1
- vfio_pci
- vfio_virqfd
复制代码
3、添加驱动黑名单
添加黑名单的作用是,PVE主机不加载该设备的驱动,将此此设备完全保留给虚拟机使用。
命令行运行:
这条命令将显示主机中所有PCI(E)设备的详细信息。查找其中包含VGA的设备,基本上就是核显了。
这个i915就是核显的驱动模块名称。
再查找“snd”,这是sound的缩写,其中有类似snd_hda_intel之类的,是核显附带的声卡驱动。直通核显,需要把这些都添加到黑名单。
/etc/modprobe.d/pve-blacklist.conf
- blacklist snd_hda_intel
- blacklist snd_hda_codec_hdmi
- blacklist i915
复制代码 这些是intel核显相关的驱动,添加到“pve-blacklist.conf”文件后,PVE系统将不加载核显的驱动,重启后PVE主机接显示器键盘鼠标将不再有命令行显示了。
其他显卡请自行搜索下。
4、绑定核显到vfio模块
查看一下自己的核显的供应商和设备ID。命令行运行查看PCIE设备信息命令
找到核显信息,下面是我的:
- 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
检查模块是否正常加载,运行下面命令:
应该显示已加载的vfio模块。
6、SR-IOV
稍微简单介绍下SR-IOV吧,这个我没用到。这个技术就是可以将某个物理设备虚拟成多个虚拟设备或虚拟端口,为每个虚拟机提供独立的物理通道,这使得虚拟机可以共享物理设备,并在没有CPU和虚拟机管理程序开销的情况下执行I/O,即可跳过中间的虚拟化堆栈(即VMM层),以达到近乎于纯物理环境的性能。你可以这样理解,使用起来不像普通硬件直通那样独占,可以将一个硬件设备分配给多个虚拟机,但不同于向虚拟机分配的普通虚拟设备,它可以获得近乎硬件直通的性能。这个技术多数是给网卡使用的,使用这个技术需要主板、网卡、操作系统都支持才行,PVE系统当然是支持的,主板就不一定了,这个要查询具体型号的主板手册,服务器主板通常都支持,近些年的高端家用主板一般也都是支持的,而网卡,英特尔芯片的网卡普遍支持,小螃蟹的支持程度就不太高了。
确定自己网卡是否支持SR-IOV的方法:
- lspci | grep -i eth //获得网卡总线信息,类似05:00.0
- lspci -s 05:00.0 -v //显示内容包含类似 Single Root I/O Virtualization 之类的内容表示支持SR-IOV
复制代码 我的网卡不支持SR-IOV,不过我也用不到。该技术实现步骤请大家自行搜索吧。
7、GVT-g
再简单说下GVT-g。GVT-g是英特尔为其核显搞出来的虚拟GPU技术,支持从第6代Skylake到第11代Rocket Lake的核显,从第11代Tiger Lake开始,英特尔开始用SR-IOV技术了。N和A也有类似的技术。这个技术跟SR-IOV效果类似,不过也不是没有代价的,多个虚拟机分核显的那点性能,对我来说没啥必要,所以我也没有用到。所以,需要用到GVT-g的小伙伴也请自行搜索资料吧。
总的来说,我的直通需求还是比较简单的,所以上面写的步骤并不复杂。我没有用到SR-IOV、GVT-g,大家有兴趣可以尝试下。另外,我还尝试过虚拟机直通显卡后输出给显示器,用虚拟机打游戏也是可以的,不过因为我没这种需求,只是简单测试下就放弃了。配置直通的问题还是相当多的,更加复杂的直通需求,面临的坑更多,我也遇到一些解决不了的问题,不得不放弃和回避了。希望能够抛砖引玉,大家能把自己折腾的经历发出来,互相探讨。
|
|