kn69968 发表于 2024-12-23 20:32

DIY 家庭小主机 ALL IN ONE 实验记录(All in Boom 同生共死) (2)——核显虚拟化

长期以来都是小透明和资深潜水党在社区里吸取大佬们的营养和指导, 近日折腾了一下小主机和 aio, 并且将过程整理成教程在社区里发表出来, 不求能够指导别人, 但求别人能有个参考, 并且一起交流学习.
各位说话好听 头发多 精力旺盛 过年涨薪的 佬们 觉得可以的话 就给我点个赞吧.
另外本人热爱分享, 热爱搞机, 馒头 pt 上传100T+,发种100+,做种500+, 做种时间一年(数据准备另开一贴贴出), 希望基于此能得到大佬的厚爱发个邀请:(btschool,聆音, 红叶,emp峨眉派/P0 rNbay都行,), 丰富下自己的下载中心, 再过几周我就可以回来发馒头药了
邮箱: hasdrsafsdeyuo@gmail.com
系列文章目录:
[*](1)PVE安装与卸载
[*](2)核显虚拟化
[*](3)个人云电脑的搭建 vgpu 硬解串流
[*](4)iStoreOS 软路由安装与网络流量分流实验
[*](5)PVE 下以虚拟机方式安装群晖 NAS 的技术可行性探讨
[*](6) NAS / 私服 功能规划与服务搭建
[*]私人网盘/同步备份中心
[*]内容流转中心和家庭影音媒体中心
[*]云笔记知识管理 云密码本 协同办公 和 其他效率服务
[*]将私服暴露到公网, 安全便利地回家及无缝网络服务
[*]PVE 下关于 NAS Linux 等虚拟机的系统管理


可参照或运行本人写的脚本来做。
在 PVE 中将核显虚拟化的目的是拆分成多个 vgpu 供给多个虚拟机使用。需要在 Host(VGPU 提供机器)和 GUEST(使用 VGPU 的机器)上均安装相应的驱动,本文主要讲述如何在 Host 上安装驱动(在虚拟机上如何安装目前只试过 windows 和 群晖, 具体教程见本系列其他文章), 本文的驱动个人也只是针对在 n100 英特尔的核显试验过。
其中所用到的虚拟化技术是 SR-IOV,简介如下,有兴趣的同学可详细了解。
SR-IOV(Single Root I/O Virtualization)是一种硬件虚拟化技术,允许单个物理 PCIe 设备(如网络适配器或图形处理器)在多个虚拟机之间共享。对于 Intel 核显,SR-IOV 允许多个虚拟机共享同一个物理 GPU,从而提高资源利用率和性能。

采用的是 Github 社区上 strongtz 大佬的驱动:i915-sriov-dkms, 该驱动已经针对 pve linux 6.5 内核和 6.8 内核测试通过。开启核显虚拟化需要在 host 和 guest 都安装对应正确的驱动。
整个过程也比较简单
Host (PVE节点) 的操作过程主要包括

[*]BIOS 开启虚拟化相关功能。
[*]安装一些依赖和工具(涉及到底层内核、驱动相关的包)
[*]安装 i915-sriov-dkms GPU 虚拟化 驱动。
[*]开启 PVE 虚拟化功能,配置 GPU 虚拟化相关参数,如 要虚拟化哪个 GPU 设备、要将该物理 GPU 拆分成多少个 GPU
[*]检查效果
[*]想要撤销所有安装副作用的命令,见文末

以下详细说说。
第一步:BIOS 开启相关功能
[*]Intel VMX虚拟化技术 (需要开启)
[*]VT-d (需要开启)
[*]SR-IOV (需要开启)
[*]Above 4GB MMIO Assignment: 开启

本主板的操作过程如下:

[*]重启主机, 并不停地按 Delete 键直到进入 BIOS 界面。
[*]导航到路径 “【Chipset】-> 【VT-d, SR-IOV, Above 4GB MMIO Assignment】” 和 路径 "【CPU Configureation】-> 【Intel VMX虚拟化技术】", 它们全部开启。
[*]F10 保存退出,重启进入 PVE.


第二步:PVE 安装一些工具:在安装前可能有小伙伴会有网络问题,也就是系统的软件源是国外,在国内速度奇慢,可以参考网上一大摞的帖子来修改软件源。
[*]执行如下命令 升级内核 headers
apt install -y pve-headers-$(uname -r) proxmox-kernel-$(uname -r)
2. 安装依赖包apt install -y "build-*" "dkms"
3. 如果想卸载的话apt autoremove -y "pve-headers-$(uname -r)" "proxmox-kernel-$(uname -r)" "build-*" "dkms" "pv" "sysfsutils"
第三步:安装 i915-sriov-dkms GPU 虚拟化 驱动。 此过程参考如下代码及其注释
这里拿一些重要的说说
[*]首先据我看,该驱动支持英特尔的 CPU.
[*]该驱动目前仅有pve 6.5 内核版本和6.8 经过测试!!! 直接拉取最新版的,按照教程命令装就可以,如果有问题,再降级内核版本。固定内核版本,并且重新安装
[*]安装命令如下,其中 -v 参数是指定版本的参数。
dkms install -m i915-sriov-dkms -v 2024.09.21 --force
或者
dkms install -m i915-sriov-dkms -v $(cat VERSION) --force
[*]编译和安装过程会比较漫长。
[*]如果按照网上一些老旧的教程,日期低于 2024/09/21, 可能会遇到错误例如, 编译源码的 make 报错,一些代码有问题,请撤销所有安装的东西,并下载最新的仓库版本安装。
[*]安装成功后 通过 dkms status 命令,你会看到这样的输出
https://picx.zhimg.com/v2-78bb66f891ff91d2a877b1ff54bacfe5_1440w.jpg
执行命令 modinfo i915 | \grep --color vf 则会看到这样的输出
https://pic2.zhimg.com/v2-5cdcd690d403abfd7ee1249d7dbf3ae7_1440w.jpg


command_exists() {
   command -v "$@" 1>/dev/null 2>&1
}

setup_SR_IOV() {
   
   # 检查本驱动 是否支持 CPU 的牌子
   lscpu |\grep -qEi 'vendor.*intel'|| {
         echo "只支持 Intel CPU"
         echo "Only support Intel CPU"
         return 1
   }
   
   # 知晓使用该驱动的风险
   echo "
警告: 这是一个高度实验性的项目,你应该知道自己正在干什么才用它
你需要在 Host 和 guest 系统中都安装 dkms 模块
"
   
   # 创建 临时目录用于拉取 驱动代码仓库
   [ ! -d "$HOME/tmp" ] && mkdir -p "$HOME/tmp"
   pushd $HOME/tmp
   
   # 拉取仓库
   git clone https://github.com/strongtz/i915-sriov-dkms.git
   cd i915-sriov-dkms
   dkms add .
   echo "截止本仓库版本 2024.09.21, 已经测试好内核的版本包括: 6.5 and 6.8"

   # 使用 PV 工具,使得安装驱动过程中能够显示进度
   apt install pv -y 1>/dev/null
   command_exists pv && {
   
         # 正式编译安装该驱动   
         echo && echo "开始安装 i915-sriov-dkms 模块"
         
         # 真正编译和安装的是这一行代码
         #dkms install -m i915-sriov-dkms -v $(cat VERSION) --force
         dkms install -m i915-sriov-dkms -v $(cat VERSION) --force | pv -l -s $(wc -l < <(dkms status i915-sriov-dkms | grep -o 'installing' | wc -l))
   }

   # 检查安装结果
   echo "检查安装结果"
   installation_res=$(dkms status)
   succ_info="i915-sriov-dkms.*$(cat VERSION).*$(uname -r).*installed"

   if echo "$installation_res" | \grep -qE "$succ_info"; then
         echo "安装成功"
   else
         echo "安装失败"
   fi
}
第四步:开启 PVE 虚拟化功能,配置 GPU 虚拟化相关参数

[*]往 /etc/default/grub 中 GRUB_CMDLINE_LINUX_DEFAULT 一行添加参数: intel_iommu=on i915.enable_guc=3 i915.max_vfs=7

原本 /etc/default/grub 该行是这样的

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

更改完成以后是这样的

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 iommu=pt"
[*]安装 sysfsutils 工具来辅助配置 将 gpu 拆分成多少个

apt install -y sysfsutils

通过命令查看哪个 物理 GPU 设备用来虚拟化, 并记录编号,只有四位数字,前导0不用, 如 00:02.

lspci | \grep -i vga

执行如下命令, 并将 ${gpu_id} 替换成你的 GPU 编号,将 ${divided_vgpu_cnt} 替换成你期望拆分后的 vgpu 的数量。1个性能最好,越多越差。

echo "devices/pci0000:00/0000:${gpu_id}.0/sriov_numvfs = ${divided_vgpu_cnt}" > /etc/sysfs.conf
[*]使配置生效, 最后重启

update-grub
update-initramfs -u
reboot
[*]检查拆分结果

lspci | \grep -i vga

将会得到如下输出,02:02.0 使 物理GPU 本体,不可直通,否则其他虚拟GPU消失,00:02.1, 00:02.2 是 VGPU

$ lspci | \grep -i vga​
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N

此时已经成功了,恭喜你!
接着就是在 虚拟机上折腾了。
第五步:如果想要卸载安装,撤销所有副作用,请执行如下命令,



# 撤销上述步骤的影响

   apt autoremove -y "pve-headers-$(uname -r)" "proxmox-kernel-$(uname -r)" "build-*" "dkms" "pv" "sysfsutils"

   for dir in /var/lib/dkms/i915-sriov-dkms*; do
         rm -rf ${dir}
   done

   for dir in /usr/src/i915-sriov-dkms*;do
         rm -rf ${dir}
   done

   sed -rin 's~ i915.enable_guc\=3 i915.max_vfs\=7~~g;' /etc/default/grub


dcl2009 发表于 2024-12-23 20:35

支持一下,挺用心的

tedaz 发表于 2024-12-24 10:40

纯纯高科技,学习了
页: [1]
查看完整版本: DIY 家庭小主机 ALL IN ONE 实验记录(All in Boom 同生共死) (2)——核显虚拟化