飞牛(FNOS)Tesla P4驱动安装指南
本文适用于飞牛 FnOS 1.1.x(Debian 12 Bookworm)+ Tesla P4(GP104GL, Pascal),使用 NVIDIA R580 LTS(580.126.20,支持至 2028.08)官方 .run 安装器替代问题较多的飞牛商店驱动,并配置 Docker GPU 支持与风扇自动调速。
为什么不用商店驱动
飞牛商店的 Nvidia-Driver-560 存在以下问题:
| 问题 |
影响 |
库文件权限为 660,属主 conversun:Users |
Plex/Emby 等应用用户无法访问 GPU |
| 库文件是独立副本而非符号链接 |
nvidia-container-toolkit 无法正常工作 |
安装后未执行 ldconfig |
动态链接器找不到 NVIDIA 库 |
| 驱动版本 560.28.03 已 EOL |
无安全补丁和 bug 修复 |
使用 NVIDIA 官方 .run 安装器可完全避免上述问题。
前置条件
1 2 3 4 5 6 7 8 9 10
| ls /lib/modules/$(uname -r)/build dpkg -l | grep linux-headers
lspci | grep -i nvidia
apt install -y build-essential linux-headers-$(uname -r)
|
卸载商店驱动
- 在飞牛 Web UI 应用商店中卸载
Nvidia-Driver-560。
- 在飞牛 Web UI 应用商店中卸载
NVIDIA Container Toolkit。
重要提示:商店卸载不会清理干净,必须执行下一步手动清理。
清理残留文件
⚠️ 警告:以下命令会强制停止占用 GPU 的进程并删除旧驱动文件,执行前请确认没有重要业务正在使用 GPU。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| fuser -k /dev/nvidia* 2>/dev/null
rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia 2>/dev/null
for dir in /usr/lib/x86_64-linux-gnu /lib/x86_64-linux-gnu; do rm -f ${dir}/libnvidia-*.so* rm -f ${dir}/libcuda*.so* rm -f ${dir}/libnvcuvid.so* rm -f ${dir}/libnvoptix.so* rm -f ${dir}/libGLX_nvidia.so* rm -f ${dir}/libGLES*_nvidia.so* rm -f ${dir}/libEGL_nvidia.so* rm -f ${dir}/libOpenCL.so* rm -f ${dir}/libvdpau_nvidia.so* done rm -f /usr/lib/x86_64-linux-gnu/vdpau/libvdpau_nvidia.so*
rm -f /usr/lib/modules/*/kernel/drivers/video/nvidia*.ko rm -f /lib/modules/*/kernel/drivers/video/nvidia*.ko
rm -f /usr/bin/nvidia-{bug-report.sh,cuda-mps-control,cuda-mps-server} rm -f /usr/bin/nvidia-{debugdump,installer,modprobe,ngx-updater,pcc} rm -f /usr/bin/nvidia-{persistenced,powerd,settings,sleep.sh,smi,uninstall,xconfig}
rm -f /etc/cdi/nvidia.yaml rm -rf /usr/lib/nvidia /usr/lib/firmware/nvidia rm -f /usr/lib/xorg/modules/drivers/nvidia_drv.so rm -f /usr/lib/xorg/modules/extensions/libglxserver_nvidia.so* rm -rf /usr/lib/x86_64-linux-gnu/nvidia rm -f /usr/lib/systemd/system/nvidia-*.service rm -rf /usr/lib/systemd/system-sleep/nvidia
ldconfig
|
安装 NVIDIA 驱动
1 2 3 4 5 6 7 8 9 10 11
| wget -O /root/NVIDIA-Linux-x86_64-580.126.20.run \ "https://us.download.nvidia.com/tesla/580.126.20/NVIDIA-Linux-x86_64-580.126.20.run" chmod +x /root/NVIDIA-Linux-x86_64-580.126.20.run
/root/NVIDIA-Linux-x86_64-580.126.20.run --silent --dkms --no-opengl-files
nvidia-smi
|
安装器会自动:
- 创建正确的符号链接(
.so → .so.1 → .so.580.126.20)
- 设置
root:root 644 权限
- 执行
ldconfig 注册库
- 通过 DKMS 注册内核模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \ | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \ | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \ | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
apt-get update && apt-get install -y nvidia-container-toolkit
nvidia-container-cli info
|
配置 Docker GPU 支持
1 2 3 4 5 6 7 8 9 10 11 12
| nvidia-ctk runtime configure --runtime=docker --set-as-default
nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
systemctl restart docker
docker run --rm --gpus all ubuntu:22.04 nvidia-smi --query-gpu=name --format=csv,noheader docker run --rm --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all ubuntu:22.04 nvidia-smi --query-gpu=name --format=csv,noheader
|
安装后 /etc/docker/daemon.json 会包含:
1 2 3 4 5 6 7 8 9
| { "default-runtime": "nvidia", "runtimes": { "nvidia": { "args": [], "path": "nvidia-container-runtime" } } }
|
配置系统参数
开机自动加载内核模块
1 2 3 4 5 6
| cat > /etc/modules-load.d/nvidia.conf << 'EOF' nvidia nvidia-uvm nvidia-modeset nvidia-drm EOF
|
启用 GPU Persistence Mode
禁用 PCIe ASPM(防止 Xid 79 掉卡)
Tesla P4 在 PCIe 省电模式下可能从总线脱落(Xid 79: GPU has fallen off the bus)。
1 2 3
| sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="pcie_aspm=off /' /etc/default/grub update-grub
|
修改后需重启生效。验证:
1 2
| cat /proc/cmdline | grep pcie_aspm
|
验证 PCIe 链路速度
1 2
| nvidia-smi --query-gpu=pcie.link.gen.current,pcie.link.width.current --format=csv
|
如果显示 1, 16(Gen1 降级),检查:
- BIOS 中 PCIe 槽速度设置(改为 Auto 或 Gen3)
- GPU 是否完全插紧
- 是否使用了转接卡
GPU 风扇自动调速
Tesla P4 是被动散热设计,依赖机箱风道。在 NAS 机箱中需要外加风扇。
前置:加载风扇控制芯片驱动
B360i 主板使用 ITE IT8772E Super I/O 芯片:
1 2
| modprobe it87 sensors | grep fan
|
安装调速脚本
将 gpu-fan-control.sh 放置到 /usr/local/bin/:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #!/bin/bash HWMON_PATH="" for d in /sys/class/hwmon/hwmon*/; do if [ "$(cat ${d}name 2>/dev/null)" = "it8772" ]; then HWMON_PATH="$d" break fi done
if [ -z "$HWMON_PATH" ]; then echo "ERROR: IT8772 hwmon not found" exit 1 fi
PWM_FILE="${HWMON_PATH}pwm3" ENABLE_FILE="${HWMON_PATH}pwm3_enable" FAN_FILE="${HWMON_PATH}fan3_input" MIN_PWM=50
get_gpu_temp() { nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader 2>/dev/null }
temp_to_pwm() { local temp=$1 if [ "$temp" -lt 40 ]; then echo $MIN_PWM elif [ "$temp" -lt 50 ]; then echo 76 elif [ "$temp" -lt 60 ]; then echo 128 elif [ "$temp" -lt 70 ]; then echo 178 elif [ "$temp" -lt 80 ]; then echo 230 else echo 255 fi }
echo 1 > "$ENABLE_FILE" 2>/dev/null
PREV_PWM=0 while true; do TEMP=$(get_gpu_temp) if [ -z "$TEMP" ]; then echo 255 > "$PWM_FILE" 2>/dev/null sleep 10 continue fi TARGET_PWM=$(temp_to_pwm "$TEMP") if [ "$TARGET_PWM" != "$PREV_PWM" ]; then echo "$TARGET_PWM" > "$PWM_FILE" 2>/dev/null RPM=$(cat "$FAN_FILE" 2>/dev/null) logger -t gpu-fan "GPU: ${TEMP}C PWM: ${TARGET_PWM}/255 Fan: ${RPM}RPM" PREV_PWM=$TARGET_PWM fi sleep 5 done
|
温度-转速对照表:
| GPU 温度 |
PWM |
风扇速度 |
| < 40°C |
50/255 |
~20% |
| 40-50°C |
76/255 |
~30% |
| 50-60°C |
128/255 |
~50% |
| 60-70°C |
178/255 |
~70% |
| 70-80°C |
230/255 |
~90% |
| > 80°C |
255/255 |
100% |
| GPU 不可用 |
255/255 |
100%(安全模式) |
配置 systemd 服务
/etc/systemd/system/gpu-fan-control.service:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [Unit] Description=GPU Fan Auto-Control for Tesla P4 After=nvidia-persistenced.service Wants=nvidia-persistenced.service
[Service] Type=simple ExecStartPre=/sbin/modprobe it87 ExecStart=/usr/local/bin/gpu-fan-control.sh Restart=always RestartSec=10
[Install] WantedBy=multi-user.target
|
1 2 3 4
| chmod +x /usr/local/bin/gpu-fan-control.sh systemctl daemon-reload systemctl enable gpu-fan-control.service systemctl start gpu-fan-control.service
|
注意:pwm3 / fan3 对应的物理风扇通道取决于主板接线。安装前需用 sensors 确认哪个 fan 通道连接了 GPU 风扇。
验证清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| nvidia-smi --query-gpu=driver_version,name,temperature.gpu,pcie.link.gen.current --format=csv
su -s /bin/bash plex -c "nvidia-smi --query-gpu=name --format=csv,noheader"
su -s /bin/bash EmbyServer -c "nvidia-smi --query-gpu=name --format=csv,noheader"
docker run --rm --gpus all ubuntu:22.04 nvidia-smi --query-gpu=name --format=csv,noheader
docker run --rm --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all ubuntu:22.04 nvidia-smi --query-gpu=name --format=csv,noheader
ls -la /usr/lib/x86_64-linux-gnu/libcuda.so
cat /proc/cmdline | grep pcie_aspm=off
nvidia-smi --query-gpu=persistence_mode --format=csv,noheader
systemctl status gpu-fan-control.service
|
故障排查
Xid 79: GPU has fallen off the bus
1
| dmesg -T | grep -i "Xid\|fallen off"
|
- 检查
/proc/cmdline 是否包含 pcie_aspm=off,没有则添加内核参数
- 用
nvidia-smi -l 1 观察温度,散热不足时加装风扇并确认调速脚本运行
- 检查
pcie.link.gen.current,降级到 1 说明接触异常,重新插拔 GPU
- 在 BIOS 中将 PCIe 设置为 Auto/Gen3,避免链路降级
Docker GPU 不可用
1 2 3 4 5 6
| nvidia-container-cli info
nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml systemctl restart docker
|
飞牛资源管理不显示 GPU
重启 resmon_service:
1 2
| kill $(pidof resmon_service)
|
- 如仍不显示,确认
nvidia-driver-lib-trim 包状态:dpkg -l | grep nvidia-driver-lib-trim
- 该包提供飞牛 Web UI 的 GPU 监控集成
FPK 打包要点
包含文件清单
| 文件 |
用途 |
NVIDIA-Linux-x86_64-580.126.20.run |
NVIDIA 官方驱动安装器 |
/usr/local/bin/gpu-fan-control.sh |
GPU 风扇调速脚本 |
/etc/systemd/system/gpu-fan-control.service |
调速服务单元 |
/etc/modules-load.d/nvidia.conf |
开机自动加载模块配置 |
安装脚本要点(post-install)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash set -e
/path/to/NVIDIA-Linux-x86_64-580.126.20.run --silent --dkms --no-opengl-files
if command -v docker &>/dev/null; then curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \ | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \ | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \ | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list apt-get update -qq && apt-get install -y nvidia-container-toolkit nvidia-ctk runtime configure --runtime=docker --set-as-default nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml systemctl restart docker fi
echo -e "nvidia\nnvidia-uvm\nnvidia-modeset\nnvidia-drm" > /etc/modules-load.d/nvidia.conf nvidia-smi -pm 1
if ! grep -q "pcie_aspm=off" /proc/cmdline; then sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="pcie_aspm=off /' /etc/default/grub update-grub echo "WARNING: pcie_aspm=off added, reboot required" fi
if modprobe it87 2>/dev/null && grep -q it8772 /sys/class/hwmon/hwmon*/name 2>/dev/null; then cp gpu-fan-control.sh /usr/local/bin/ chmod +x /usr/local/bin/gpu-fan-control.sh cp gpu-fan-control.service /etc/systemd/system/ systemctl daemon-reload systemctl enable --now gpu-fan-control.service fi
|
卸载脚本要点(pre-remove)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #!/bin/bash
systemctl disable --now gpu-fan-control.service 2>/dev/null rm -f /etc/systemd/system/gpu-fan-control.service rm -f /usr/local/bin/gpu-fan-control.sh
/usr/bin/nvidia-uninstall --silent 2>/dev/null
rm -f /etc/modules-load.d/nvidia.conf rm -f /etc/cdi/nvidia.yaml rm -f /etc/apt/sources.list.d/nvidia-container-toolkit.list
sed -i 's/pcie_aspm=off //' /etc/default/grub update-grub
ldconfig
|
注意事项
- FnOS 内核版本更新时,DKMS 会自动重编译 NVIDIA 内核模块,但需确认新内核有对应的
linux-headers
- 该 FPK 不应与商店的
Nvidia-Driver 包共存
- 风扇调速脚本中的
pwm3 通道需要根据实际主板接线调整
- 驱动安装器体积约 380MB,打包时考虑是否内嵌或在线下载