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),此时:
- 在
/boot/config/xorg.conf(或 GUI 使用的 xorg 配置)中加Option "Coolbits" "28" - 重启进入 GUI Mode
- 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 条目
附:待现场验证项
- Unraid 7.3.2 的 NVIDIA Driver 插件是否已内置
nvidia-settings;若缺失需用 NerdTools 或插件补装,版本要与驱动匹配。 - 不同驱动版本下
xorg.conf.d是否会被 GUI Mode 的xorg.conf覆盖,建议以实际/var/log/Xorg.0.log中 "Using config file" 为准。 - 多卡/多风扇卡的实际枚举顺序,以
nvidia-settings -q fans输出为准,不要凭nvidia-smi索引想当然。