Onela@胡邹不胡诌
_

华南 x99 双路主板,实现 PVE 虚拟化和显卡直通

May 19, 2024 · 8 min · PVE

参考文章来源:https://jizhong.plus/post/2024/05/x99-pve-gpu-passthrough.html

1、BIOS虚拟化配置

从 PVE 官网下载好最新的 PVE 8.2 的镜像,然后用 rufus 刻录到 U 盘。然后开机,按 Delete 进入 bios,设置从 U 盘启动,就可以进行系统安装了。

但是在安装 PVE 系统之前,我们先做好几个操作,以保证可能顺利完全虚拟化工作。

启用 VT-D : IntelRCSetup - IIO Configuration - Intel VT for Directed i/o (VT-d)

启用 VMX:IntelRCSetup - Processor Configuration - VMX

启用 4G:Advanced - PCI Subsystem settings - Above 4G Decoding

启用来电启动:IntelRCSetup - PCH Configuration - Restore AC after Power Loss - Power On

禁用 CSM:Advanced - CSM Configuration 将 Other PCI devices、Video、Storage、Network 改成 UEFI,保存设置重启再进来,就可以将 CSM Support 禁用了。此时亮机卡,就需要支持 uefi 了,否则接显示器就没有任何显示,bios 都无法进去,直接黑屏。对于是否一定要禁用 CSM 这一点,笔者认为还有点商榷,有条件的可以在不禁用的情况下多做几次实验。

踩坑提示:禁用 CSM - CSM Configuration - Video是否修改成UEFI需要检查显卡是否支持,否则只能BIOS主板放电重置。

踩坑提示:华南主板放电恢复BIOS出厂设置,拔掉电池等一晚上居然BIOS未被重置,放电技巧:
① 拔掉电源&拔掉主板BIOS电池;② 拔掉主板电源排线(24pin主板电源线);③如果安装有算力GPU卡,拔掉显卡电源线;④ 电池反装之后多按几次开机键恢复出厂设置;
电源以及显卡不断电情况下,电容电量超过1天都不能恢复BIOS出厂。

启用 X2APIC:IntelRCSetup - Processor Configuration - X2APIC

X2APIC 在显卡直通的时候需要

另外就是跑大模型还可能需要 CPU 支持 AVX 指令集,精粤 X99 主板 BIOS 找不到这个设置项,实际上是默认就开启的。但是 AVX 默认无法透传到 PVE 的虚拟机中去,需要在 PVE 里面再进行二次设置。

在上面选项都设置完毕后,直接重启从 U 盘启动,就可以安装 PVE 虚拟化了。安装完成后,通过 IP 地址从浏览器访问 8006 端口,就可以进行一系列操作了。

2、PVE 8.2 安装

U盘启动盘制作省略,参略网上教程,

2.1 安装Proxmox VE (Terminal UI) 遭遇卡住不动无法执行安装PVE 8.2的问题。

在 Proxmox VE (Terminal UI) 那一行上面按 e 进入编辑,然后找到 Linux 开头的那一行,将光标移动到最后,添加参数 nomodeset 保存之后,再执行安装。

注意:命令行末尾添加 nomodeset 参数单次有效,如果重新安装重复此步骤

2.2 安装过程中输入密码以及邮箱键盘字符对不上的问题

安装过程遇到的一个坑,记得先插入网线,通网之后再安装PVE系统,默认应该键盘是美标键盘,键位字符会出现错位的问题。

3、显卡直通

配置显卡直通需要进入 PVE Linux 系统,按照以下步骤执行相关命令。

3.1 开启 IOMMU 功能

配置 GRUB

shell

vi /etc/default/grub
# 找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet",修改为下面这样
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"

更新 GRUB

shell

update-grub

加载对应的内核模块

shell

echo vfio >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules

更新完 GRUB 和内核模块,需要重启 PVE 系统,再进行后续操作。

验证 IOMMU 是否启用

shell

dmesg |grep -E "DMAR|IOMMU"
# 只要在结果中找到 DMAR: IOMMU enabled 就表示已启用
[    0.000000] Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA
[    0.012431] ACPI: DMAR 0x00000000799CEF00 0000E0 (v01 ALASKA A M I    00000001 INTL 20091013)
[    0.012452] ACPI: Reserving DMAR table memory at [mem 0x799cef00-0x799cefdf]
[    0.194040] DMAR: IOMMU enabled
[    0.486870] DMAR: Host address width 46
[    0.486872] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0
[    0.486880] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[    0.486883] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1
[    0.486889] DMAR: dmar1: reg_base_addr c7ffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[    0.486891] DMAR: RMRR base: 0x0000007bb64000 end: 0x0000007bb73fff
[    0.486895] DMAR: ATSR flags: 0x0
[    0.486900] DMAR: RHSA base: 0x000000c7ffc000 proximity domain: 0x0
[    0.486902] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x1
[    0.486904] DMAR-IR: IOAPIC id 3 under DRHD base  0xfbffc000 IOMMU 0
[    0.486906] DMAR-IR: IOAPIC id 1 under DRHD base  0xc7ffc000 IOMMU 1
[    0.486907] DMAR-IR: IOAPIC id 2 under DRHD base  0xc7ffc000 IOMMU 1
[    0.486909] DMAR-IR: HPET id 0 under DRHD base 0xc7ffc000
[    0.486911] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.487808] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.911154] DMAR: No SATC found
[    0.911160] DMAR: dmar1: Using Queued invalidation
[    0.925519] DMAR: Intel(R) Virtualization Technology for Directed I/O

验证 VFIO 模块

shell

dmesg | grep -i vfio
# 在结果中出现 VFIO - User Level meta-driver version: 0.3 就表示 ok
[    3.051565] VFIO - User Level meta-driver version: 0.3
[   25.111987] vfio-pci 0000:02:00.0: Enabling HDA controller
[   25.112000] vfio-pci 0000:02:00.0: enabling device (0100 -> 0102)
[59730.787175] vfio-pci 0000:02:00.0: Enabling HDA controller
[59737.253825] vfio-pci 0000:02:00.0: Enabling HDA controller
[62480.031653] vfio-pci 0000:02:00.0: Enabling HDA controller
[62486.430721] vfio-pci 0000:02:00.0: Enabling HDA controller
[645526.396007] vfio-pci 0000:02:00.0: Enabling HDA controller
[645532.880181] vfio-pci 0000:02:00.0: Enabling HDA controller

验证是否支持中断映射

shell

dmesg | grep 'remapping'
# 这里就是验证前面在 bios 配置的 x2apic。如果 x2apic 启用了,则会输出以下结果
[    0.486911] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.487808] DMAR-IR: Enabled IRQ remapping in x2apic mode

允许不安全的中断

shell

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

为 NVIDIA 显卡添加稳定性优化

shell

echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

主要防止虚拟机异常影响到宿主机。

屏蔽默认驱动,直通显卡

shell

echo "# NVIDIA" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "" >> /etc/modprobe.d/blacklist.conf

适用于 NVIDIA 显卡,如果是 AMD 显卡是有差异的。

更新内核引导文件

shell

update-initramfs -k all -u

更新完成后,重启系统就可以了。

重启完成后,进入 pve web 控制台,就可以为某个虚拟机单独配置显卡了。

img

img

添加显卡成功后,需要先关机,再开机,直接重启是无效的。重新开机后,进入系统就可以安装对应的显卡驱动和 CUDA 了。

shell

# 查看显卡信息
nvidia-smi

img

4、踩坑点

4.1、AVX 指令集

在笔者安装好虚拟机之后,执行 lscpu 发现没有 AVX。但笔者的 CPU 是确定支持的,问了主板方,也说默认启用了。后来发现这东西还要去 PVE 里设置。因为在 PVE 系统这执行 lscpu 是确定有 AVX 的。解决这个问题只要登录 PVE 控制台,将 CPU 类别改成 host 即可。

img

4.2、显卡直通后卡在 Loading 界面

显卡设置直通后,启动 PVE 系统会卡在 Loading initial ramdisk … 界面,不出现系统登录界面。这个是正常情况,实际上 PVE 系统已经启动了,通过 ssh 工具或者浏览器访问就可以了。 img]

5、急救恢复

如果在更新完 GRUB 或内核引导文件重启后无法进入系统,可以使用 U 盘,进入 recovery mode 进行修复。

Edit this page on GitHub Last updated: 2024/6/6 09:24:47