收起左侧

Emby+nVidia显卡硬解码全流程飞牛NAS部署总结

0
回复
318
查看
[ 复制链接 ]

4

主题

7

回帖

0

牛值

江湖小虾


emby支持电影、电视剧、电视直播、音乐、有声读物、电子书、普通杂视频的全媒体管理,先上图,赏美照,没有nvidia的显卡当然也能部署,本教程主要讲给docker容器开nvidia的支持,包括docker的AI应用需要用到nvidia显卡的,也可以参考这个方法

PixPin_2025-12-26_17-33-31.png

PixPin_2025-12-26_17-34-59.png

PixPin_2025-12-26_17-35-21.png

核心目标

让Emby容器调用nVidia显卡,我用的是Tesla P4,实现NVIDIA NVENC硬解码,降低CPU负载,提升视频转码性能。

一、基础环境验证(前置必做)

1. 验证NVIDIA驱动是否正常(Tesla P4核心依赖)

# 查看驱动版本、GPU状态(需能看到Tesla P4信息)
nvidia-smi

✅ 成功标志:输出包含Tesla P4、Driver Version: 560.28.03,无报错。

2. 验证Docker版本(需≥19.03,适配NVIDIA运行时)

docker --version

✅ 成功标志:输出Docker version 29.1.2(飞牛v1.8.8 时的版本),版本≥19.03即可。

二、安装NVIDIA Container Toolkit(容器访问GPU的核心)

1. 清理旧残留+安装依赖

# 卸载不完整的Toolkit(若有)
sudo apt-get purge -y nvidia-container-toolkit
# 安装依赖工具
sudo apt-get install -y curl gnupg2 ca-certificates lsb-release

如果提示

Package gnupg2 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
gpgv gpgsm gnupg-l10n gnupg dirmngr

E: Package 'gnupg2' has no installation candidate

说明已经是新版,直接忽略即可,继续:

# 添加NVIDIA官方GPG密钥
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
# 添加适配飞牛NAS的通用源(手动指定 amd64)
echo "deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/deb/amd64 /" | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# 刷新源+安装Toolkit
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

2. 验证Toolkit安装成功

nvidia-ctk --version

✅ 成功标志:输出NVIDIA Container Toolkit CLI version 1.18.1,无command not found报错。

三、配置Docker识别NVIDIA运行时(核心解决runtime报错)

1. 备份原有daemon.json(飞牛NAS核心配置,绝对不能丢)

sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.backup_all

2. 修改daemon.json(保留原有配置,新增nvidia运行时)

sudo nano /etc/docker/daemon.json

⚠️ 关键:保留飞牛NAS原有配置(数据路径、日志、镜像源等),仅新增runtimes节点,最终完整配置如下(注意修改例子中的data-root路径为你自己的docker服务的存储位置路径):

默认是单行,需要全选中,用以下内容替换

{
  "data-root":"/vol2/docker", 
  "live-restore":true,
  "log-driver":"json-file",
  "log-opts":{
    "max-file":"5",
    "max-size":"100m"
  },
  "proxies":{},
  "registry-mirrors":["https://docker.fnnas.com","https://registry.hub.docker.com"],
  "runtimes":{
    "nvidia":{
      "path":"/usr/bin/nvidia-container-runtime",
      "runtimeArgs":[]
    }
  }
}

Ctrl+O 保存,Ctrl+X 退出

3. 验证JSON格式+运行时路径

# 验证JSON语法(无报错=格式正确)
cat /etc/docker/daemon.json | python3 -m json.tool
# 验证nvidia-container-runtime路径(需和配置中一致)
which nvidia-container-runtime

✅ 成功标志:JSON格式化输出无报错,路径输出/usr/bin/nvidia-container-runtime。

4. 重启Docker+验证运行时注册

# 重启Docker服务
sudo systemctl restart docker
# 验证nvidia运行时是否被识别
docker info | grep -i runtime

✅ 成功标志:输出包含Runtimes: io.containerd.runc.v2 nvidia runc(看到nvidia)。

如果替换后Docker不断自动重启,可以先停掉Docker服务;如果没问题直接跳到【调整Emby配置(解决端口/运行时兼容性问题)】继续

✏️ Note

异常处理--还原备份的json设置

如果替换后Docker不断自动重启,可以先停掉Docker服务

sudo systemctl stop docker

还原备份文件(覆盖错误配置)

# 直接将备份文件覆盖回原配置文件
sudo cp /etc/docker/daemon.json.backup_all /etc/docker/daemon.json

重启 Docker 服务

sudo systemctl start docker
# 验证Docker是否正常运行
sudo systemctl status docker

✏️ Note

异常处理--解决问题

第一步:抓取 Docker 重启的核心错误日志(最关键)

# 查看Docker服务的实时错误日志(按Ctrl+C停止)
sudo journalctl -u docker -f

✅ 重点关注日志中的关键词:

  • invalid JSON:JSON 格式错误(比如少逗号、括号不匹配);
  • nvidia-container-runtime:运行时路径不存在 / 无权限;
  • daemon.json:配置项不合法;
  • data-root:数据目录权限 / 路径错误。

第二步:逐一验证配置项的有效性

1. 验证 JSON 格式(新手最易出错)

哪怕少一个逗号、多一个空格都会导致 Docker 解析失败,执行以下命令严格校验:

# 将你修改后的daemon.json内容保存为临时文件(比如test.json)
sudo nano /tmp/test.json
# 粘贴你修改后的完整配置,保存后执行校验
cat /tmp/test.json | python3 -m json.tool

❌ 若输出Expecting ',' delimiter/Invalid JSON等,说明格式错误(比如:

  • 最后一个配置项后多了逗号(如"registry-mirrors":["xxx"],末尾的逗号);
  • 引号 / 括号不匹配;
  • 注释格式错误(JSON 本身不支持//注释,但_comment字段是 Docker 兼容的,需确认格式)。
2. 验证 nvidia-container-runtime 路径是否真实存在

配置中"path":"/usr/bin/nvidia-container-runtime"必须是真实可执行的路径,执行:

# 检查路径是否存在
ls -l /usr/bin/nvidia-container-runtime
# 检查是否可执行
which nvidia-container-runtime

❌ 若输出No such file or directory,说明:

  • NVIDIA Container Toolkit 安装不完整;
  • 运行时路径不是/usr/bin,而是/usr/local/bin(执行find / -name nvidia-container-runtime查找真实路径)。
3. 验证 data-root 路径(飞牛 NAS 核心)

确认data-root是你飞牛 NAS 真实的 Docker 数据目录,执行:

# 查看飞牛NAS默认Docker路径
sudo docker info | grep "Docker Root Dir"

✅ 输出的路径必须和daemon.json中的data-root完全一致(比如飞牛可能是/vol1/docker而非/vol2/docker),路径错误会导致 Docker 启动失败。

4. 验证 nvidia 运行时依赖是否完整

执行以下命令检查 Toolkit 是否正确安装:

# 检查nvidia运行时是否注册
sudo nvidia-ctk runtime list
# 检查NVIDIA驱动和运行时兼容性
sudo nvidia-container-cli -k list

❌ 若输出error: no devices found/library not found,说明 Toolkit 安装不完整,需重新安装:

sudo apt-get purge -y nvidia-container-toolkit
sudo apt-get install -y nvidia-container-toolkit
# 重新配置nvidia运行时
sudo nvidia-ctk runtime configure --runtime=nvidia

✏️ Note

异常处理--问题已解决,继续往下。。。

四、调整Emby配置(解决端口/运行时兼容性问题)

1. 最终可用的docker-compose.yml(适配飞牛NAS)

services:
  emby:
    image: amilys/embyserver:latest  # 开心版
    container_name: emby-server
    ports:
      - '8096:8096'  # Emby Web界面(核心端口)
      - '1901:1900/udp'  # 避开NAS内置DLNA占用的1900端口
    volumes:
      - ./:/config
      - /vol3/1000/media:/media  #冒号前面的改为自己的影视文件夹路径
      - /vol1/1000/music:/music  #冒号前面的改为自己的音乐文件夹路径
    privileged: true
    runtime: nvidia  # 启用nvidia运行时
    environment:
      - LANG=zh_CN.UTF-8
      - TZ=Asia/Shanghai
      - NVIDIA_VISIBLE_DEVICES=0  # 仅调用第0块Tesla P4
      - NVIDIA_DRIVER_CAPABILITIES=all
    restart: always

2. 构建并启动Emby容器

五、最终验证(核心功能+硬解码)

1. 验证容器内能否访问GPU

# 进入Emby容器
docker exec -it emby-server bash
# 执行nvidia-smi(需看到Tesla P4信息)
nvidia-smi

❌ 若提示nvidia-smi: command not found,容器内执行:

apt-get update && apt-get install -y nvidia-utils-560

2. 验证Emby硬解码生效

  1. 访问Emby后台:http://你的NAS IP:8096 → 控制台 → 转码;
  2. 硬件加速选择NVIDIA NVENC,勾选H.264/HEVC,保存;
  3. 播放高清视频,主机执行:
    watch -n 1 nvidia-smi
    

✅ 硬解码成功标志:GPU-Util数值从0变为10%-30%,CPU占用大幅下降。

六、关键报错解决(飞牛NAS专属)

报错类型 核心原因 解决方案
unknown or invalid runtime name: nvidia Docker未安装Toolkit/未注册运行时 重装Toolkit+配置daemon.json+重启Docker
could not select device driver "" with capabilities: [[gpu]] daemon.json配置错误/运行时未注册 验证JSON格式+重启Docker,确保runtime列表有nvidia
address already in use (1900/udp) NAS内置DLNA占用端口 改Emby端口为1901/udp,或关闭NAS内置DLNA
libnvidia-ml.so.1: no such file or directory 新版deploy配置未映射驱动库 改用runtime: nvidia配置(自动映射驱动库)

核心总结

  1. 基础:Tesla P4驱动必须正常,Docker版本≥19.03;
  2. 关键:安装Toolkit+配置daemon.json让Docker识别nvidia运行时(保留NAS原有配置);
  3. 适配:飞牛NAS需避开1900端口占用,改用runtime: nvidia而非新版deploy配置;
  4. 验证:在网页版emby播放视频,并调节降低码率分辨率,在宿主机执行nvidia-smi看到 /bin/ffmpeg 字样,并伴随GPU利用率上升,即硬解码生效。

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则