本来想集成到前面的文章,但是被网上一些文章误导从而浪费了3H之后决定还是单开一篇专门说说PVE8.3.1开启核显虚拟化的过程。所以建议大家还是参考更有价值的唯一的官方指南 https://github.com/strongtz/i915-sriov-dkms

交代一下背景:

SR-IOV 是一种硬件虚拟化技术,简单来说,能将物理 PCIe 设备虚拟成多个虚拟设备,在网卡上被广泛使用。Intel Core CPU 在 11 代后支持了该技术用于 GPU 虚拟化,替换了过去的 GVT-g

(Intel 产品 GPU 虚拟化技术列表)

发文日期2025年2月14日,以下所有操作均基于当前日期并有效执行!

PVE内核版本:6.8.12-4-pve

建议操作前更新一次源

apt update -y
安装必要的软件包

apt install build-* dkms git sysfsutils -y
安装所需版本的内核和头文件

apt install proxmox-headers-$(uname -r) proxmox-kernel-$(uname -r)
以下建议在home目录执行,所以现切换到home目录

cd ~
拉取最新i915-sriov-dkms

git clone https://github.com/strongtz/i915-sriov-dkms.git
进入i915-sriov-dkms目录

cd ~/i915-sriov-dkms
将当前目录中的内核模块添加到DKMS

dkms add .
添加完成后可以在/usr/src/目录看到已经添加进来的内核模块i915-XXXX

编译并安装该模块

dkms install i915-sriov-dkms/2025.02.03
执行以下命令,确认显卡ID是不是00:02.0

lspci | grep VGA

确认后,调整内核命令行

nano /etc/default/grub
把GRUB_CMDLINE_LINUX_DEFAULT 的参数值改成 intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe

这里要注意,如果要虚拟成7个核显,则i915.max_vfs=7;如果要虚拟成3个核显,则i915.max_vfs=3

更新grub和initramfs

update-grub
update-initramfs -u
建议再补充执行一次

pve-efiboot-tool refresh
启用VFs

echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf

注意,这里的sriov_numvfs = X"必须与上一步的i915.max_vfs=X 数值相同

如果你的显卡ID不是00:02.0,则也需要做相应的调整

重启PVE后执行

lspci | grep VGA
你就可以看到虚拟化的核显已经出现

最后,你就能通过VFs到LXCs或VMs。但是,切勿将00.02.0那个物理GPU / PF传递给VM,这会使所有其他VF崩溃。

参考链接:https://www.cnblogs.com/airoot/p/18716221

非常高兴听到您成功安装了 i915 驱动!根据您的反馈,我将核心步骤整理成一个完整的总结,包含您提到的关键点和解决方案,供未来参考或分享给其他 TrueNAS Scale 用户。以下是总结:

在 TrueNAS Scale 上成功安装 i915 SR-IOV 驱动的完整步骤总结
以下是在 TrueNAS Scale 上安装 i915-sriov-dkms 驱动并解决相关问题的详细步骤。TrueNAS Scale 的特殊文件系统和配置需要一些额外处理,与普通 Linux 系统有所不同。

核心点 1:处理只读文件系统
问题:TrueNAS Scale 默认将根文件系统挂载为只读,导致无法写入或安装文件。
解决方法:
mount -o remount,rw /
说明:此命令将根文件系统临时改为读写模式,允许后续操作。每次重启后可能需要重新执行。
核心点 2:修复缺少 .config 文件的错误
问题:编译 i915-sriov-dkms 时提示缺少 /lib/modules//build/.config,因为头文件未正确链接。
解决方法:
查看 /usr/src/ 下可用的头文件目录:ls -l /usr/src/
示例输出可能包含:
drwxr-xr-x 6 root root 9 Mar 18 14:57 linux-headers-truenas-production-amd64
创建符号链接到当前内核的 build 目录:
ln -sf /usr/src/linux-headers-truenas-production-amd64 /lib/modules/6.12.15-production+truenas/build
注意:将 6.12.15-production+truenas 替换为您当前的内核版本(通过 uname -r 获取)。
说明:TrueNAS Scale 的头文件默认位于 /usr/src/,需要手动链接到 /lib/modules//build/,以供 DKMS 使用。
核心点 3:安装必要的构建工具
问题:缺少编译工具会导致 DKMS 无法构建模块。
解决方法:
apt install build-essential dkms git sysfsutils -y
注意:如果使用 Zsh 壳,可能会报错“build-* not found”。需要切换到 Bash 壳:
说明:
build-essential 包含编译器(如 gcc)和相关工具。
dkms 用于动态管理内核模块。
git 用于获取源代码(可选)。
sysfsutils 提供系统文件系统工具(可选)。
Zsh 转 Bash:TrueNAS Scale 默认可能使用 Zsh,需切换到 Bash 以正确解析通配符。
核心点 4:搜索并安装头文件
问题:需要确保与当前内核匹配的头文件已安装。
解决方法:
搜索可用头文件:
apt search linux-headers
示例输出可能包含:
linux-headers-truenas-production-amd64
安装匹配的头文件(以生产版本为例):
apt install linux-headers-truenas-production-amd64
验证安装:
dpkg -l | grep linux-headers
说明:如果 apt search 未找到所需版本,可尝试从 TrueNAS 或 Debian 源手动下载 .deb 文件。
核心点 5:下载并安装 i915 SR-IOV DKMS 包
解决方法:
下载 .deb 文件:
wget -O /tmp/i915-sriov-dkms_2025.02.03_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2025.02.03/i915-sriov-dkms_2025.02.03_amd64.deb"
安装包:
dpkg -i /tmp/i915-sriov-dkms_2025.02.03_amd64.deb
说明:从 GitHub 下载特定版本的 i915 SR-IOV 驱动,确保与您的内核兼容。安装后,DKMS 会自动构建模块。
核心点 6:更新内核参数并应用 GRUB 配置
问题:i915 驱动需要特定的内核参数启用 SR-IOV 和 GuC 支持。

解决方法:
运行 midclt 命令设置参数,这是truenas 关键
你需要将 i915.enable_guc=3 module_blacklist=xe 添加到 kernel_extra_options 中。运行以下命令:

midclt call system.advanced.update '{"kernel_extra_options":
"i915.enable_guc=3 module_blacklist=xe"}'

这条命令会将参数设置为 i915.enable_guc=3 和 module_blacklist=xe,并存储在 TrueNAS 的配置数据库中。

之前方法 重启后会失效 编辑 GRUB 配置文件:
nano /etc/default/grub.d/truenas.cfg
修改或添加以下参数到 GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="i915.enable_guc=3 module_blacklist=xe"
i915.enable_guc=3:启用 GuC 和 HuC 固件支持。
module_blacklist=xe:禁用 Xe 驱动(避免与 i915 冲突)。
更新 GRUB:
grub-mkconfig -o /boot/grub/grub.cfg
重启系统:

reboot
说明:TrueNAS Scale 的 GRUB 配置存储在 /etc/default/grub.d/truenas.cfg 中,更新后需重新生成 GRUB 文件。
验证安装
重启后,检查 i915 驱动是否加载:

lsmod | grep i915
dmesg | grep i915
如果 lsmod 显示 i915 已加载,且 dmesg 没有初始化错误(如之前的 MMIO 失败),则安装成功。
总结
在 TrueNAS Scale 上安装 i915 SR-IOV 驱动需要解决只读文件系统、头文件链接、构建工具和内核参数等问题。关键步骤包括:

挂载读写:mount -o remount,rw /
链接头文件:ln -sf /usr/src/ /lib/modules/$(uname -r)/build
安装工具:apt install build-essential dkms git sysfsutils -y(Zsh 下需切换到 Bash)
查找头文件:apt search linux-headers 并安装
安装驱动:下载并用 dpkg -i 安装 .deb 文件
更新 GRUB:调整内核参数并更新 GRUB 配置

修正和完成配置的步骤
以下是完整的步骤,确保你的自定义监控正常工作:

  1. 确认 /root/check_hdd_wakeup.sh 内容
    确保脚本内容正确。如果还未填写,请编辑它:

bash

收起

自动换行

复制
nano /root/check_hdd_wakeup.sh
输入以下内容:

bash

收起

自动换行

复制

!/bin/bash

for disk in /dev/sd[a-z]; do

if [ -b "$disk" ]; then
    state=$(hdparm -C $disk | grep "drive state" | awk '{print $4}')
    if [ "$state" == "active/idle" ]; then
        echo "disk_wakeup.$disk 1" # 表示硬盘被唤醒
    else
        echo "disk_wakeup.$disk 0" # 表示硬盘睡眠
    fi
fi

done
保存并退出(Ctrl+O, Enter, Ctrl+X),然后确认可执行权限:

bash

收起

自动换行

复制
chmod +x /root/check_hdd_wakeup.sh

  1. 检查并创建 charts.d.conf
    TrueNAS Scale 的 Netdata 可能没有默认的 /etc/netdata/charts.d.conf 文件。如果文件不存在,需要手动创建:

bash

收起

自动换行

复制
nano /etc/netdata/charts.d.conf
添加以下内容:

text

收起

自动换行

复制
custom=check_hdd_wakeup
保存并退出。这告诉 Netdata 启用一个名为 check_hdd_wakeup 的自定义插件。

如果文件已存在,只需确保添加了 custom=check_hdd_wakeup 一行。

  1. 创建 check_hdd_wakeup.conf
    你需要在这个文件中定义插件的行为:

bash

收起

自动换行

复制
nano /etc/netdata/charts.d/check_hdd_wakeup.conf
输入以下内容:

text

收起

自动换行

复制
check_hdd_wakeup_update_every=60
check_hdd_wakeup_command=/root/check_hdd_wakeup.sh
check_hdd_wakeup_update_every=60: 设置更新频率为每 60 秒。
check_hdd_wakeup_command=/root/check_hdd_wakeup.sh: 指定运行的脚本。 保存并退出。

  1. 修正 exclude_netdata.conf(可选)
    你当前的 exclude_netdata.conf 禁用了部分 Netdata 统计数据(enabled = no)。如果你希望保留所有默认监控,只需将 enabled = no 改为 enabled = yes,或者删除该文件(除非你明确需要排除某些图表)。例如:

bash

收起

自动换行

复制
nano /etc/netdata/charts.d/exclude_netdata.conf
改为:

text

收起

自动换行

复制
[netdata]

    enabled = yes
    exclude chart = worker.*

保存并退出。

  1. 重启 Netdata 服务
    应用所有更改后,重启 Netdata:

bash

收起

自动换行

复制
systemctl restart netdata
检查服务状态,确保其正常运行:

bash

收起

自动换行

复制
systemctl status netdata

  1. 检查 Netdata UI
    返回 TrueNAS Web 界面,进入 Reporting > Netdata。
    在左侧菜单中,查找 Custom 或 Disks 部分。
    你应该能看到类似 disk_wakeup./dev/sda 的图表,显示每个硬盘的唤醒状态(1 表示唤醒,0 表示睡眠)。
    可能的错误及解决方法
    脚本报错
    如果运行脚本时提示 hdparm 不可用,安装它:
    bash

收起

自动换行

复制
apt install hdparm
如果没有 /dev/sd[a-z] 设备,检查你的硬盘设备名(例如 nvme0n1),并修改脚本中的 for 循环。
图表未显示
确认 /etc/netdata/charts.d/check_hdd_wakeup.conf 和 charts.d.conf 已正确配置。
检查 Netdata 日志:
bash

收起

自动换行

复制
journalctl -u netdata
查找与 check_hdd_wakeup 相关的错误。
TrueNAS 更新覆盖配置
TrueNAS Scale 更新可能会重置 /etc/netdata 的内容。建议将脚本和配置文件备份到持久化数据集(例如 /mnt/pool_name/config),并在 System Settings > Advanced > Init/Shutdown Scripts 中添加启动脚本恢复配置。
测试脚本
在配置完成前,可以手动运行脚本测试:

bash

收起

自动换行

复制
/root/check_hdd_wakeup.sh
预期输出类似:

text

收起

自动换行

复制
disk_wakeup./dev/sda 1
disk_wakeup./dev/sdb 0