本文最后更新于 2023年9月18日 上午
ESXi 7 开启核显直通 以下这部分内容转载自这里 VMware vSphere(ESXI)7.X直通核显再重启ESXI后仍提示需要直通的解决办法 。 自从 VMware vSphere(ESXi)升级到 7.0 以后,改进了一个功能,就是硬件直通以后不需要重启就可以直接添加给虚拟机使用。可是偏偏有不少人会遇到以下情况:直通核显给虚拟机可以正常使用,但是 ESXi 重启后直通列表里面的核显会变成再次需要直通才能使用,这样的话设置的虚拟机自动启动就无效了。
有人说这是 BUG,博主认为这个应该是 ESXi 的管理机制:每次 ESXi 重启后,宿主会直接忽视核显直通然后获得核显的使用权,应该是为了防止在直通核显以后又误将管理口网卡直通出去造成 ESXI 无法进入管理界面的尴尬。这个可以关掉的:
1、在电脑浏览器打开 ESXi,在菜单中开启 SSH;
2、在电脑上打开 MobaXterm 或者 Putty 等软件,用 root 账号登录到 ESXi 的 SSH 下;
3、输入一条命令(须注意英文的大小写和空格),回车:
1 esxcli system settings kernel set -s vga -v FALSE
4、重启 ESXi 生效。N5105 BIOS 版本 : V5.19
N5105 核心显卡的 Device ID : 0x4e61
1 安装 Debian 11 / Ubuntu 22(推荐 Ubuntu) 在 ESXi 7 里新建一台虚拟机,建议分配 4 核 CPU 和 2 G~4 G 内存。我这里的启动设置是默认的 BIOS
启动,也有论坛玩家反馈需要设置为 EFI
启动才可以成功添加直通核显。先 不要
添加核显,用默认的虚拟显卡安装好 Debian 11 或者 Ubuntu 22.04(推荐安装 Ubuntu 22.04
,因为不用自己折腾 non-free 的 linux 固件),选择安装组件时 不要
选择任何 GUI图形化桌面
(如果安装了图形界面,后面直通核显时大概率死机
),仅勾选安装 SSH Server
和基础组件,Ubuntu 要用 ubuntu-22.04-live-server-amd64.iso 这个安装包,选最小化安装,其他组件可以等安装完成后再 apt install
。 我在这里就先预留了所有内存,因为后面直通显卡设备有这个要求。也可以等直通显卡时再修改此项配置。
注意: 不要
选择任何 GUI 图形化桌面
2 开启 Debian 11 / Ubuntu 22 SSH 登录 说明: 以下所有 Linux 命令都是用 root
用户执行。如果用普通用户执行,可能需要加上 sudo
,请自行测试。 因为后面我们要禁用虚拟机默认的虚拟显卡,将会导致虚拟机的控制台不可操作,只能远程 SSH 登录后操作,所以在操作核显之前,我们要先配置好 Debian 11 / Ubuntu 22 的静态 IP 和 SSH 登录。 先在线升级一下各组件,下载速度慢的请自行设置一下国内的镜像源:
1 apt update && apt -y upgrade
安装一下后面要用到的工具
1 apt -y install vim wget curl open-vm-tools
3 修改为静态 IP (如果安装时已经设定为静态 IP 的可以跳过这一步)
3.1 Debian 11 设置静态 IP 1 vim /etc/network/interfaces
先按 i
进入编辑模式,然后修改 iface ensxxx inet dhcp
一行里的 dhcp
为 static
,ensxxx
要和你的实际网卡名字保持一致,IP\子网掩码\网关\DNS 这四行根据实际情况添加:
1 2 3 4 5 iface ens224 inet static address 192.168.1.18 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 114.114.114.114
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
重启网络让新 IP 生效:
1 /etc/init.d/networking restart
3.2 Ubuntu 22 设置静态 IP Ubuntu 比 Debian 要麻烦一些,Ubuntu 从 17.10 开始,已放弃在 /etc/network/interfaces
里固定 IP 的配置,即使配置也不会生效,而是改成 netplan
方式,配置写在 /etc/netplan/00-installer-config.yaml
或者类似名称的 yaml 文件里:
1 vim /etc/netplan/00-installer-config.yaml
先按 i
进入编辑模式,然后修改为下面这个样子,其中 ensxxx
要和你的实际网卡名字保持一致,IP\网关\DNS 根据实际情况添加(注意每一层前边的缩进,至少比上一层多两个空格):
1 2 3 4 5 6 7 8 9 10 11 network: ethernets: ensxxx: addresses: - 192.168 .1 .18 /24 gateway4: 192.168 .1 .1 nameservers: addresses: - 192.168 .1 .1 - 114.114 .114 .114 version: 2
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
重启网络让新 IP 生效:
4 开启 root 用户远程登录 如果安装时没安装 SSH 服务,请先安装:
1 apt -y install openssh-server
检查状态:
确认 SSH 服务是 enabled 状态,可以开机自启动: 修改 sshd_config
文件允许 root 用户远程登录: 这一步操作会减弱 Debian / Ubuntu 主机的安全性,不过家用一般也不用太在意,特别在意的可以设置为 SSH 公钥/私钥免密登录,具体方法网上有教程,也可以看这里 SSH无密码登录及WinSCP和PuTTY设置 。
1 vim /etc/ssh/sshd_config
先按 i
进入编辑模式,然后找到以下几行并去掉前面的注释标记 #
号,并修改后面的设定值:
1 2 PermitRootLogin yes PasswordAuthentication yes
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
Ubuntu 还需要手动为 root 用户设置密码:
重启 SSH 服务:
打开 MobaXterm 或者 Putty 等软件,用 root 账号和密码尝试连接运行在 Debian / Ubuntu 的 IP 22 端口上的 SSH 服务,确定可以正常登录和输入命令。
5 升级 Debian 11 / Ubuntu 22 内核到 5.18 5.1 升级 Debian 11 内核到 5.18 Debian 11 安装好默认是 5.10 内核,根据 Jellyfin 中国特供版作者 nyanmisaka 等各位大佬的研究,想要让 N 5105 核显开启硬件转码需要升级 Linux 内核到 5.17 以上,开启低功耗编码 HuC 和 GuC。
到这里 下载 Debian 5.18 内核二进制安装包,手动安装之。
下载已编译的 5.18 内核二进制安装包,并安装:
1 2 3 4 mkdir kernel cd kernel wget http://ftp.debian.org/debian/pool/main/l/linux-signed-amd64/linux-image-5.18.0-2-amd64_5.18.5-1_amd64.deb dpkg -i *.deb
查看已安装的内核:
1 dpkg --list | grep linux-image
返回:
1 2 3 ii linux-image-5.10.0-16-amd64 5.10.127-1 amd64 Linux 5.10 for 64-bit PCs (signed) ii linux-image-5.18.0-2-amd64 5.18.5-1 amd64 Linux 5.18 for 64-bit PCs (signed) ii linux-image-amd64 5.10.127-1 amd64 Linux for 64-bit PCs (meta-package)
重启:
重启后查看新内核生效了没有:
正常情况应该返回:
1 Linux debian 5.18.0-2-amd64
5.2 升级 Ubuntu 22 内核到 5.18 Ubuntu 22.04 安装好以后是 5.15 内核,我们把它升级到 5.18 内核:
下载 ubuntu-mainline-kernel 脚本:
1 wget https://raw.githubusercontent.com/pimlie/ubuntu-mainline-kernel.sh/master/ubuntu-mainline-kernel.sh
将脚本放在可执行路径中:
1 install ubuntu-mainline-kernel.sh /usr/local/bin/
检查当前可以下载安装的内核版本:
1 ubuntu-mainline-kernel.sh -r
返回:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <...省略...> v5.18.0 v5.18.1 v5.18.2 v5.18.3 v5.18.4 v5.18.5 v5.18.6 v5.18.7 v5.18.8 v5.18.9 v5.18.10 v5.18.11 v5.18.12 v5.18.13 v5.18.14 v5.18.15 v5.18.16 v5.18.17 v5.18.18 v5.18.19 <...省略...>
下载安装指定版本内核 v5.18.19
:
1 ubuntu-mainline-kernel.sh -i v5.18.19
返回:
1 2 3 4 5 6 7 8 9 10 11 12 Downloading index from kernel.ubuntu.com Will download 6 files from kernel.ubuntu.com: Downloading amd64/linux-headers-5.18.19-051819-generic_5.18.19-051819.202208211443_amd64.deb: 100% Downloading amd64/linux-headers-5.18.19-051819_5.18.19-051819.202208211443_all.deb: 100% Downloading amd64/linux-image-unsigned-5.18.19-051819-generic_5.18.19-051819.202208211443_amd64.deb: 100% Downloading amd64/linux-modules-5.18.19-051819-generic_5.18.19-051819.202208211443_amd64.deb: 100% Downloading amd64/CHECKSUMS: 100% Downloading amd64/CHECKSUMS.gpg: 100% Signature of checksum file has been successfully verified Checksums of deb files have been successfully verified with sha256sum Installing 4 packages Cleaning up work folder
查看当前已通过该脚本安装的内核版本:
1 ubuntu-mainline-kernel.sh -l
返回:
重启:
重启后查看新内核生效了没有:
返回:
代表新内核成功启用。
6 直通核显到 Debian 11 / Ubuntu 22 6.1 添加核显 PCI 设备成为虚拟机硬件 现在关闭 Debian 11 / Ubuntu 22 虚拟机,在 ESXi 7 里将核显 PCI 设备添加到虚拟机的硬件里:
6.2 禁用虚拟显卡 然后在 虚拟机选项-高级-配置参数-编辑配置
里,将 svga.present
由 TRUE
改为 FALSE
,保存并启动虚拟机。 开机后虚拟机控制台将一直呈现灰色而不可用,稍等片刻可以尝试 SSH 连接设置好的静态 IP 的 22 端口。如果不出意外,应该可以用 root 用户直接远程登录继续执行下面的操作。
验证核显是否已经加载:
返回:
1 2 3 4 5 6 total 0 drwxr-xr-x 3 root root 100 Jul 15 22:07 . drwxr-xr-x 17 root root 3200 Jul 15 22:07 .. drwxr-xr-x 2 root root 80 Jul 15 22:07 by-path crw-rw---- 1 root video 226, 0 Jul 15 22:07 card0 crw-rw---- 1 root render 226, 128 Jul 15 22:07 renderD128
说明核显已经正常识别加载。
(以下内容主要来自 N5105 PVE docker-compose 安装Jellyfin 并实现 硬解码 、 N5015使用心得 、软路由N5105硬解方案归纳 、 司波图 / 通用PVE AIO安装教程 和 N5105 jasper lake 开启硬件转码方法 ) 。
7 安装缺失固件 7.1 Debian 11 安装缺失固件 因为开启核显开启 HuC 和 GuC 功能需要用到 Intel 提供的闭源已编译二进制固件,但是 Debian 默认的安装 ISO 镜像并不带这些 non-free 的 Linux 固件,虽然也可以从 Debian 官方下载下载包含non-free Linux固件的ISO镜像 来进行安装,或者手动下载最新的 20220718版non-free Linux固件安装包 解压后安装,但经过我的测试,这两种方式安装的 Intel 核显 i 915 GuC 固件版本还是偏低,需要到这里 下载三个最新版本的固件:
然后上传到 /lib/firmware/i915
,如果 i 915 目录不存在就先创建它:
1 mkdir /lib/firmware/i915
也可以直接在 Debian 里下载:
1 2 3 4 5 mkdir /lib/firmware/i915 cd /lib/firmware/i915 wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_guc_69.0.3.bin wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_huc_9.0.0.bin wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/icl_dmc_ver1_09.bin
感谢恩山论坛玩家网友lifansimj 指出使用 wget 命令直接拉取的固件文件大小可能有误,建议用电脑浏览器下载后上传到 Debian。 从这里下载: 或者: 完成后注意核对文件大小和权限:
1 ls -l /lib/firmware/i915
返回:
1 2 3 -rw-r--r-- 1 root root 343360 Jul 14 21:56 ehl_guc_69.0.3.bin -rw-r--r-- 1 root root 498880 Jul 14 22:03 ehl_huc_9.0.0.bin -rw-r--r-- 1 root root 25952 Jul 14 21:55 icl_dmc_ver1_09.bin
在 WinSCP 里看是这样的:补充 :(可选,非必须
)如果想安装完整版的最新固件,可以从这里 下载(压缩包文件大小达近 400MB
,解压后更大,浪费硬盘空间,非必要情况不建议下载),以下命令供参考:
1 2 3 4 5 6 mkdir firmware & cd firmware wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/snapshot/linux-firmware-20220708.tar.gz tar -zxf linux-firmware-20220708.tar.gz mkdir /lib/firmware/i915 cp linux-firmware-20220708/i915/* /lib/firmware/i915/ rm -rf linux-firmware-20220708/
7.2 Ubuntu 22 检查固件 相比之下,Ubuntu 22.04 就省事多了,已安装的固件包比较全,已经包含最新的 i 915 固件,可以列一下看看:
1 2 3 ls -l /lib/firmware/i915/ehl_guc_69* ls -l /lib/firmware/i915/ehl_huc_9* ls -l /lib/firmware/i915/icl_dmc_ver1_09*
返回:
1 2 3 -rw-r--r-- 1 root root 343360 May 13 11:44 /lib/firmware/i915/ehl_guc_69.0.3.bin -rw-r--r-- 1 root root 498880 May 13 11:44 /lib/firmware/i915/ehl_huc_9.0.0.bin -rw-r--r-- 1 root root 25952 May 13 11:44 /lib/firmware/i915/icl_dmc_ver1_09.bin
与在 Debain 部分手动下载的三个文件大小是一致的,所以建议使用 Ubuntu 22.04
。
8 开启核显低功耗编码 HuC 和 GuC 编辑 grub 配置文件,强制开启 HuC 和 GuC:
先按 i
进入编辑模式,然后找到并修改 GRUB_CMDLINE_LINUX_DEFAULT="quiet"
为:
1 GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on i915.enable_guc=3 quiet"
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
然后更新 grub 菜单:
或者:
1 grub-mkconfig -o /boot/grub/grub.cfg
重启:
补充说明:guc 引导项不同的参数不同的作用,具体如下:
1 2 3 4 5 i915.enable_guc=1 ## 启用GuC提交和电源管理 i915.enable_guc=2 ## 只启用HuC认证 i915.enable_guc=3 ## 将两个功能结合在一起# i915.enable_guc_loading=1 ##4.16之前使用此参数开启huc认证
经过我的测试,如果 /etc/default/grub
这里设置 i915.enable_guc=2
,GuC submission
会是 disabled
,不确定是否会影响硬件转码,就还是设置为 3
吧。 至此,核显设置就安装完成了。
安装 intel-gpu-tools,可以用 intel_gpu_top
命令查看 gpu 的运行状态
1 apt -y install intel-gpu-tools
重启后,验证低功耗编码 HuC 和 GuC 是否开启:
1 journalctl -b -o short-monotonic -k | egrep -i "i915|dmr|dmc|guc|huc"
返回:
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 [ 0.000000] debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.18.0-2-amd64 root=UUID=1ac9bedb-49b8-4a86-b4e5-72b33eb78abd ro intel_iommu=on i915.enable_guc=3 quiet [ 0.043744] debian kernel: Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.18.0-2-amd64 root=UUID=1ac9bedb-49b8-4a86-b4e5-72b33eb78abd ro intel_iommu=on i915.enable_guc=3 quiet [ 3.509988] debian kernel: Setting dangerous option enable_guc - tainting kernel [ 3.509991] debian kernel: Setting dangerous option enable_guc - tainting kernel [ 3.511534] debian kernel: i915 0000:0b:00.0: [drm] VT-d active for gfx access [ 3.511543] debian kernel: i915 0000:0b:00.0: vgaarb: deactivate vga console [ 3.511906] debian kernel: i915 0000:0b:00.0: [drm] Transparent Hugepage mode 'huge=within_size' [ 3.514195] debian kernel: i915 0000:0b:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff [ 3.514202] debian kernel: i915 0000:0b:00.0: [drm] Failed to find VBIOS tables (VBT) [ 3.514250] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 3.525794] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 3.525952] debian kernel: i915 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=io+mem [ 3.527603] debian kernel: i915 0000:0b:00.0: firmware: direct-loading firmware i915/icl_dmc_ver1_09.bin [ 3.528081] debian kernel: i915 0000:0b:00.0: [drm] Finished loading DMC firmware i915/icl_dmc_ver1_09.bin (v1.9) [ 4.531068] debian kernel: i915 0000:0b:00.0: [drm] failed to retrieve link info, disabling eDP [ 4.532486] debian kernel: i915 0000:0b:00.0: firmware: direct-loading firmware i915/ehl_guc_69.0.3.bin [ 4.533796] debian kernel: i915 0000:0b:00.0: firmware: direct-loading firmware i915/ehl_huc_9.0.0.bin [ 4.695205] debian kernel: i915 0000:0b:00.0: [drm] GuC firmware i915/ehl_guc_69.0.3.bin version 69.0 [ 4.695214] debian kernel: i915 0000:0b:00.0: [drm] HuC firmware i915/ehl_huc_9.0.0.bin version 9.0 [ 4.709613] debian kernel: i915 0000:0b:00.0: [drm] HuC authenticated [ 4.709763] debian kernel: i915 0000:0b:00.0: [drm] GuC submission enabled [ 4.709766] debian kernel: i915 0000:0b:00.0: [drm] GuC SLPC disabled [ 4.712512] debian kernel: [drm] Initialized i 915 1.6.0 20201103 for 0000:0b: 00.0 on minor 0 [ 6.089740] debian kernel: i915 0000:0b:00.0: [drm] Cannot find any crtc or sizes [ 6.090267] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 7.459136] debian kernel: i 915 0000:0b: 00.0: [drm] Cannot find any crtc or sizes [ 7.459592] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 8.863108] debian kernel: i915 0000:0b:00.0: [drm] Cannot find any crtc or sizes [ 21.078282] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 21.078426] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 31.311088] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 31.314778] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal. [ 32.698143] debian kernel: i915 0000:0b:00.0: [drm] *ERROR* VBT claims to have both internal and external displays on PHY A. Configuring for internal.
因为之前并没有在虚拟机里手动导入核显的 VBios(这是另外一个复杂的工程),所以有一堆的和 VBT
有关的 *ERROR*
,这可能就是虚拟机不能开启图形界面的原因,会导致虚拟机系统进入图形界面时直接卡死。还好我们只是把核显用来解码和编码,最关心的 HuC 和 GuC 都成功开启了:
1 2 3 4 5 6 [ 4.532486] debian kernel: i915 0000:0b:00.0: firmware: direct-loading firmware i915/ehl_guc_69.0.3.bin [ 4.533796] debian kernel: i915 0000:0b:00.0: firmware: direct-loading firmware i915/ehl_huc_9.0.0.bin [ 4.695205] debian kernel: i915 0000:0b:00.0: [drm] GuC firmware i915/ehl_guc_69.0.3.bin version 69.0 [ 4.695214] debian kernel: i915 0000:0b:00.0: [drm] HuC firmware i915/ehl_huc_9.0.0.bin version 9.0 [ 4.709613] debian kernel: i915 0000:0b:00.0: [drm] HuC authenticated [ 4.709763] debian kernel: i915 0000:0b:00.0: [drm] GuC submission enabled
特别提示
:如果上面的日志里有错误提示加载某个固件 .bin
不成功,请仔细核对一下文件路径、文件名、文件大小和文件权限,按照日志里的提示到相应的地址下载对应的固件文件,上传到 /lib/firmware/i915
并设置好文件权限即可。
9 安装 Docker 9.1 为 Debian / Ubuntu 安装 Docker 在 Debian / Ubuntu 的 SSH 中输入命令:
1 curl -fsSL https://get.docker.com | bash -s docker
下载速度慢的话可以试试指定国内的源,例如阿里云:
1 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
检查:
如果能看到以下说明成功:
1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9.2 安装 docker-compose 目前 docker-compose 的最新版本是 v 2.6.1,如果有更新的版本,请相应替换:
1 curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
1 chmod +x /usr/local/bin/docker-compose
创建软链:
1 ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
执行完成后输入:
1 docker-compose --version
如果能看到版本号的输出,即表示安装成功,例如:
1 Docker Compose version v2.6.1
10 安装 Jellyfin 10.1 安装准备 首先需要规划 jellyfin 安装在什么位置 例如 /opt/apps/jellyfin
请注意,如果将来索引和转码的视频数量很多,jellyfin 的 config 和 cache 文件夹可能膨胀到大几十 GB,请确保安装挂载点有足够的磁盘空间可以容纳。
创建 jellyfin 安装挂载点 /opt/apps/jellyfin
,并在该处新建三个挂载文件夹 config
、cache
和 media
:
1 2 3 mkdir -p /opt/apps/jellyfin cd /opt/apps/jellyfin mkdir config cache media
创建完成后开始编写 docker-compose.yml
文件:
1 2 cd /opt/apps/jellyfin vim docker-compose.yml
先按 i
进入编辑模式,然后复制以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 version: '3' services: jellyfin: image: nyanmisaka/jellyfin:latest container_name: jellyfin network_mode: host environment: - TZ=Asia/Shanghai - JELLYFIN_PublishedServerUrl=yourServer volumes: - ${PWD}/config:/config - ${PWD}/cache:/cache - ${PWD}/media:/media restart: unless-stopped privileged: true devices: - /dev/dri:/dev/dri
几点说明:
${PWD}
指的是当前目录 /opt/apps/jellyfin
, 媒体文件夹 ${PWD}/media
即相当于 /opt/apps/jellyfin/media
,下面我们会把远程共享文件夹直接挂载到这里。它映射到容器里的 /media
,记住容器和宿主机两个路径的对应关系,在设置 jellyfin 的时候会用到;
Docker image 用的是 nyanmisaka 大佬开发的 Jellyfin 中国特供版的开发者的最新版,目前的版本是 10.8.1
,封装了核显驱动;
JELLYFIN_PublishedServerUrl
需要改成本机的 IP 地址如 192.168.1.18,不知道设置为 127.0.0.1 是否可以(未测试
);
devices: - /dev/dri:/dev/dri
是把核显挂载到容器内部。
Network 用 host,省去指定端口,http 访问的默认端口是 8096,如果需要映射到别的端口可以自行修改 network_mode 和添加 ports 映射,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 version: '3' services: jellyfin: image: nyanmisaka/jellyfin:latest container_name: jellyfin network_mode: bridge ports: - 8096 :8096 - 8920 :8920 - 7359 :7359/udp - 1900 :1900/udp environment: - TZ=Asia/Shanghai - JELLYFIN_PublishedServerUrl=yourServer volumes: - ${PWD}/config:/config - ${PWD}/cache:/cache - ${PWD}/media:/media restart: unless-stopped privileged: true devices: - /dev/dri:/dev/dri
端口说明:
ports
说明
8096
WebUI http 访问端口
8920
WebUI https 访问端口
7359/udp
(可选)允许本地网络的客户端发现 Jellyfin
1900/udp
(可选)DLNA 服务
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。 以上就做好了启动 Jellyfin 的所有准备。
10.2 启动 Docker 容器 输入命令启动 Docker 容器:
1 2 cd /opt/apps/jellyfin docker-compose up -d
就会开始拉取镜像,并启动 jellyfin。 等执行完毕后再次输入:
就可以看到 jellyfin 正在运行中:
1 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 002dc50b61a6 nyanmisaka/jellyfin "./jellyfin/jellyfin…" 14 seconds ago Up 12 seconds (health: starting) jellyfin
耐心等待容器初始化完成。
进入容器内部看一下核显是否成功挂载:
1 docker exec -i -t jellyfin /bin/bash
上面命令中的 jellyfin
就是 docker-compose.yml
里设定好的容器名 container_name
。
在容器内部查看核显是否挂载:
返回:
1 2 3 4 5 total 0 drwxr-xr-x 2 root root 80 Jul 16 09:29 . drwxr-xr-x 13 root root 2980 Jul 16 09:29 .. crw-rw---- 1 root video 226, 0 Jul 16 09:29 card0 crw-rw---- 1 root 106 226, 128 Jul 16 09:29 renderD128
和在 Debian / Ubuntu 宿主机里一样,说明容器成功挂载核显。
输入:
退出容器。
这时在浏览器地址栏输入 http://Debian or Ubuntu 的ip地址:8096
就可以进入 jellyfin 后台,例如 http://192.168.1.18:8096
10.3 挂载 NFS 远程视频文件 我的视频文件全在另一部群晖里,已开启了 NFS 共享服务 NFS 版本 v 4.1,权限为可读写(具体设置方法请在网上搜索群晖 NFS 设置教程)。以下的设置仅供参考: 为 Debian 安装 NFS 客户端:
1 apt -y install nfs-common
假设远程群晖主机(192.168.1.19
)NFS 共享出来了 /volume2/video
这个文件夹,先尝试手动挂载它:
1 mount -t nfs 192.168.1.19:/volume2/video /opt/apps/jellyfin/media
检查一下挂载是否成功:
成功后可以修改 /etc/fstab
实现开机自动挂载(这可能会在后面引起一点小问题,最后有解决办法):
先按 i
进入编辑模式,添加一行:
1 192.168.1.19:/volume2/video/opt/apps/jellyfin/medianfs rw,soft,intr 0 0
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
媒体文件确定挂载成功后,需要重启容器一次让 jellyfin 读取它:
1 2 cd /opt/apps/jellyfin docker-compose restart
或者先停止再启动
1 2 docker-compose stop docker-compose up -d
11 设置 jellyfin 访问 http://Debian or Ubuntu的ip地址:8096
例如 http://192.168.1.18:8096
,开始设置,具体设置方法可参考 群晖安装jellyfin最新10.8.0版本的教程 。
设置媒体文件夹时要注意:
媒体文件夹在容器内的路径是 /media
,jellyfin 设置页面添加媒体文件夹的路径应该用容器内的路径如 /media/movie
、/media/tv
,因为容器内的 /media
被映射到我们上面设置好的宿主机 /opt/apps/jellyfin/media
,容器内 /media/movie
对应的就是宿主机 /opt/apps/jellyfin/media/movie
,以此类推。
12 开启硬件转码 按下面的图片内容来设置硬件转码,设置完保存即可:
13 验证硬件转码效果 13.1 测试视频一 测试片源 America.Wild.National.Parks.Adventure.2016.BluRay.2160p.x265.10bit.HDR.2Audio.mUHD-FRDS.mkv
,带字幕:
13.1.1 关闭硬件转码测试 纯 CPU 转码,转码为 1080 p 10 Mbps H 264 视频,烧录字幕,转码帧率只有 20 fps:
13.1.2 开启硬件转码测试 开启硬件转码后,还是转码为 1080 p 10 Mbps H 264 视频,烧录字幕,转码帧率 53 fps:
13.1.3 CPU 占用对比
13.1.4 日志验证 1 2 3 4 5 6 7 8 /usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration 200M -ss 00:32:21.000 -init_hw_device vaapi=va:,driver=iHD,kernel_driver=i915 -init_hw_device qsv=qs@va -init_hw_device opencl=ocl@va -filter_hw_device qs -hwaccel vaapi -hwaccel_output_format vaapi -autorotate 0 -canvas_size 1920x1080 -i file:"/media/4k_uhd/狂野之美:国家公园探险.America.Wild.National.Parks.Adventure.2016.BluRay.2160p.x265.10bit.HDR.2Audio.mUHD-FRDS/America.Wild.National.Parks.Adventure.2016.BluRay.2160p.x265.10bit.HDR.2Audio.mUHD-FRDS.mkv" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -codec:v:0 h264_qsv -low_power 1 -preset 7 -look_ahead 0 -b:v 9616000 -maxrate 9616000 -bufsize 19232000 -profile:v:0 high -level 51 -g:v:0 72 -keyint_min:v:0 72 -filter_complex "[0:3]scale=flags=fast_bilinear,format=bgra,hwupload=derive_device=qsv:extra_hw_frames=64[sub];[0:0]setparams=color_primaries=bt2020:color_trc=smpte2084:colorspace=bt2020nc,scale_vaapi=w=1920:h=1080,hwmap=derive_device=opencl,tonemap_opencl=format=nv12:p=bt709:t=bt709:m=bt709:tonemap=bt2390:peak=100:desat=0,hwmap=derive_device=qsv:reverse=1:extra_hw_frames=16,format=qsv[main];[main][sub]overlay_qsv=eof_action=endall:shortest=1:repeatlast=0:w=1920:h=1080" -start_at_zero -codec:a:0 libfdk_aac -ac 2 -ab 384000 -af "volume=2" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 647 -hls_segment_filename "/config/transcodes/c2b53203519dbbad0f8d5dd9788b228e%d.ts" -hls_playlist_type vod -hls_list_size 0 -y "/config/transcodes/c2b53203519dbbad0f8d5dd9788b228e.m3u8" Stream mapping: Stream Stream overlay_qsv:default (graph 0) -> Stream Stream Press [q] to stop, [?] for help
13.1.5 Intel_gpu_top 验证 执行:
查看核显解码时的运行状态:
从这里也可以看出核显在工作了。
13.2 测试视频二 采用 Jellyfish 视频比特率测试文件,选择最高码率400Mbps的视频 ,29 秒的视频文件大小达到 1.4 GB,无字幕:jellyfish-400-mbps-4k-uhd-hevc-10bit.mkv
还是转码为 1080 p 10 Mbps H 264 视频,转码帧率 44 fps:
13.2.1 日志验证
14 补充设置 14.1 延迟启动 Docker 后续使用中发现虚拟机重启后,因为 NFS 挂载需要一点时间,但是 Docker 已经启动,会发生 jellyfin 无法识别媒体文件夹内容的情况,表现是播放文件弹出“播放错误该客户端与媒体不兼容,服务器未发送兼容的媒体格式
”提示,和硬解没有成功开启的提示是一样的,但查看核显状态正常。 执行:
后错误消失。
解决思路就是延迟启动 Docker 服务,等待 NFS 挂载成功后再启动:
14.2 取消 Docker 开机自启动 1 systemctl disable docker.service
14.3 用 /etc/rc.local
延迟启动 Docker 服务 Debian 11 和 Ubuntu 22 默认不带 /etc/rc.local
文件,而 rc.local
服务却还是自带的,需要手工添加一个 /etc/rc.local
文件:(以下为一整条命令,请一起复制到 ssh 命令行运行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cat <<EOF >/etc/rc.local# !/bin/sh -e # # # Make sure that the script will "exit 0" on success or any other # value on error. # # bits. # exit 0 EOF
然后赋予可执行权限:
接着启动 rc-local
服务:
1 systemctl enable --now rc-local
此时可能会弹出警告:
1 2 3 4 5 6 7 8 9 10 11 12 13 The unit files have no installation config (WantedBy=, RequiredBy=, Also=, Alias= settings in the [Install] section, and DefaultInstance= for template units). This means they are not meant to be enabled using systemctl. Possible reasons for having this kind of units are: • A unit may be statically enabled by being symlinked from another unit's .wants/ or .requires/ directory. • A unit's purpose may be to act as a helper for some other unit which has a requirement dependency on it. • A unit may be started when needed via activation (socket, path, timer, D-Bus, udev, scripted systemctl call, ...). • In case of template units, the unit is meant to be enabled with some instance name specified.
不用管它,因为这个服务没有任何依赖的系统服务,只是开机执行 /etc/rc.local
脚本而已。
再次查看状态:
1 systemctl status rc-local.service
返回:
1 2 3 4 5 6 7 8 9 10 11 ● rc-local.service - /etc/rc.local Compatibility Loaded: loaded (/lib/systemd/system/rc-local.service; enabled-runtime; vendor preset: enabled) Drop-In: /usr/lib/systemd/system/rc-local.service.d └─debian.conf Active: active (exited) since Sat 2022-07-16 12:27:14 HKT; 46s ago Docs: man:systemd-rc-local-generator(8) Process: 37576 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS) CPU: 1ms Jul 16 12:27:14 debian systemd[1]: Starting /etc/rc.local Compatibility... Jul 16 12:27:14 debian systemd[1]: Started /etc/rc.local Compatibility.
然后就可以把需要开机启动的命令添加到 /etc/rc.local
文件,放到在 exit 0
前面即可。
编辑 /etc/rc.local
文件:
先按 i
进入编辑模式,在文件末尾 exit 0
之前追加如下内容:
1 2 sleep 180 systemctl restart docker.service
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
说明:sleep 180
的意思是延迟 3
分钟启动 Docker,这里用 restart
是为了保证万一 Docker 已经被另外的脚本启动,就重启它。如果 Docker 还没有启动执行 restart
也会启动它。
重启服务器进行测试:
稍等几分钟,尝试访问 jellyfin 和播放视频,一切正常,马上开始愉快的看片吧。如果想在外网也能看,再设置一下 upnp 或在路由器上手动映射端口。
14.4 自动更新 Docker 镜像 nyanmisaka/jellyfin
镜像更新很频繁,基本上每个月都有更新,修正 bug 改善性能,为了能够第一时间自动更新,我们引入 watchtower
,它可以自动检查指定的 Docker 镜像是否存在更新,通过 email 等方式发送更新提醒,也可以自动更新指定镜像。
watchtower
可以使用 Docker 部署,用 Docker 管理 Docker:
1 2 3 mkdir /opt/apps/watchtower cd /opt/apps/watchtower vim docker-compose.yml
先按 i
进入编辑模式,然后复制以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 version: "3" services: watchtower: image: containrrr/watchtower container_name: watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: jellyfin --cleanup --schedule "0 0 4 * * *" restart: always environment: - TZ=Asia/Shanghai - WATCHTOWER_MONITOR_ONLY='false' - WATCHTOWER_NOTIFICATIONS=email - WATCHTOWER_NOTIFICATION_EMAIL_FROM=sender_name@mailserver_domain.com - WATCHTOWER_NOTIFICATION_EMAIL_TO=receiver_name@mail_domain.com - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.mailserver_domain.com - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=sender_name@mailserver_domain.com - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=sender_mail_password
编辑完成后先按 ESC
,退出编辑模式,再按英文冒号键 :
然后输入 wq
最后回车就可以保存并退出。
说明:
command
解释:设定为每天凌晨 4 点自动检查容器 jellyfin
对应的镜像仓库中是否存在更新版本,如果有就自动更新它,并删除过时镜像,节约硬盘空间;
environment
里有两个邮箱地址,FROM
是发送提醒邮件的邮箱地址,TO
是接受提醒邮件的邮箱地址,SERVER
部分是发送提醒邮件的邮箱对应的邮件服务器 SMTP 资料,密码是明文存储,建议注册一个非主要邮箱来执行这个任务。
输入命令启动 Docker 容器:
1 2 cd /opt/apps/watchtower docker-compose up -d
就会开始拉取镜像,并启动 watchtower。 如果邮箱配置没有问题,会收到一封设置信息提醒邮件:
1 2 3 4 Watchtower 1 .4 .0 Using notifications: smtpOnly checking containers with name "jellyfin" Scheduling first run: 2022 -07 -20 04 :00 :00 +0800 CST Note that the first check will be performed in 7 hours, 25 minutes, 31 seconds
如果仓库里的 nyanmisaka/jellyfin
镜像有更新,自动更新完成后会收到更新提醒邮件:
1 2 3 4 Found new nyanmisaka/jellyfin:latest image (e54a87b846cc) Stopping /jellyfin (002dc50b61a6) with SIGTERM Creating /jellyfin Removing image 1b6d9d83f7c9
如果不出意外,更新后之前所有的设置都会保留,这样我们就能第一时间体验最新镜像了。
结语 到此为止,N 5105 作为一台家庭软路由主机,在底层安装 EXSi 虚拟化平台的基础上终于可以兼顾上网、轻 Nas 应用和视频硬件转码,基本上算是完美了。 再次感谢各位无私分享的大佬!如果你觉得 nyanmisaka/jellyfin
好用,欢迎向 Jellyfin 中国特供版的开发者 nyanmisaka 大佬捐赠。
文件下载 本文中涉及到的固件打包下载 :
链接: https://pan.baidu.com/s/1WPiIH7u\_jb9HV8gpC424XQ?pwd=aoe2 提取码: aoe 2
引用
N5105 PVE docker-compose 安装Jellyfin 并实现 硬解码
N5015使用心得
Jellyfin中国特供版+Docker镜像,含驱动,免折腾开箱即用
软路由N5105硬解方案归纳
司波图 / 通用PVE AIO安装教程
N5105 jasper lake 开启硬件转码方法
群晖安装jellyfin最新10.8.0版本的教程
N5105/N6005 群晖 核显解码 配置参考
群晖用Jellyfin实现GPU硬解实时转码
最新Jellyfin硬件转码教程丨威联通新平台有多强?4K转码只用20%
Jellyfish Video Bitrate Test Files
Centos7 延迟启动docker
Debian 11 Bullseye 解决 /etc/rc.local 开机启动问题
VMware vSphere(ESXI)7.X直通核显再重启ESXI后仍提示需要直通的解决办法
Ubuntu 20.04 升级最新内核、安装指定内核版本
Ubuntu20.04修改ip地址的方法示例
【更新】ESXi直通核显硬解 以N5105 Debian Docker安装N大Jellyfin为例 低功耗intel CPU核显通用核显硬解转码 非pve下套娃_哔哩哔哩_bilibili
使用N5105 第四版小主机 esxi下开启核显硬解emby的尝试_n5105核显解码_瑞哥-RealWang的博客-CSDN博客
[首发]群晖核显硬解转码以 N 5105 为例 arpl 引导内核 5.10 docker N 大 jellyfin N 6005 等 11 代低功耗 CPU 可通用_哔哩哔哩_bilibili