«

【PVE】SR-IOV 核显直通6.8.12-5可用

Frankie 发布于 阅读:46


Grub 是一个引导加载器,当电脑开机时,它会先被载入,然后 GRUB 将负责加载操作系统。内核命令行需要放在变量 GRUB_CMDLINE_LINUX_DEFAULT 文件中 /etc/default/grub 中,打开这个文件进行如下修改:

sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream i915.enable_guc=3 i915.max_vfs=7"' /etc/default/grub

intel_iommu 与 intel_iommu=on:这会启用 Intel 的 IOMMU, IOMMU 是输入 / 输出内存管理单元,主要用于虚拟化情境,允许主机和虚拟机共享硬件资源;
i915.enable_guc=3 与i915.max_vfs=7:Intel i915 驱动所需(来源于所需的内核参数);
video=vesafb:off 与 video=efifb:off:不加载 vesafb 是 veas 设备 的 fb ,efifb 是指 uefi 设备 的 fb ,在 PVE 7.3 之后版本用 initcall_blacklist=sysfb_init 替代(来源于 PVE 7.3 优化和显卡直通);
pcie_acs_override=downstream:是为了将 iommu groups 拆分,方便直通一些板载的设备(来源于加强硬件直通的功能)。这个参数可能在多个虚拟机使用同一 PCIe 设备时有所帮助,通常是在硬件层面上对虚拟机进行隔离;
video=efifb:off,vesafb:off:
efifb:off:禁用 efi 启动的显示设备;
vesafb:off:禁用 legacy 启动的显示设备。

Systemd-boot 引导
对于随 ZFS 一起安装的 EFI 系统,将使用根文件系统 systemd-boot。所有其他部署都使用标准的 Grub 引导加载程序(这通常也适用于安装在 Debian 之上的系统)。systemd-boot 是一个轻量级的 EFI 引导加载程序。它直接从安装它的 EFI 服务分区 (ESP) 读取内核和 initrd 映像。从 ESP 直接加载内核的主要优点是,它不需要重新实现用于访问存储的驱动程序。内核命令行需要作为一行放在 /etc/kernel/cmdline 中,修改如下:

nano /etc/kernel/cmdline

要应用更改,请运行 proxmox-boot-tool 刷新,这会将其设置为 loader/entries/proxmox-*.conf 中所有配置文件的选项行。

proxmox-boot-tool refresh

Running hook script 'proxmox-auto-removal'..
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/AD4C-36C9
Copying kernel and creating boot-entry for 6.8.4-2-pve
Copying and configuring kernels on /dev/disk/by-uuid/AD4C-A52A
Copying kernel and creating boot-entry for 6.8.4-2-pve

验证配置
验证是否成功启用 IOMMU:

dmesg | grep -e DMAR -e IOMMU

验证是否成功启用 IOMMU 中断重映射

dmesg | grep remapping

[ 0.100096] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.101901] DMAR-IR: Enabled IRQ remapping in x2apic mode

加载 vifo 内核模块
/etc/modules 是 Linux 系统中的一个配置文件,它用于列出在启动时应该自动载入的核心模组,这些模组通常是设备驱动或其他特殊功能的驱动,它们不是核心的固定部分,但可能是系统正常运行所需的。
当系统启动时,init 进程或相关的启动服务会读取 /etc/modules 文件,并使用 modprobe 命令来载入其中列出的每一个模组。
例如,如果你有一个特定的硬体设备,如某种无线网卡,它需要一个特定的驱动来运行,但这个驱动不是预设载入的。在这种情况下,你可以将该驱动的模组名称添加到 /etc/modules 文件中,确保每次系统启动时它都会被载入。

打开 /etc/modules 加入如下内容:

nano /etc/modules

vfio:这是 VFIO(Virtual Function I/O)的主模组。 VFIO 是一种提供安全和模块化的方法来访问硬件的框架,通常用于虚拟化;
vfio_iommu_type1:这是 VFIO 的 IOMMU 驱动,它支持 Type 1 (I/O Virtualization);
vfio_pci:这个模组是用于 PCI/PCIe 设备的 VFIO 驱动;
vfio_virqfd:这是一个支持 VFIO 虚拟中断的模组(vfio_virqfd 在 Linux Kernel 6.2 以上版本中无需加载,来源于 Proxmox#Kernel Modules)。

将这些模组添加到 /etc/modules 会确保在系统启动时它们被载入,这通常在设置硬件虚拟化或特定的硬件直通(如 GPU 直通到虚拟机)时是必要的。使得系统在必要时启用 IOMMU 转换,将 iommu 分组相关的内核模块启用,从而可以提高 VM 中未使用的 PCIe 设备的性能。

在完成如上修改后需要刷新 initramfs ,在 Proxmox VE 上,可以通过执行以下命令来完成

update-initramfs -u -k all

SR-IOV 核显虚拟化
添加 Promox 源:

echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve.list apt update

重新安装内核和内核头并切换:

apt install pve-kernel-$(uname -r)

proxmox-boot-tool kernel pin $(uname -r)

apt install pve-headers-$(uname -r)

安装构建工具:

apt install build-* dkms

安装编译环境依赖

apt-get install --no-install-recommends git mokutil sysfsutils -y

apt install --reinstall dkms -y

安装核显驱动
克隆 Linux i915 驱动程序(dkms 模块)仓库到本地,然后执行命令如下:

git clone https://github.com/strongtz/i915-sriov-dkms.git

cd i915-sriov-dkms/

dkms add .

ndkms add -m i915-sriov-dkms -v 2025.01.22 根据上一步的版本号修改

dkms build -m i915-sriov-dkms -v 2025.01.22

dkms install -m i915-sriov-dkms -v 2025.01.22 --force

验证安装状态

dkms status

i915-sriov-dkms/2024.12.30, 6.8.12-5-pve, x86_64: installed
为了启用 VF,必须安装 sysfsutils 以设置 sysfs 属性:

apt install sysfsutils

使用 lspci | grep VGA 查找 iGPU 所在的 PCIe 总线

lspci | grep VGA

添加 VFs 参数如下:

echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3" > /etc/sysfs.conf

下面命令中 sriov_numvfs = 3 的 3 代表 SRIOV 核显数量,可自定义设定(N100 建议最高 3),最多设置 7 个设置为 1 个性能最强,如果设置为 7 个,那么每一个的性能只有 14%。