N5105 PVE 安装 Debian 运行 docker 实现 jellyfin 硬解

1841 字
9 分钟
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固件

Terminal window
mkdir -p /lib/firmware/i915 && cd /lib/firmware/i915
curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_guc_70.1.1.bin
curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_huc_9.0.0.bin
curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/icl_dmc_ver1_09.bin

安装 lxc debian 前准备#

更新一下 pve 的软件源

Terminal window
apt update
apt upgrade -y

https://mirrors.tuna.tsinghua.edu.cn/proxmox/images/system/

从上面的清华源中找到 debian 12 模板,这里我下载的 debian-12-standard_12.2-1_amd64.tar.zst

Terminal window
# 进入 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

也可以通过以下命令,从官方下载模板

Terminal window
# 查看可选模板
pveam available
pveam download local <template_you_want_to_use>

图形化界面创建 CT#

选择 Create CT

Untitled 25
Untitled 25

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

Untitled 26
Untitled 26

选择刚才下载的模板

Untitled 27
Untitled 27

设置硬盘大小

Untitled 28
Untitled 28

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

Untitled 29
Untitled 29

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

Untitled 30
Untitled 30

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

Untitled 31
Untitled 31

DNS用宿主机的就好

Untitled 32
Untitled 32

完成后确认

Untitled 33
Untitled 33

设置显卡#

重要的事情说三遍,在 pve 宿主机上操作!

重要的事情说三遍,在 pve 宿主机上操作!

重要的事情说三遍,在 pve 宿主机上操作!

Terminal window
# 查看显卡信息
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-path
crw-rw---- 1 root video 226, 0 Apr 16 23:06 card0
crw-rw---- 1 root render 226, 128 Apr 16 23:06 renderD128
# 106 对应上面创建的 CT id
vim /etc/pve/lxc/106.conf
# 黏贴以下内容

修改 ct 106 的配置, 黏贴以下内容

lxc.cgroup2.devices.allow: c 226<0> rwm lxc.cgroup2.devices.allow: c 226<128> rwm lxc.cgroup2.devices.allow: c 29<0> rwm lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir lxc.apparmor.profile: unconfined lxc.cap.drop:

Terminal window
vim /etc/pve/lxc/106.conf

编辑完成后具体信息如下

Terminal window
cat /etc/pve/lxc/106.conf
arch: amd64
cores: 2
cpulimit: 2
cpuunits: 1024
hostname: lxc-debian
memory: 4096
net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=3A:13:C3:D0:DE:E1,ip=dhcp,ip6=dhcp,type=veth
ostype: debian
rootfs: local-lvm:vm-106-disk-0,size=40G
swap: 4096
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.apparmor.profile: unconfined
lxc.cap.drop:

修改以下配置

Terminal window
vim /etc/modprobe.d/i915.conf

增加内容

options i915 enable_guc=3

编辑完成后具体信息如下

Terminal window
cat /etc/modprobe.d/i915.conf
options i915 enable_guc=3

重启

Terminal window
reboot

重启后检查是否生效

Terminal window
journalctl -b -o short-monotonic -k | egrep -i "i915|dmr|dmc|guc|huc"

返回信息中有以下 HuC 和 GuC 则说明开启成功

Terminal window
[ 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 权限

Terminal window
# 安装 sudo
apt install sudo
# 添加个人账号
adduser <username>
# 将个人账号添加到 sudo 组
usermod -aG sudo <username>

LXC 开机自动修改解码器用户组权限

Terminal window
# 创建开机脚本
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 30
systemctl restart docker
exit 0
EOF
# 配置开机自动运行
sudo cat > /etc/systemd/system/rc-local.service << EOF
[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
EOF
# 然后执行开机启动rc.local
sudo systemctl enable rc-local.service
# 并给文件赋权限
sudo chmod +x /etc/rc.local
# 重启
sudo reboot
# 重启开机后检查权限是否自动更改解码器用户组为render
ls -l /dev/dri
total 0
drwxrwxrwx 2 root root 80 Apr 16 16:11 by-path
crwxrwxrwx 1 root video 226, 0 Apr 16 16:11 card0
crwxrwxrwx 1 root input 226, 128 Apr 16 16:11 renderD128

切换到新建的 用户,安装 docker

Install Docker Engine on Debian | Docker Docs

通过 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

启动

Terminal window
docker compose up -d jellyfin

访问 http://ip_to_lxc<8096>, 设置 jellyfin

Untitled 34
Untitled 34

通过 smb 挂载 NAS#

允许 lxc 容器挂载 smb

Untitled 35
Untitled 35

在 lxc 容器中执行

Terminal window
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 0
EOF

debian 中文乱码解决#

发现终端环境中中文文件名显示乱码,需要解决

Terminal window
sudo dpkg-reconfigure locales

Untitled 36
Untitled 36

选择

zh_CN.UTF-8 UTF-8
en_US.UTF-8 UTF-8

Untitled 37
Untitled 37

默认编码选择 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 安装 Debian 运行 docker 实现 jellyfin 硬解
https://blog.sephy.top/posts/n5105-pve-安装-debian-运行-docker-实现-jellyfin-硬解/
作者
虾米
发布于
2024-04-16
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
虾米
coder
分类
标签
站点统计
文章
61
分类
4
标签
52
总字数
64,663
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.9
文章许可
CC BY-NC-SA 4.0