Ubuntu Server 24.10 在 N100 小主机上最小化安装 kodi

首图是目前的家庭网络设备拓扑图。虽然是教程贴,还是记录下前因后果。

看片困境

前段时间买了低功耗小主机,关掉了威联通 NAS,客厅如何看电视就成了问题,看了不少经验分享贴都推荐五十块的二手魔百盒。闲鱼下单了 s905l3a 带 wifi 的商家版本,预装了常用的电视 app,配合红外遥控确实是老年人友好的解决方案。
开机后发现按键操作时常失灵,而且操作和播放视频过程中频繁自启或者退回桌面。联系商家说可能是电源的问题,这个是旧华为路由器闲置下来的。尝试跟光猫的电源(高 0.5A)交换,情况有所好转,但依然会概率性重启。一番交涉,商家爽快的答应换货。

最坑的是,BBLL 能装上,jellyfin TV 却不行。网上也看到有人 po 出同样的问题,原因是这种在运营商基础上魔改的 ROM 缺少很多系统模块。有大佬给出了 patch,但需要自己动手编译并且不保证有 bug,遂放弃。
当然,还有刷机这条路,买这个盒子也是图他 ROM 生态丰富。偶然间看到盒子店铺的一条评论,想再刷回来的话还要再掏钱或者提前备份镜像(不会啊),还是放弃吧。所以换货回来只是简单检查了下重启的毛病,就没有继续折腾的兴致了,扔到卧室给小朋友放放动画片也挺好。

前期摸索

所以事情又回到原点,客厅的电视用什么播放器。最终,还是打上了小主机的主意。因为一开始只打算做网络服务,装的是没有桌面程序的 Ubuntu server 系统,不过 N100 算比较新的 CPU,为了提高驱动兼容性上了最新的 **Ubuntu 24.10 (Oracular Oriole)**,据说明年 Plucky Puffin 发布的时候可以无痛升级。

所有 linux TV 播放器里面,kodi 绝对是老大哥,生态完整、资料好找,安装方式也多种多样,最简单的当然是 libreElec,开箱即用,但考虑到要把系统重装为 PVE,也没有 openwrt 的需求,还是打算宿主机直装的方式。一开始考虑 docker,但不是版本太老就是没啥人用,出问题的概率很大。

幸运的是,找到两篇(12)在 server 版 ubuntu 上最小安装 kodi 的教程;遗憾的是,他们用的 GUI 框架都是比较古老的 X11,在最新内核下需要安装很多依赖并且参在兼容性风险。另外这个一键安装脚本也是差不多的思路。关于 X11、Wayland 和 GBM 的区别可以看这里的解释。

进一步查找,官方论坛的这个帖子给出了重要线索,所以首先确认硬件驱动没问题(参考 12),然后根据官方文档直接安装。

具体流程

硬件和驱动情况如下:

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
➜  ~ uname -a
Linux n100 6.11.0-9-generic #9-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 14 13:19:59 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
➜ ~ sudo lspci -v | grep i915
Kernel driver in use: i915
Kernel modules: i915, xe
➜ ~ sudo lshw | grep i915
configuration: depth=32 driver=i915 latency=0 mode=1920x1080 resolution=1920,1080 visual=truecolor xres=1920 yres=1080
➜ ~ sudo dmesg | grep i915
[ 13.326033] i915 0000:00:02.0: [drm] Found ALDERLAKE_P/ADL-N (device ID 46d1) display version 13.00 stepping D0
[ 13.326927] i915 0000:00:02.0: [drm] VT-d active for gfx access
[ 13.370261] i915 0000:00:02.0: vgaarb: deactivate vga console
[ 13.371357] i915 0000:00:02.0: [drm] Using Transparent Hugepages
[ 13.371930] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 13.374690] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
[ 13.587503] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/tgl_guc_70.bin version 70.29.2
[ 13.587515] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
[ 13.592056] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
[ 13.592757] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[ 13.592762] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
[ 13.593204] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
[ 13.594830] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops [i915])
[ 13.595027] i915 0000:00:02.0: [drm] Protected Xe Path (PXP) protected content support initialized
[ 13.595034] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
[ 13.630189] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on minor 1
[ 13.706559] fbcon: i915drmfb (fb0) is primary device
[ 13.784629] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
[ 13.796441] sof-audio-pci-intel-tgl 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])

看上去万事具备了,不需要额外安装或者设置什么。根据官方文档add-apt-repository -r ppa:team-xbmc/ppa却遇到问题,提示“The repository ‘https://ppa.launchpadcontent.net/team-xbmc/ppa/ubuntu oracular Release’ does not have a Release file”,手动修改/etc/apt/sources.list.d/team-xbmc-ubuntu-ppa-oracular.sources,把oracular 降级为 23.04 的lunar是可以获取到源了,但却少了kodi-gbm包,且不知道会不会有其他隐性问题。从新闻看到,kodi 团队从今年 5 月开始就停止维护 PPA 源了,索性参考文档手动编译。另外根据 reddit 网友提供的信息,手动编译可以设置 HDR 直通(虽然家里的老电视只支持 SDR)。

同样的问题,安装前置依赖过程中无法添加 xbmc-nightly 源,只能手动安装,大概占掉 1G 的硬盘空间。配置之前还要安装 libdisplay-info:

cd ~ && wget https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz
tar xzf libdisplay-info-0.2.0.tar.gz && cd libdisplay-info-0.2.0
mkdir build && cd build
meson setup --prefix=/usr/local --buildtype=release
ninja
sudo ninja install
cd ~/kodi-build
cmake ../kodi -DCMAKE_INSTALL_PREFIX=/usr/local -DCORE_PLATFORM_NAME=gbm -DAPP_RENDER_SYSTEM=gles -DENABLE_VAAPI=ON

理所当然的报错了:

CMake Error at /usr/share/cmake-3.30/Modules/FindPackageHandleStandardArgs.cmake:233 (message):
Could NOT find PCRE (missing: PCRE_LIBRARY PCRE_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake-3.30/Modules/FindPackageHandleStandardArgs.cmake:603 (_FPHSA_FAILURE_MESSAGE)
cmake/modules/FindPCRE.cmake:126 (find_package_handle_standard_args)
cmake/scripts/common/Macros.cmake:403 (find_package)
cmake/scripts/common/Macros.cmake:417 (find_package_with_ver)
CMakeLists.txt:261 (core_require_dep)

-- Configuring incomplete, errors occurred!

搜索发现,最近的更新从 pcre 切换到了 pcre2,而之前安装的就是 libpcre2-dev,而 ubuntu apt 仓库里根本就没有 libpcre-dev。所以源码下载地址从release 切换到master。顺利通过配置,执行编译。

cmake --build . -- VERBOSE=1 -j$(getconf _NPROCESSORS_ONLN)

注意过程中会从网络下载依赖,编译期间最好挂上梯子。

耗时 30 分钟,成功之后生成 kodi-gbm 可执行文件,使用 sudo ./kodi-gbm进行测试。注意,如果没有给当前用户赋予足够的权限,一定要用 root 执行,否则可能无法访问 GPU,强制软解。

后续问题

远程遥控 app

手机上安装 Yatse,连上 wifi。小主机插上鼠标,根据文档打开远程控制功能。成功登录之后就可以拔掉鼠标了。Pro 版增加了投屏、jellyfin 客户端、离线播放等功能,仅售 3.49 刀。

shellCrash 白名单

播放无声音

standalone 模式