找回密码
 加入我们
搜索
      
查看: 1568|回复: 2

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

[复制链接]
发表于 2024-12-23 20:32 | 显示全部楼层 |阅读模式
长期以来都是小透明和资深潜水党在社区里吸取大佬们的营养和指导, 近日折腾了一下小主机和 aio, 并且将过程整理成教程在社区里发表出来, 不求能够指导别人, 但求别人能有个参考, 并且一起交流学习.

各位说话好听 头发多 精力旺盛 过年涨薪的 佬们 觉得可以的话 就给我点个赞吧.

另外本人热爱分享, 热爱搞机, 馒头 pt 上传100T+,发种100+,做种500+, 做种时间一年(数据准备另开一贴贴出), 希望基于此能得到大佬的厚爱发个邀请:(btschool,聆音, 红叶,emp峨眉派/P0 rNbay都行,), 丰富下自己的下载中心, 再过几周我就可以回来发馒头药了


系列文章目录:


可参照或运行本人写的脚本来做。

在 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
  1. apt install -y pve-headers-$(uname -r) proxmox-kernel-$(uname -r)
复制代码

2. 安装依赖包
  1. apt install -y "build-*" "dkms"
复制代码

3. 如果想卸载的话
  1. 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 命令,你会看到这样的输出

执行命令 modinfo i915 | \grep --color vf 则会看到这样的输出



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

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

  28.      # 使用 PV 工具,使得安装驱动过程中能够显示进度
  29.      apt install pv -y 1>/dev/null
  30.      command_exists pv && {
  31.      
  32.          # 正式编译安装该驱动     
  33.          echo && echo "开始安装 i915-sriov-dkms 模块"
  34.          
  35.          # 真正编译和安装的是这一行代码
  36.          #  dkms install -m i915-sriov-dkms -v $(cat VERSION) --force
  37.          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))
  38.      }

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

  43.      if echo "$installation_res" | \grep -qE "$succ_info"; then
  44.          echo "安装成功"
  45.      else
  46.          echo "安装失败"
  47.      fi
  48. }
复制代码

第四步:开启 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 [UHD Graphics]
    00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]

此时已经成功了,恭喜你!

接着就是在 虚拟机上折腾了。

第五步:如果想要卸载安装,撤销所有副作用,请执行如下命令,




  1. # 撤销上述步骤的影响

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

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

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

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


发表于 2024-12-23 20:35 | 显示全部楼层
支持一下,挺用心的
发表于 2024-12-24 10:40 | 显示全部楼层
纯纯高科技,学习了
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-4-26 20:26 , Processed in 0.180588 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表