N5105 PVE 安装 Debian 运行 docker 实现 jellyfin 硬解
家里的两个小朋友天天放学回家就捧着 iPad 看动画片,屏幕又小又伤眼睛,还是我这个老爹给他们弄个家庭影院投屏吧,顺便下载一些西方的动画大片给他们看下,总比天天看国产的神动漫好。
之前买的 N5105,目前已经通过 PVE 虚拟化方式在上面运行了 ikuai(宽带拨号),openwrt(作为旁路由),和 VM 形式安装的 debian(上面 docker 方式运行了 vaultwarden 和 syncthing),这次再通过 lxc 方式运行 debian 12 顺便把显卡直通给 debian12 实现 jellyfin 的硬解。
操作流程
核显直通PVE
确保PVE已经升级到7.3-3及以上版本
补全 i915 guc huc dmc固件
mkdir -p /lib/firmware/i915 && cd /lib/firmware/i915curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_guc_70.1.1.bincurl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_huc_9.0.0.bincurl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/icl_dmc_ver1_09.bin安装 lxc debian 前准备
更新一下 pve 的软件源
apt updateapt upgrade -y从上面的清华源中找到 debian 12 模板,这里我下载的 debian-12-standard_12.2-1_amd64.tar.zst
# 进入 pve 默认 template 目录cd /var/lib/vz/template/cache/# 下载模板curl -O https://mirrors.tuna.tsinghua.edu.cn/proxmox/images/system/debian-12-standard_12.2-1_amd64.tar.zst# 列出可用 CT 模板pveam list# 更新 CT 模板pveam update也可以通过以下命令,从官方下载模板
# 查看可选模板pveam availablepveam download local <template_you_want_to_use>图形化界面创建 CT
选择 Create CT

Unprivileged container 不做勾选,设置 CT ID,hostname 以及登录密码

选择刚才下载的模板

设置硬盘大小

设置 CPU 核心数(后期可以修改)

设置内存大小(后期可以修改)

设置网络,IPv4 分配根据实际情况选择,这里我选择 DHCP 结合 ikuai 自动分配

DNS用宿主机的就好

完成后确认

设置显卡
重要的事情说三遍,在 pve 宿主机上操作!
重要的事情说三遍,在 pve 宿主机上操作!
重要的事情说三遍,在 pve 宿主机上操作!
# 查看显卡信息ls -l /dev/dri# crw-rw---- 1 root video 226, 0 Apr 16 23:06 card0 这个就是显卡drwxr-xr-x 2 root root 80 Apr 16 23:06 by-pathcrw-rw---- 1 root video 226, 0 Apr 16 23:06 card0crw-rw---- 1 root render 226, 128 Apr 16 23:06 renderD128
# 106 对应上面创建的 CT idvim /etc/pve/lxc/106.conf
# 黏贴以下内容修改 ct 106 的配置, 黏贴以下内容
lxc.cgroup2.devices.allow: c 226<0>0> rwm lxc.cgroup2.devices.allow: c 226<128>128> rwm lxc.cgroup2.devices.allow: c 29<0>0> rwm lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir lxc.apparmor.profile: unconfined lxc.cap.drop:
vim /etc/pve/lxc/106.conf编辑完成后具体信息如下
cat /etc/pve/lxc/106.conf
arch: amd64cores: 2cpulimit: 2cpuunits: 1024hostname: lxc-debianmemory: 4096net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=3A:13:C3:D0:DE:E1,ip=dhcp,ip6=dhcp,type=vethostype: debianrootfs: local-lvm:vm-106-disk-0,size=40Gswap: 4096
lxc.cgroup2.devices.allow: c 226:0 rwmlxc.cgroup2.devices.allow: c 226:128 rwmlxc.cgroup2.devices.allow: c 29:0 rwmlxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dirlxc.apparmor.profile: unconfinedlxc.cap.drop:修改以下配置
vim /etc/modprobe.d/i915.conf增加内容
options i915 enable_guc=3
编辑完成后具体信息如下
cat /etc/modprobe.d/i915.conf
options i915 enable_guc=3重启
reboot重启后检查是否生效
journalctl -b -o short-monotonic -k | egrep -i "i915|dmr|dmc|guc|huc"返回信息中有以下 HuC 和 GuC 则说明开启成功
[ 4.784428] pve kernel: Setting dangerous option enable_guc - tainting kernel[ 4.785480] pve kernel: i915 0000:00:02.0: [drm] VT-d active for gfx access[ 4.785857] pve kernel: i915 0000:00:02.0: vgaarb: deactivate vga console[ 4.785952] pve kernel: i915 0000:00:02.0: [drm] Using Transparent Hugepages[ 4.790414] pve kernel: i915 0000:00:02.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=io+mem[ 4.799606] pve kernel: i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/icl_dmc_ver1_09.bin (v1.9)[ 4.955965] pve kernel: i915 0000:00:02.0: [drm] GuC firmware i915/ehl_guc_70.1.1.bin version 70.1.1[ 4.955997] pve kernel: i915 0000:00:02.0: [drm] HuC firmware i915/ehl_huc_9.0.0.bin version 9.0.0[ 4.970965] pve kernel: i915 0000:00:02.0: [drm] HuC authenticated[ 4.971309] pve kernel: i915 0000:00:02.0: [drm] GuC submission enabled[ 4.971311] pve kernel: i915 0000:00:02.0: [drm] GuC SLPC disabled[ 4.973395] pve kernel: [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.0 on minor 0[ 4.976297] pve kernel: snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])lxc debian 内操作
更换清华源
debian | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
增加 sudo 账号
默认 root 用户操作有点危险,我比较喜欢添加个人用户并赋予 sudo 权限
# 安装 sudoapt install sudo# 添加个人账号adduser <username># 将个人账号添加到 sudo 组usermod -aG sudo <username>LXC 开机自动修改解码器用户组权限
# 创建开机脚本sudo cat > /etc/rc.local << EOF!/bin/sh -e##rc.local##This script is executed at the end of each multiuser runlevel.#Make sure that the script will "exit 0" on success or any other#value on error.##In order to enable or disable this script just change the execution#bits.##By default this script does nothing.chmod 777 /dev/dri/*sleep 30systemctl restart dockerexit 0EOF
# 配置开机自动运行sudo cat > /etc/systemd/system/rc-local.service << EOF[Unit]Description=/etc/rc.localConditionPathExists=/etc/rc.local[Service]Type=forkingExecStart=/etc/rc.local startTimeoutSec=0StandardOutput=ttyRemainAfterExit=yesSysVStartPriority=99[Install]WantedBy=multi-user.targetEOF
# 然后执行开机启动rc.localsudo systemctl enable rc-local.service
# 并给文件赋权限sudo chmod +x /etc/rc.local
# 重启sudo reboot
# 重启开机后检查权限是否自动更改解码器用户组为renderls -l /dev/dri
total 0drwxrwxrwx 2 root root 80 Apr 16 16:11 by-pathcrwxrwxrwx 1 root video 226, 0 Apr 16 16:11 card0crwxrwxrwx 1 root input 226, 128 Apr 16 16:11 renderD128切换到新建的
通过 docker compose 启动 jellyfin 并将
docker-compose.yml
services: jellyfin: image: nyanmisaka/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: # 修改成你自己的路径 - /path/to/jellyfin/config:/config - /path/to//jellyfin/media:/media ports: - 8096:8096 - 8920:8920 devices: # 显卡直通 - /dev/dri:/dev/dri restart: unless-stopped启动
docker compose up -d jellyfin访问 http://ip_to_lxc<8096>8096>, 设置 jellyfin

通过 smb 挂载 NAS
允许 lxc 容器挂载 smb

在 lxc 容器中执行
sudo apt install cifs-utils samba samba-client -y
# 挂载硬盘# 建立挂载点sudo mkdir -p /mnt/share
# 挂载# sudo mount -t cifs //<挂载点地址>/myshare <挂载目录> -o <挂载选项># dir_mode=0777,file_mode=0777 完全读写权限sudo mount -t cifs //<挂载点地址>/myshare /mnt/share -o uid=1000,gid=1000,vers=2.0,dir_mode=0755,file_mode=0755,mfsymlinks,cache=strict,rsize=1048576,wsize=1048576,username=账号,password=密码# 取消挂载使用 sudo umount /mnt/share
# 设置开机自动挂载cat >> /etc/fstab << EOF//<挂载点地址>/myshare /mnt/share cifs uid=1000,gid=1000,vers=2.0,dir_mode=0755,file_mode=0755,mfsymlinks,cache=strict,rsize=1048576,wsize=1048576,username=账号,password=密码 0 0EOFdebian 中文乱码解决
发现终端环境中中文文件名显示乱码,需要解决
sudo dpkg-reconfigure locales
选择
zh_CN.UTF-8 UTF-8en_US.UTF-8 UTF-8
默认编码选择 en_US.UTF-8
Jellyfin 媒体文件命名规范
电影命名规则
Movies├── Film (1990).mp4├── Film (1994).mp4├── Film (2008)│ └── Film.mkv└── Film (2010) ├── Film-cd1.avi └── Film-cd2.avi
# 当有多种版本电影文件时(方式一)Movies└── Best_Movie_Ever (2019) ├── Best_Movie_Ever (2019) - 1080P.mp4 ├── Best_Movie_Ever (2019) - 720P.mp4 └── Best_Movie_Ever (2019) - Directors Cut.mp4
# 当有多种版本电影文件时(方式二)Movies└── Best_Movie_Ever (2019) ├── Best_Movie_Ever (2019) - [1080P].mp4 ├── Best_Movie_Ever (2019) - [720P].mp4 └── Best_Movie_Ever (2019) - [Directors Cut].mp4电视剧命名规则
Shows├── Series Name A (2010)│ ├── Season 00│ │ ├── Some Special.mkv│ │ ├── Series Name A S00E01.mkv│ │ └── Series Name A S00E02.mkv│ ├── Season 01│ │ ├── Series Name A S01E01-E02.mkv│ │ ├── Series Name A S01E03.mkv│ │ └── Series Name A S01E04.mkv│ └── Season 02│ ├── Series Name A S02E01.mkv│ ├── Series Name A S02E02.mkv│ ├── Series Name A S02E03 Part 1.mkv│ └── Series Name A S02E03 Part 2.mkv└── Series Name B (2018) ├── Season 01 | ├── Series Name B S01E01.mkv | └── Series Name B S01E02.mkv └── Season 02 ├── Series Name B S02E01-E02.mkv └── Series Name B S02E03.mkv字幕等文件规则
/Movies /Film (1946) Film.mkv Film.vtt Film.aac Film.mka Film.mks Film.en.ac3 Film.de.srt Film.en.dts Film.german.ac3
/Movies /Film (1986) Film.mkv Film.default.srt Film.default.en.forced.ass Film.forced.en.dts Film.en.sdh.srt Film.English Commentary.en.mp3📎 参考文章
- N5105软路由 PVE下核显硬解转码 LXC套娃Debian Docker Jellyfin|爱折腾的老高博客 (diyforfun.cn)
- 【更新】免费开源影音服务Jellyfin部署,PVE下LXC套娃安装Debian Docker,核显硬解转码以N5105为例低功耗intel CPU核显通用_哔哩哔哩_bilibili
- Intel Celeron N5105 基准、测试和规格 (cpu-monkey.com)
- 【2023.01.29】LXC、Linux、Jellyfin挂载SMB,开机自动挂载SMB(N5105为例) - Mokou - 博客园 (cnblogs.com)
- 如何将NAS SMB协议文件系统挂载至Linux ECS_文件存储NAS(NAS)-阿里云帮助中心 (aliyun.com)
- 利用 Jellyfin + Bangumi 打造更舒适的动画媒体库 - 初之音 (himiku.com)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













