Unraid 7.3.2 下 NVIDIA 显卡风扇转速调整维护文档

Unraid 7.3.2 下 NVIDIA 显卡风扇转速调整维护文档

适用环境:Unraid 7.3.2(Slackware 系)+ 官方 NVIDIA Driver 插件(ich777)+ NVIDIA 独立显卡

目标:在无显示器(headless)的 NAS 上,通过 nvidia-settings + Coolbits 手动/自动调整 GPU 风扇转速

版本:v1.0 编写日期:2026-10-22


0. 结论速览

项目 结论
nvidia-smi 能否调风扇 ❌ 不能。它只能查看风扇转速,没有任何风扇控制参数
调风扇的正确工具 ✅ nvidia-settings(需 Coolbits 授权)
Unraid 是否自带 X11 ✅ 自带 Xorg 程序包,但默认不启动 X Server(headless)
ssh -X 能否解决 ❌ 不能。X11 转发只是把远端画面送到本地,nvidia-settings 必须连接本机显卡上运行的 Xorg
无头 NAS 的正确做法 ✅ 在本机拉起一个 dummy 虚拟显示器的 Xorg(:0) ,再执行 nvidia-settings
Wayland ❌ 不支持,必须是 X11/Xorg
Windows ❌ 完全行不通,用 MSI Afterburner / NVIDIA App 的风扇曲线

1. 核心概念:别把两种 "X11" 搞混

这是最容易踩的坑,必须先分清:

SSH X11 转发(ssh -X / -Y) Unraid 本机启动 Xorg(DISPLAY=:0)
作用 把远端 GUI 程序画到本地电脑上 在本机显卡上跑一个 X Server
对 nvidia-settings 风扇控制 无效 有效,且必需
依赖 本地有 X Server(Windows 需 Xming 等) 本机 xorg-server + NVIDIA 驱动 + xorg.conf

原因:nvidia-settings 设置风扇时,是通过 NVIDIA 内核驱动的 X 扩展去写硬件寄存器;连接哪个 X Server,就操作哪台机器的显卡。转发到本地的 X Server 上根本没有这张卡,自然什么也改不了。


2. 前置条件检查

SSH 登录 Unraid,root 执行:

bash 复制代码
# 驱动是否正常
nvidia-smi
# 应能看到显卡型号、GPU 编号、Fan 百分比

# Xorg 程序是否存在(7.3.2 默认自带,GUI Mode 依赖它)
which Xorg

# 当前是否已有 X Server 在跑
ps aux | grep -i [X]org
echo "DISPLAY=$DISPLAY"

# nvidia-settings 是否存在(可能需单独安装)
which nvidia-settings

判断标准:

  • nvidia-smi 正常输出 → 驱动 OK,可继续
  • echo $DISPLAY 为空、ps 无 Xorg 进程 → 默认状态:无 X Server,需按方案 A 手动拉起
  • 有 :0 且有 Xorg 进程 → 已有本地 X11(通常是本地接了显示器进了 GUI Mode)

!warning

只有本地接显示器并进入 Unraid GUI Mode 时才会自动拉起 Xorg。日常网页管理(WebUI)是独立 HTTP 服务,与 X11 无关。


3. 方案 A:headless 拉起虚拟 Xorg(推荐)

适合:NAS 无头部署、不接显示器,目标就是调 N 卡风扇。

3.1 编写 Xorg 配置(开启 Coolbits + 虚拟显示器)

创建 /etc/X11/xorg.conf.d/20-nvidia-coolbits.conf:

conf 复制代码
Section "Device"
    Identifier "NVIDIA-GPU0"
    Driver "nvidia"
    Option "Coolbits" "28"
    Option "AllowEmptyInitialConfiguration" "True"
    Option "ConnectedMonitor" "DFP-0"
EndSection

Section "Monitor"
    Identifier "DFP-0"
EndSection

Section "Screen"
    Identifier "Screen0"
    Device "NVIDIA-GPU0"
    Monitor "DFP-0"
EndSection

参数说明:

参数 作用
Coolbits "4" 仅开放风扇控制
Coolbits "28" 风扇 + 功耗墙 + 超频全开(= 4+8+16)
AllowEmptyInitialConfiguration "True" 允许没有显示器的空配置启动,headless 关键项
ConnectedMonitor "DFP-0" 让驱动认为接了显示输出,避免 "no screens found"

!note

不要用 nvidia-xconfig --cool-bits=28 生成配置:Unraid 下它可能未安装或生成的 xorg.conf 会与 GUI Mode 冲突。手写 xorg.conf.d 片段更可控、且优先级明确。

3.2 启动 Xorg

bash 复制代码
Xorg :0 >/var/log/Xorg.headless.log 2>&1 &
sleep 3
export DISPLAY=:0

# 验证 X 是否活了
xdpyinfo | head -n 5

若报 no screens found:查看 /var/log/Xorg.headless.log,多为 BusID 未指定。多卡机器需在 Section "Device" 加上:

conf 复制代码
    BusID "PCI:1:0:0"    # 用 lspci | grep -i vga 查询实际地址

3.3 开启手动风扇控制并设置转速

bash 复制代码
# GPU 0,风扇 0,60%
nvidia-settings -a '[gpu:0]/GPUFanControlState=1' \
                -a '[fan:0]/GPUTargetFanSpeed=60'
  • GPUFanControlState=1 开启手动,=0 恢复自动
  • GPUTargetFanSpeed=60 单位是百分比
  • 多风扇显卡分别设 [fan:1]、[fan:2]...(先用 nvidia-settings -q fans 看有几个)

3.4 验证与恢复

bash 复制代码
# 当前转速(驱动读值)
nvidia-settings -q '[fan:0]/GPUCurrentFanSpeed'
nvidia-settings -q '[gpu:0]/GPUFanControlState'

# nvidia-smi 也能看到 Fan 百分比
nvidia-smi --query-gpu=index,name,temperature.gpu,fan.speed,power.draw --format=csv

# 恢复自动
nvidia-settings -a '[gpu:0]/GPUFanControlState=0'

4. 方案 B:本地接显示器走 GUI Mode

本地接显示器、Unraid 以 GUI Mode 启动时,Xorg 已自动运行(:0),此时:

  1. 在 /boot/config/xorg.conf(或 GUI 使用的 xorg 配置)中加 Option "Coolbits" "28"
  2. 重启进入 GUI Mode
  3. SSH 登录后 export DISPLAY=:0,直接执行 3.3 的命令

缺点:占用一个显示输出、需保持 GUI 会话、功耗略高。仅适合临时调试或本来就有显示器的工作站。


5. 开机自动生效(持久化)

/etc 位于内存盘,重启即失效。持久化有两种做法:

5.1 推荐:User Scripts 插件

新建脚本 nvidia-fan-init,调度设为 At Startup of Array,内容:

bash 复制代码
#!/bin/bash
# 1. 部署 xorg 配置
mkdir -p /etc/X11/xorg.conf.d
cp /boot/config/nvidia-fan/20-nvidia-coolbits.conf /etc/X11/xorg.conf.d/

# 2. 已有 Xorg 就不再重复启动
if ! pgrep -x Xorg >/dev/null; then
    Xorg :0 >/var/log/Xorg.headless.log 2>&1 &
    sleep 5
fi

# 3. 设为手动并给安全初始值
export DISPLAY=:0
nvidia-settings -a '[gpu:0]/GPUFanControlState=1' \
                -a '[fan:0]/GPUTargetFanSpeed=50'

配套文件放 /boot/config/nvidia-fan/20-nvidia-coolbits.conf(内容同 3.1)。

5.2 备选:/boot/config/go

在 go 文件末尾追加调用上面的脚本。注意 go 执行时机较早(阵列未起、部分路径可能未就绪),不如 User Scripts 稳,建议优先 5.1。

!tip

系统更新或重装插件后,先执行一次 nvidia-smi 确认识别到卡,再排查风扇问题。


6. 自动控温脚本(可选)

固定转速风险大,推荐按温度线性调速(带上下限与安全兜底)。

保存为 User Scripts 脚本 nvidia-fan-curve,后台常驻(不要放 Start Array,否则会阻塞阵列启动):

bash 复制代码
#!/bin/bash
export DISPLAY=:0

GPU=0
FAN_MIN=30        # 硬件允许的最低值,多数消费卡约 30%,低于会写失败
FAN_MAX=100
TEMP_LOW=50       # 低于此温度用 FAN_MIN
TEMP_HIGH=78      # 高于此温度用 FAN_MAX

last=0
while true; do
    T=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits -i "$GPU" 2>/dev/null)
    if [ -z "$T" ]; then
        sleep 30; continue      # 驱动异常,别动风扇,等恢复
    fi

    if [ "$T" -le "$TEMP_LOW" ]; then
        S=$FAN_MIN
    elif [ "$T" -ge "$TEMP_HIGH" ]; then
        S=$FAN_MAX
    else
        S=$(( FAN_MIN + (T - TEMP_LOW) * (FAN_MAX - FAN_MIN) / (TEMP_HIGH - TEMP_LOW) ))
    fi

    # 变化 >=3% 才写,减少无效调用
    if [ $(( S - last )) -ge 3 ] || [ $(( last - S )) -ge 3 ]; then
        if nvidia-settings -a "[gpu:$GPU]/GPUFanControlState=1" \
                           -a "[fan:0]/GPUTargetFanSpeed=$S" >/dev/null 2>&1; then
            echo "$(date '+%F %T') temp=${T}C fan=${S}%"
            last=$S
        else
            echo "$(date '+%F %T') WARN set fan failed temp=${T}C"
        fi
    fi
    sleep 15
done

停机前记得恢复自动:

bash 复制代码
nvidia-settings -a '[gpu:0]/GPUFanControlState=0'

7. 命令速查表

目的 命令
查看显卡/风扇 nvidia-smi
查看风扇数量与转速 nvidia-settings -q fans
开启手动 nvidia-settings -a '[gpu:0]/GPUFanControlState=1'
设转速 60% nvidia-settings -a '[fan:0]/GPUTargetFanSpeed=60'
恢复自动 nvidia-settings -a '[gpu:0]/GPUFanControlState=0'
查看 X 是否在跑 pgrep -a Xorg
X 日志 /var/log/Xorg.0.log(或自定义 -logfile)
查询 PCI BusID `lspci
温度曲线 nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits

8. 常见问题排查

现象 排查方向
nvidia-settings 报 "Unable to find device" / "X server not available" DISPLAY 未设置、或本机没有 Xorg 在跑;ssh -X 转发无效
Xorg 启动失败 no screens found 缺 AllowEmptyInitialConfiguration/ConnectedMonitor;多卡需 BusID;看 /var/log/Xorg.*.log 尾部 (EE)
能设但转速不变 Coolbits 没生效(配置未加载/未重启 X);nvidia-settings -q '[gpu:0]/GPUFanControlState' 看是否真为 1
GPUTargetFanSpeed 写入被忽略 低于 VBIOS 下限(多为 30%);原厂卡/笔记本 VBIOS 锁死最低转速
风扇数量与物理不符 部分卡把多风扇做成一个可控通道;nvidia-settings -q fans 为准
阵列启动脚本卡住 风扇脚本必须后台常驻(&),不要放进阻塞式启动流程
重启后配置全丢 /etc 在内存盘,需按第 5 节持久化
专业卡 headless 服务器 可评估 DCGM(dcgm-exporter),消费卡一般不支持风扇控制
升级 Unraid/驱动后失效 重新确认 xorg.conf.d 片段仍在、Coolbits 生效、fans 枚举未变

9. 安全提醒

!danger

手动锁低转速有过热风险。长期固定低转速、或脚本异常退出(风扇停在低值)都可能导致降频甚至硬件损伤。

  • 最低转速不要低于 30%,最好不低于 VBIOS 默认曲线在高温段的水平
  • 设置完成后至少观察 30 分钟:温度、功耗、nvidia-smi 是否有 throttle 原因
  • 建议同时保留 nvidia-smi dmon 或 Unraid 的 GPU 温度监控告警
  • 温度异常时优先恢复自动:GPUFanControlState=0
  • 清理机箱积尘、确认风道,比压转速更有效

10. 回滚步骤

bash 复制代码
# 1. 恢复自动风扇
export DISPLAY=:0
nvidia-settings -a '[gpu:0]/GPUFanControlState=0'

# 2. 停掉常驻脚本(User Scripts 中停用,或)
pkill -f nvidia-fan-curve

# 3. 关闭虚拟 Xorg
pkill -x Xorg

# 4. 移除配置
rm -f /etc/X11/xorg.conf.d/20-nvidia-coolbits.conf
# 并删除 /boot/config/nvidia-fan/ 下的持久化文件与 User Scripts 条目

附:待现场验证项

  1. Unraid 7.3.2 的 NVIDIA Driver 插件是否已内置 nvidia-settings;若缺失需用 NerdTools 或插件补装,版本要与驱动匹配。
  2. 不同驱动版本下 xorg.conf.d 是否会被 GUI Mode 的 xorg.conf 覆盖,建议以实际 /var/log/Xorg.0.log 中 "Using config file" 为准。
  3. 多卡/多风扇卡的实际枚举顺序,以 nvidia-settings -q fans 输出为准,不要凭 nvidia-smi 索引想当然。
相关推荐
张张123y2 小时前
120B 模型单卡跑起来?拆解 Nemotron 3.5 的压缩三板斧与本地智能体部署
nvidia·模型量化·本地部署·ai agent·nemotron
丰色木夕3 天前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
冰山一脚20136 天前
Xorg启动分析笔记
xorg
wflynn16 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
kakakahahahaha19 天前
LoadLibrary failed with error 87 排查:ERROR_INVALID_PARAMETER、DLL路径、架构与显卡驱动
windows·电脑·笔记本电脑·nvidia·软件需求
智码看视界23 天前
AI 推理优化 | Triton Inference Server 架构解析:单机多模型并发推理的工业级方案
nvidia·模型部署·mlops·triton·gpu推理·推理服务化·动态批处理
My的梦想已实现1 个月前
代工显卡驱动更新
nvidia·显卡驱动·魔改·代工显卡
DeeplyMind1 个月前
Part 2.1 — uvm_va_block_t 解剖:每页位图与 PTE 状态
nvidia·uvm
纪伊路上盛名在1 个月前
BioIR:生物大分子结构预测推理库
nvidia·工程化·软件·蛋白质·结构预测·推理库