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

最近想学习大模型,租用云服务器费用太高,就自己组装了一台“洋垃圾”,总计四千七。今天笔者就分享一下装机过程和搞虚拟化时踩过的一些坑。

所谓的电脑洋垃圾,说白点就是翻新二手产品组装而成的一台电脑,这里的洋垃圾多指CPU,是由国外服务器淘汰下来的intel志强CPU,这些CPU型号基本停产了大几年,市场早就没有在售了,淘汰之后运来中国进行二次销售,价格十分低廉,一颗洋垃圾志强系列CPU从几块钱到几十元不等。

1、装机

配置如下

序号 名称 规格
1 系统盘 爱国者M2高速NVME固态硬盘512G笔记本电脑m.2接口ssd台式机 512GB-读速7050MB/S 写入量900TBW
2 数据盘 WD 10T 国行 硬盘SATA电脑NAS台式机10TB WD 10T 国行到2025年6月 256M缓存
3 CPU 至强E5-2697V4【2.3G 18核】服务器CPU * 2
4 CPU 散热器 6热管CPU散热器1155静音风冷AMD台式电脑CPU风扇2011X79X99塔式I5 * 2
5 GPU P100 8G 16G显存
6 显卡散热器 tesla p40 m40 p100显卡散热改装超薄双涡轮风扇版
7 内存 三星32G 2R*4 2666V 服务器内存X99 * 2
8 主板 精粤X99-8D4 2.5G 双路大板 八通道 双网卡
9 电源 Great Wall长城巨龙1250w 电竞版 2021年带模组线
10 机箱 CZ0015 「积至EVESKY 双路王 电脑台式全景侧透E-ATX多开游戏电竞机箱」 + 4 风扇
11 亮机卡 GTX 750TI 2G uefi 启动

因为是从垃圾堆捡出来的,GPU 花了八百多一点,CPU 七百。主板安装如下图。

从图片可以看出,机箱买小了,主板放下去刚好到边了,导致有点拥挤,如果将来将扩容,可能会显得特别拥挤,也不利于散热。等后面有条件了,再换一个大点的。机箱价格百元出头。

另外就是 GPU 是加速卡,不出图形卡,所以还需要一张亮机卡来电量机器。笔者最开始就没买,导致装机好了用不了,还是找朋友借的亮机卡来点亮。但由于后面搞虚拟化的时候,需要开启 uefi 启动,朋友的亮机卡又不支持,就导致每次设置后,都要去 bios 来回切换启动方式。最终还是重新下单了一个 GTX 750TI 来做亮机卡,以支持 utfi 启动。

这是最终组装完毕的图,显得特别拥挤。导致之前机箱配的 4 个风扇都安装不下了。

2、虚拟化

从 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 - PCH Devices - PCH state after G3

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

启用 X2APIC:IntelRCSetup - Processor Configuration - X2APIC

X2APIC 在显卡直通的时候需要

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

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

3、显卡直通

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

3.1 开启 IOMMU 功能

配置 GRUB

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

update-grub

加载对应的内核模块

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

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

验证 IOMMU 是否启用

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 模块

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

验证是否支持中断映射

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

允许不安全的中断

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

为 NVIDIA 显卡添加稳定性优化

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

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

屏蔽默认驱动,直通显卡

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 显卡是有差异的。

更新内核引导文件

update-initramfs -k all -u

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

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

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

# 查看显卡信息
nvidia-smi

4、踩坑点

4.1、AVX 指令集

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

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

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

5、急救恢复

如果在更新完 GRUB 或修改某个文件重启后无法进入系统,可以在 PVE 开机时的引导界面,进入 recovery mode 进行修复。

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:精粤 x99 双路主板,实现 PVE 虚拟化和显卡直通

本文地址:https://jizhong.plus/post/2024/05/x99-pve-gpu-passthrough.html