2025年3月

非常高兴听到您成功安装了 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