一、GPU 直通与虚拟化
典型的 GPU 直通将整个 PCIe 图形设备传递到 VM。这意味着只有一个 VM 可以使用 GPU 资源。这样做的优点是能够通过计算机的 HDMI 或 DisplayPort 端口将视频显示输出到外部显示器,但是,您只能有一个使用 GPU 的 VM,如果您希望在台式计算机上使用 Proxmox,但又希望通过外部显示器充分利用主桌面操作系统的 GPU 资源,这将非常有用。
但是,有一种方法可以在 VM 之间共享 GPU。该技术称为英特尔 VT-d(英特尔定向 I/O 虚拟化技术),可实现 GPU 资源的虚拟化,并为多达 7 个虚拟机提供 VF(虚拟功能),这样,(最多)7 个 VM 可以同时使用 GPU,但您将无法使用物理连接的监视器,因此,只能对这些 VM 进行远程桌面访问。
完整的 GPU 直通和 vGPU 设置都有其一席之地。这完全取决于您希望设置做什么。
二、开启核显 SR-IOV
SR-IOV 是一种硬件虚拟化技术,简单来说,能将物理 PCIe 设备虚拟成多个虚拟设备,在网卡上被广泛使用。Intel Core CPU 在 11 代后支持了该技术用于 GPU 虚拟化,替换了过去的 GVT-g(Intel 产品 GPU 虚拟化技术列表)
1、开启 SR-IOV 主要用到这个驱动程序:i915-sriov-dkms,能够创建最多 7 个 VF(可以简单理解为 vGPU)
在 Proxmox 主机上,打开 shell 并运行以下命令。首先,我们需要安装 Git、内核头文件,做一些清理,然后使用正确的版本设置内核变量。
apt update && apt install git pve-headers mokutil -y
rm -rf /var/lib/dkms/i915-sriov-dkms*
rm -rf /usr/src/i915-sriov-dkms*
rm -rf ~/i915-sriov-dkms
KERNEL=$(uname -r); KERNEL=${KERNEL%-pve}
2、现在我们需要克隆 DKMS 仓库并修改配置文件以设置内核版本,检查软件包名称是否为 i915-sriov-dkms,并且软件包版本是否与您的内核版本匹配。
cd ~
git clone https://github.com/strongtz/i915-sriov-dkms.git
cd ~/i915-sriov-dkms
cp -a ~/i915-sriov-dkms/dkms.conf{,.bak}
sed -i 's/"@_PKGBASE@"/"i915-sriov-dkms"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/"@PKGVER@"/"'"$KERNEL"'"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/ -j$(nproc)//g' ~/i915-sriov-dkms/dkms.conf
cat ~/i915-sriov-dkms/dkms.conf
3、在这里,我们安装 DKMS,链接内核源代码,并检查状态。验证内核是否显示为已添加。
apt install --reinstall dkms -y
dkms add .
cd /usr/src/i915-sriov-dkms-$KERNEL
dkms status
4、现在让我们构建新内核并检查状态。验证它是否显示已安装。
dkms install -m i915-sriov-dkms -v $KERNEL -k $(uname -r) --force -j 1
dkms status
5、对于全新安装的 Proxmox 8.1 及更高版本,可以启用安全启动。以防万一,我们需要加载 DKMS 密钥,以便内核加载模块。运行以下命令,然后输入密码。此密码仅用于 MOK 设置,并在您重新引导主机时再次使用,之后,就不需要密码了。它不需要与您用于 root 帐户的密码相同。
mokutil --import /var/lib/dkms/mok.pub
三、Proxmox GRUB 配置
注意: Proxmox 的默认安装使用 GRUB 引导加载程序。如果这是您的情况,请按照本节中的步骤操作。如果您使用的是 ZFS 或其他使用 systemd 引导加载程序的配置,请跳到下面的 systemd 部分。
1. 返回 Proxmox shell,如果您的 Proxmox 主机中没有 Google Coral PCIe TPU,请运行以下命令。你会知道你是否这样做了,所以如果你不确定,请运行第一个命令块。如果您的 Google Coral 是 USB,请同时使用第一个命令块。如果您的 Google Coral 是 PCIe 模块,请运行第二个命令块。
cp -a /etc/default/grub{,.bak}
sudo sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7"' /etc/default/grub
update-grub
update-initramfs -u -k all
apt install sysfsutils -y
如果您的 Proxmox 主机确实具有 Google Coral PCIe TPU,并且您正在使用 PCIe 直通到 LXC 或 VM,请改用此命令。这会在 Proxmox 主机级别将 Coral 设备列入黑名单,以便您的 LXC/VM 可以获得独占访问权限。
cp -a /etc/default/grub{,.bak}
sudo sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7 initcall_blacklist=sysfb_init pcie_aspm=off"' /etc/default/grub
update-grub
update-initramfs -u -k all
apt install sysfsutils -y
2、现在我们需要找到显卡在哪个PCIe总线上。通常为 00:02.0。
lspci | grep VGA
3、运行以下命令并根据需要修改 PCIe 总线。在本例中,我使用的是 00:02.0。若要验证文件是否已修改,请对文件进行 cat 操作并确保它已被修改。
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
cat /etc/sysfs.conf
四、Proxmox SystemD 引导加载程序
注意:如果您的 Proxmox 主机不使用 GRUB 引导(默认),而是使用 systemd,请按照以下步骤操作。如果您使用的是 ZFS,则很可能是这种情况。如果您使用的是 GRUB,请跳过此部分。
1、让我们修改内核加载器命令行:
nano /etc/kernel/cmdline
2、将以下文本添加到当前行的末尾。
intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
3、运行以下命令以更新引导加载程序。
proxmox-boot-tool refresh
五、完成PCI配置
1、现在我们需要找到显卡在哪个PCIe总线上。通常为 00:02.0
2、运行以下命令并根据需要修改 PCIe 总线号。在本例中,我使用的是 00:02.0。若要验证文件是否已修改,请对文件进行 cat 操作并确保它已被修改。
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
cat /etc/sysfs.conf
3、重新启动 Proxmox 主机。如果将 Proxmox 8.1 或更高版本与安全启动一起使用,则必须设置 MOK。当 Proxmox 主机重新启动时,监视启动过程并等待“执行 MOK 管理”窗口(下面的屏幕截图)。如果错过了第一次重新启动,则需要重新运行 mokutil 命令并再次重新启动。在您完成此设置之前,DKMS 模块不会加载。
4、选择注册 MOK、继续、是、<密码>、重新启动。
5、登录到 Proxmox 主机,打开 Shell,然后运行以下命令。第一个应返回 8 行 PCIe 设备。第二个命令应返回大量日志数据。如果一切顺利,最后您应该会看到次要 PCIe ID 1-7,最后是 Enabled 7 VF。如果您使用的是安全启动,但没有看到 7 个 VF,则 DKMS 模块可能未加载,根据需要进行故障排除。
lspci | grep VGA
dmesg | grep i915
6、现在 Proxmox 主机已准备就绪,我们可以安装和配置 Windows 11。如果您没有看到启用了 7 个 VF,请停止。根据需要进行故障排除。如果您使用的是安全启动,但没有看到 7 个 VF,请仔细检查 MOK 配置。