侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 193 篇文章
  • 累计创建 70 个标签
  • 累计收到 6 条评论

unRAID 配置 NVIDIA 显卡驱动并传给容器

liveJQ
2025-02-09 / 0 评论 / 0 点赞 / 146 阅读 / 5,256 字

unRAID系统配置

应用商店下载2个插件:Nvidia Driver 和 GPU Statistics

下载插件可能需要代理才能下载成功,由于 unRAID 下载插件都是通过 wget 工具,所以可以直接单独给 wget 配置代理。但是需要注意网络先不要启用 ipv6 (ipv4+ipv6),否则会因为优先使用 ipv6 访问而导致代理失败。

root@Master:~# cat << EOF >>/etc/wgetrc
https_proxy = http://192.168.1.1:1080/
http_proxy = http://192.168.1.1:1080/
EOF

安装好显卡驱动之后,需要重启 docker 服务或者直接重启系统来使驱动生效。作用应该就是重新加载运行时识别到显卡。

安装好 Nvidia Driver 插件后,也会一并安装 nvidia-container-runtime,并且会给 Docker Daemon 配置好 NVIDIA 运行时。

root@Master:~# cat /etc/docker/daemon.json 
{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

验证显卡驱动是否安装成功,正常输出显示类似如下:

root@Master:~# nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 565.57.01              Driver Version: 565.57.01      CUDA Version: 12.7     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce GTX 1060 6GB    On  |   00000000:01:00.0 Off |                  N/A |
|  0%   28C    P8             11W /  120W |       0MiB /   6144MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

最常见的错误就是创建容器时报错Unknown runtime specified nvidia,查看日志显示“/run/s6/basedir/scripts/rc.init: 76: --runtime=nvidia: not found”,很可能就是上面的插件没有生效的缘故。

root@Master:~# nvidia-container-runtime --version
NVIDIA Container Runtime version 1.17.2
commit: fa66e4cd562804509055e44a88f666673e6d27c0
spec: 1.2.0

runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d1
spec: 1.0.2-dev
go: go1.18.7
libseccomp: 2.5.1

验证 Docker 是否正确识别 NVIDIA 运行时

首先确保 Docker 版本在 19.03 及以上

使用如下命令,输出包含 nvidia 就表示已经正确识别了。

docker info | grep Runtimes
 Runtimes: runc io.containerd.runc.v2 io.containerd.runtime.v1.linux nvidia

容器配置

额外参数:--runtime=nvidia
配置变量:
NVIDIA_VISIBLE_DEVICES=GPU-ab310170-83ae-ea64-7866-40310ee3e921(这是指定某个显卡ID,也可以直接填all)
NVIDIA_DRIVER_CAPABILITIES=all

Docker 19.03 之后,--runtime=nvidia 被 --gpus 取代,所以额外参数也可以尝试使用 --gpus all

媒体服务器转码配置

当前使用的显卡是 RTX3050,H.265 视频转码播放的时候会出现突然卡住的情况(俗称断流),不转码直接播放是正常的,可排除视频问题。通过查询日志得到报错信息:

tail -50 /mnt/cache/appdata/Server/logs/ffmpeg-transcode-260e412d-61ec-45f9-83c9-422b697d01fb_1.txt

19:31:24.524 ffmpeg version 5.1-emby_2023_06_25 Copyright (c) 2000-2022 the FFmpeg developers and softworkz for Emby LLC
19:31:24.524   built with gcc 10.3.0 (crosstool-NG 1.25.0)
19:31:24.524 Execution Date: 2025-10-27 19:31:24
19:31:24.932 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/data/media/all/动漫/航海王 (1999)/Season 22/航海王.One Piece.1999 - S22E1146.mp4':
19:31:24.932   Metadata:
19:31:24.932     major_brand     : isom
19:31:24.932     minor_version   : 512
19:31:24.932     compatible_brands: isomiso2mp41
19:31:24.932     date            : 2025-10-19T23:44:59.8436238+08:00
19:31:24.932     encoder         : Lavf60.16.100
19:31:24.932   Duration: 00:23:35.93, start: 0.000000, bitrate: 4481 kb/s
19:31:24.932   Stream #0:0[0x1](und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv), 3840x2160, 4285 kb/s, Level 150, 23.98 fps, 23.98 tbr, 90k tbn (default)
19:31:24.932     Metadata:
19:31:24.932       handler_name    : VideoHandler
19:31:24.932       vendor_id       : [0][0][0][0]
19:31:24.932   Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 189 kb/s (default)
19:31:24.932     Metadata:
19:31:24.932       handler_name    : SoundHandler
19:31:24.932       vendor_id       : [0][0][0][0]
19:31:24.933 Stream mapping:
19:31:24.933   Stream #0:0 (hevc) -> scale_cuda:default (graph 0)
19:31:24.933   setsar:default (graph 0) -> Stream #0:0 (h264_nvenc)
19:31:24.933   Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
19:31:24.933 Press [q] to stop, [?] for help
19:31:25.152 Output #0, segment, to '/config/transcoding-temp/B9E175/B9E175_%d.ts':
19:31:25.152   Metadata:
19:31:25.152     encoder         : Lavf59.27.100
19:31:25.152   Stream #0:0: Video: h264 (High), cuda(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 6427 kb/s, 23.98 fps, 90k tbn
19:31:25.152     Metadata:
19:31:25.152       encoder         : Lavc59.37.100 h264_nvenc
19:31:25.152     Side data:
19:31:25.152       cpb: bitrate max/min/avg: 6427604/0/6427604 buffer size: 12855208 vbv_delay: N/A
19:31:25.152   Stream #0:1: Audio: mp3, 44100 Hz, stereo, fltp, 189 kb/s (default)
19:31:25.152     Metadata:
19:31:25.152       encoder         : Lavc59.37.100 libmp3lame
19:31:25.153 elapsed=00:00:00.17 frame=    1 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A throttle=off speed=   0x    
19:31:25.390 Impossible to convert between the formats supported by the filter 'setsar@f2' and the filter 'auto_scale_0'
19:31:25.391 Error reinitializing filters!
19:31:25.391 Failed to inject frame into filter network: Function not implemented
19:31:25.391 Error while processing the decoded data for stream #0:0
19:31:25.419 [libmp3lame @ 0x1067c80] 3 frames left in the queue on closing
19:31:25.460 Conversion failed!
19:31:25.460 EXIT

根本原因是 GPU 硬解转码不支持当前 HEVC 视频的 SAR/color space 转换 → 转码失败 → 播放卡住。NVDEC 本身只做解码,很多滤镜(如 setsar、缩放、色彩空间转换)仍在 CPU 上完成,CUVID 支持在 GPU 上完成 解码 + 滤镜 + 转码,兼容性更好。

解码方式说明

模块全称作用特点
NVDECNVIDIA Video Decoder专用硬件解码引擎轻量、低功耗、高速,但某些新格式容错差
CUVIDCUDA Video Decoder通过 CUDA 调用解码(软件层封装)更兼容,能解决部分滤镜/色度转换问题
NVENCNVIDIA Encoder硬件编码器用于视频转码输出(H.264/H.265)

解决办法

在转码设置上,将 H.265 的解码设置(MPEG2/VC-1也建议)优先使用 CUVID 次选 NVDEC 然后点击保存即可。

相关资料

  1. Transcode fail with error: Impossible to convert between the formats
0

评论区