type
Post
status
Published
date
May 20, 2023
slug
Compose
summary
瞎折腾,同时给与自己一个更快乐的观影体验,和文件管理服务
tags
Linux
category
学习思考
icon
password

背景

公寓中,闲来无事,且手头闲置机子够多,可以整点花活
用之前NAS沉淀下来的知识点,搭建一下自己的服务集群
将文件服务和影音服务隔开进行管理
防止之前单点服务器导致的,功耗大且稳定性低

服务选择

对于集群管理,K8s过重,K3s轻,后续考虑支持,Rancher太重,还是portainer香
对于文件管理,NFS和WebDav是目前兼容性和实用性都较高的服务,考虑都支持,毕竟NFS在Windows上不好使,但是Linux下好使,同时对于新的iscsi协议保持观望
这篇期刊中有所体现
对于影音服务采用Jellyfin,支持硬解,为以后若是能穿透使用,提供便捷
同时将刮削服务通过TMM实现,Jellyfin的刮削服务并不好
播放端采用KODI,正好有一个高性能服务器,拿来跑KODI正好

服务分布

机器型号
OS
服务
红米路由器AX6S
openwrt
翻墙,网络管理
树莓派4B
Raspbian
Portainer(Docker管理)
HK1BOX
Armbian
qbittorrent & Transmission(下载),WebDev & NFS (文件共享),Nas-tools(NAS管理工具)
GK3V迷你电脑
LibreELEC
Jellyfin(影音服务),KODI(影音播放器),TMM(影音刮削)
总体服务分布取决于各个机器的性能
机器型号
特性
适用场景
树莓派4B
内存小,功耗低,稳定
分担一些简单服务
HK1BOX
内存大,功耗中等,稳定
用于底层数据服务,然后通过文件协议共享给各个机器
GK3V
内存大,功耗高,长期开机会宕机,性能强
用于高性能服务,以及随开随关
服务调用图
notion image

刷机流程

AX6S


原系统并不能支持特殊要求
需要给服务器刷入OpenWrt

HK1 BOX


HK1 BOX作为机顶盒,可覆写的系统并不多,只有armbian是最自由的,其他都是影音或者安卓
由于需要高可定制化,需要通过armbian实现,所以如果有别的系统,或者变砖了,需要先刷回原系统,再刷armbian

刷原系统

刷armbian

amlogic-s9xxx-armbian
ophubUpdated Feb 26, 2024
选bullseye的release,有多个版本 注意选择s905x3
通过balena刷机工具,刷入U盘后
插入U盘到2.0接口后,在启动时按住耳机孔内的一个复位开关,即可进入U盘界面
进入后初始化系统,再通过Armbian-install 命令,将系统刷入EMMC闪存,便可以不插入U盘启动
如果不联网在Armbian-install时会出现时间不一致,无需关心

参考视频

树莓派4B


对于树莓派4B,由树莓派自身提供的系统刷入工具即可
由于树莓派只有1G内存,收入命令行的Lite系统对于我就够用了
在刷入时,可以提前配置好网络信息,不然后续需要手动打开SSH等

GK3V


由于GK3V的AMD64平台,使得整体可以选择性高,兼顾到家中4K屏
对于Linux Mint,由于桌面系统的性能压力与GK3V的CPU和GPU不是很匹配,便未选择
但是由希望有一个专门负责影音的机器,支持原盘,4K,连通NAS,便为其刷入KODI的专业Linux,LibreELEC

BIOS刷入

由于盒子自身的BIOS是支持一些启动项设置的,也会USB检测刷机好像【也可能是我自己设置的】
插入U盘启动就可以识别到系统刷入程序
按部就班的用引导程序刷进去就完事了
 
 

环境搭建

AX6S


启动后,由于千兆路由器的一些缓存问题,需要在 系统-定时重启 打开定时重启
然后配置openclash,设置下白名单通过策略
之后在 网络模块中
打开无线
配置DHCP/DNS 在其中可以固定好静态IP
本着网络管理方面 稳定就是完美的策略,看不懂的就不动
服务模块中对于能看懂的服务进行启动
如果有自己拉网线配置IPV6的,可以打开全锥型NAT,有效降低打洞难度,提升NAT网络后的连通性

树莓派4B


树莓派如果一开始没有配置好SSH等
进入系统后,接个显示器,打开SSH,SSH-root访问和root密码配置,就可以开始配置了
装入Docker通过菜鸟教程的Docker安装中的debian系即可一键安装
原先此处想安装Rancher,但是Rancher对于树莓派的架构没有能用的Docker,遂放弃
同时Rancher对于性能要求高,在1G内存的树莓派4B上,相对紧张
于是选择Portainer,其轻量且美观的UI,更为符合家庭使用
在树莓派上安装Portainer,其他服务器上安装Portainer-agent即可通过Docker Standalone模式进行连接,即可管理其他集群上的docker

HK1BOX


下载服务

刷入Armbian后,其自身已经支持SSH远程连接,无需额外配置
通过Docker命令进行安装即可
如果之前已经有QB和TR的使用镜像,可以把他们的配置和信息都打包出来,然后覆盖Data文件夹
即可实现快速迁移,但是要保证容器内挂载的磁盘位置是相同的
QB Docker命令(nevinee版,适配了iyuu)
docker run -dit \ -v /data/qb:/data \ -v /mnt1:/mnt1 \ -v /mnt2:/mnt2 \ -v /data/tr/config/torrents/:/tr_bk \ -e PUID="1000" `# 输入id -u可查询,群晖必须改` \ -e PGID="100" `# 输入id -g可查询,群晖必须改` \ -e WEBUI_PORT="8090" `# WEBUI控制端口,可自定义` \ -e BT_PORT="34567" `# BT监听端口,可自定义` \ -e INSTALL_PYTHON='true' \ -e IYUU_TOKEN='IYUUxxxxxxxxxx' \ -p 8090:8090 `# 冒号左右一样,要和WEBUI_PORT一致,命令中的3个8080要改一起改` \ -p 34567:34567/tcp `# 冒号左右一样,要和BT_PORT一致,命令中的5个34567要改一起改` \ -p 34567:34567/udp `# 冒号左右一样,要和BT_PORT一致,命令中的5个34567要改一起改` \ -p 9000:8787 `# IYUUPlus的WebUI控制端口` \ --restart always \ --name qb \ --hostname qbittorrent \ nevinee/qbittorrent:4.3.9-iyuu
TR Docker命令(chisbreadbane,快速校验)
docker run -d \ --name=tr \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Asia/Shanghai \ -e USER=txuw \ -e PASS=xxxxxx \ -p 9091:9091 \ -p 51413:51413 \ -p 51413:51413/udp \ -v /data/tr/config:/config \ -v /data/tr/watch:/watch \ -v /mnt1:/mnt1 \ -v /mnt2:/mnt2 \ --restart unless-stopped \ chisbread/transmission:version-3.00-r13

NAS管理服务

之后便是Nas-tools
作为Nas助手,他的目的是想包揽很多活,但是我目前只用了他的目录同步功能
目录同步功能的来源是因为当你使用TR和QB,进行种子存储时,内部文件是不允许移动、修改的
但是如果需要搭配上TMM刮削器,去适配影音服务的海报墙,位置层级结构是要变化的,但是文件内容是不会变化的
此时需要使用硬链接技术,将TR和Qb服务的存储文件夹,做一个索引同步到另一个文件夹去,让刮削服务和影音服务去读取同步后的文件夹,改动里面的文件位置,并不会影响到TR和QB的种子保存情况。
为什么不用软连接呢?因为这个文件夹大概率会被挂载到Docker里,软链接Docker是无法识别的
Nas-tools docker命令
docker run -d \ --name nas-tools \ --hostname nas-tools \ -p 3000:3000 `# 默认的webui控制端口` \ -v /data/nas-tool/config:/config `# 冒号左边请修改为你想在主机上保存配置文件的路径` \ -v /mnt1:/mnt1 `# 媒体目录,多个目录需要分别映射进来` \ -v /mnt2:/mnt2 `# 媒体目录,多个目录需要分别映射进来` \ -e PUID=1000 `# 想切换为哪个用户来运行程序,该用户的uid,详见下方说明` \ -e PGID=1000 `# 想切换为哪个用户来运行程序,该用户的gid,详见下方说明` \ -e UMASK=022 `# 掩码权限,默认000,可以考虑设置为022` \ -e NASTOOL_AUTO_UPDATE=false `# 如需在启动容器时自动升级程程序请设置为true` \ nastool/nas-tools:latest

文件共享服务

对于Linu之间通过NFS进行文件共享
对于Windows通过WebDav进行文件共享

NFS

apt install nfs-kernel-server
即可安装nfs的server服务,他会集成好很多nfs的对应systemctl到系统中
之后进入/etc/exports中 编辑需要Share的文件夹
/mnt *(rw,async,no_root_squash,no_subtree_check) /mnt/mnt1 *(rw,async,no_root_squash,no_subtree_check) /mnt/mnt2 *(rw,async,no_root_squash,no_subtree_check)
[需要Share的文件夹] [允许的IP] (options)
其中 *代表的是所有IP都可以使用这个服务
对于options 其意义如下表格
rw
允许读写
async
异步读写,性能高
no_root_squash
权限同步,允许root
no_subtree
不检查父目录权限
同时此处挂载了/mnt的同时又挂载了/mnt/mnt1
是由于mnt1是通过USB挂载进来的,如果不加入这个子目录挂载,识别不到USB内的内容
💡
通过systemctl enable nfs-server无法实现开机自启动,甚是奇怪

WebDav

WebDav此处便于管理,通过docker实现
但是建议还是用正经的WebDav的Go包,或者python进行实现
因为WebDav在Docker中的传输性能并不优秀,会有限制
后续考虑通过Go配置
WebDav docker命令
docker run --name webdav \ --restart=unless-stopped \ -p 80:80 \ -v /mnt1:/media/mnt1 \ -v /mnt2:/media/mnt2 \ -e USERNAME=txuw \ -e PASSWORD=xxxxxx \ -e TZ=Asia/Shanghai \ -e UDI=1000 \ -e GID=1000 \ -d ugeek/webdav:arm
Docker中会自动向外发布media下的文件

开机启动配置

由于HK1 BOX在最新版的内核中引入了新的USB3管理框架
开机自启动无法挂载到USB3接口下的文件
如果对性能没有要求,可以插在USB2上
对于影音,还是得USB3
所以编写开机启动脚本,手动挂载,手动启动docker
由于docker需要root命令,server脚本需要以user=root启动
usb_mount 脚本
#!/bin/bash mount UUID=bdb9d073-fd6b-2648-87c4-655370c7d278 /mnt/mnt1 mount UUID=68031de8-5560-774b-ade9-e2786c2b6f20 /mnt/mnt2 docker start qb docker start tr docker start nas-tools systemctl start nfs-server
mount.server
[Unit] Description=Mount UUID-based Filesystems After=network.target [Service] ExecStart=/bin/bash -c "sudo /root/usb_mount.sh" User=root [Install] WantedBy=multi-user.target

GK3V


LibreELEC的优点

LibreELEC在Kodi和影音的支持上确实是完美的
对于一个我自己都不知道蓝牙是否能用的机器
其LibreELEC管理框架下自带的蓝牙居然是能检测到的,只需要在KODI界面中找到蓝牙插件安装即可
同时其对于有限、无线的支持,都是非常到位的
在作为影音盒子的体验上,确实是完美的
 

LibreELEC的缺点

LibreELEC的自定义体验上无疑是较为痛苦的
由于LibreELEC是独立的Linux发行版,其区别于常用的Ubuntu和CentOS
大多数的系统级文件,都是写死无法修改的,哪怕你是ROOT
所有文件需要安装和编写在/stroages 的文件夹下
同时对于文件安装,你也只能在KODI内部用ELEC提供的框架进行安装
他不支持常用的任一软件源
好在ELEC提供的框架内,支持了Docker
 

Jellyfin的配置

对于其他Jellyfin的docker,都不如国内自己搞得香
主要体现在对硬解的支持等
Jellyfin Docker命令 (nyanmisaka版 JellyFin中国程序员编译)
docker run -d \ --restart=always \ -p 8096:8096 \ --name Jellyfin \ -v /storage/data/Jellyfin/config:/config \ -v /storage/data/Jellyfin/cache:/cache \ -v /storage/mnt/mnt1:/mnt1 \ -v /storage/mnt/mnt2:/mnt2 \ nyanmisaka/jellyfin
Jellyfin的使用方法
 

TMM刮削器

连接HK1BOX的NFS协议,挂载到磁盘中,使用TMM影音刮削器,来刮削一些影片介绍等
TMM也可以通过Docker部署,同时注意TMM在V3免费,V4收费,使用docker部署时注意甄别
此处使用dzhuang 的Docker镜像,专用于国内,支持国内字体
docker run -d --name=tinymediamanager \ -v /data/tinymediamanager/config:/config \ -v /mnt1:/mnt1 \ -v /mnt2:/mnt2 \ -e GROUP_ID=1000 \ -e USER_ID=0 \ -e TZ=Asia/Hong_Kong \ -p 5800:5800 \ -p 5900:5900 \ dzhuang/tinymediamanager:latest
 

文件共享

在ELEC的WIKI中,提供了NFS等的挂载办法
需要尤为注意
Where=/storage/recordings 和你的.mount命名是挂钩的
systemctl enable storage-recordings.mount
不然识别不到
 
对于WebDav,只能让Kodi去支持
docker版本的WebDav性能非常拉胯,估计是我服务器端包了一层,Client端又一层,直接炸了
或者可以自己编译WebDav的程序包,相信我,非常麻烦

Feature

  • 将WebDav在HK1Box中本地支持,而不走Docker
  • 集群管理转为k3s
Screeps-工种工厂方案V1关于StringBuffer实现的思考