基于OpenWrt以及闲置硬件打造一个简易版的家庭影音管理系统。
需求分析
笔者有收藏电影,MV,音频,照片的需求,在体量还比较小的时候,依赖文件命名分层来进行管理还是足够的。但是当量级达到TB后,简单的文件夹管理已经不够了,存在下面几个问题:
- 文件夹层级过深,电影等打标元数据复杂。
- 缺乏预览图片,类型打标搜索等能力,数据可视化困难。
- 难以随时浏览,必须启动电脑来做数据入口。
为此,针对以上问题,笔者总结了几点需求:
- 自动化打标,分类。
- 数据可视化,提供预览能力。
- 局域网内随时可访问(暂时没有广域网需求)。
经过调研,最简单的方案是比较成熟的群辉,但是最近市场硬盘太贵,决定还是自己DIY,依赖已有的能力去搭建一个局域网网络环境。
基本条件
- 路由器:Linksys wrt32x,支持千兆网络,一个USB3.0接口,一个USB2.0接口
- 硬盘:闲置的希捷酷鱼4T,并补充了一个绿联硬盘盒
- 笔记本:闲置暗夜精灵3,大学用的游戏本,现在主要来做拓展功能
- 网络:移动百兆宽带
路由器是之前双十一半价700入手,一直只是作为普通路由器使用,这次决定进行升级改造,基于OpenWrt加外挂硬盘,并配合docker来进行支持服务,能够拥有更高的可玩性。
环境搭建
固件编译
OpenWrt版本选择lean大的版本,维护良好,插件众多,并开源易定制化,本次采用本地编译的方式。
Ubuntu20.04 vmware安装
配置qv2ray代理,配置好v2ray-core等依赖环境,确保能够稳定科学上网。
安装proxychains-ng来作为命令行代理,注意设置配置文件中不代理本地IP。
配置Golang最新版本,并设置GOPROXY代理,某些插件可能依赖go库(很奇怪proxychains没有代理到go mod,只能单独配置下GOPROXY代理)
https://github.com/coolsnowwolf/lede 按介绍进行编译
1
2
3
4
5
6git clone https://github.com/coolsnowwolf/lede.git
sudo apt-get update
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync realpath
cd lede
./scripts/feeds update -a && ./scripts/feeds install -a
make menuconfig根据https://ssr.tools/1366选择相应的配置,笔者的是wrt32x。
1
2
3Target System : Marvell EBU Armada
Subtarget : Marvell Armada 37x/38x/XP
Target Profile : Linksys WRT32x第一次编译时不选择多余的插件,确保主模块能够顺利编译,首次编译可能需要2到3个小时。
1
2proxychains4 make -j8 download V=s 使用代理下载依赖库
make -j1 V=s 第一次使用单线程编译方便定位出错如果成功编译,输出的文件在bin/target中。
第二次重新编译
1
2rm -rf ./tmp && rm -rf .config 删除原本的配置
make menuconfig以安装docker为例子选择所需的选项
1
2
3
4
5
6
7
8
9
10
11Target System : Marvell EBU Armada
Subtarget : Marvell Armada 37x/38x/XP
Target Profile : Linksys WRT32x
Extra packages : automount autosamba ipv6helper
LuCi->Collections :
luci-lib-docker (luci与docker交互的api,dockerman需要使用的库)
LuCi->Applications :
luci-app-docker (lean编写的docker界面,勾选后将会自动勾选dockerd服务端)
Utilities :
docker (docker命令行工具)
dockerd (docker-ce,docker的服务端程序)第二次重新编译可以选择多线程编译,如果出错的话可以尝试用单线程编译定位错误。
1
make -j$(($(nproc) + 1)) V=s
如果需要拉取更新后编译
1
2
3
4
5git pull
./scripts/feeds update -a && ./scripts/feeds install -a
make defconfig
make -j8 download
make -j$(($(nproc) + 1)) V=s
路由器配置
对于linksys wrt32x是拥有双分区来保证刷不死特性,具体不在这里赘述,
将img固件从虚拟机中复制出来,如果不在原厂分区,切换到原厂固件分区
1
2
3/usr/sbin/fw_printenv -n boot_part 当前分区号
/usr/sbin/fw_setenv boot_part 1 && reboot 切换分区
/usr/sbin/fw_setenv boot_part 2 && rebootmoxeterm ssh连接然后将img固件上传并升级
1
sysupgrade -n -v ***.img
重新连接WiFi,ssh连接后lsblk查看硬盘信息,假如之前硬盘没有分区,利用cfdisk将硬盘划分为三个区,cfdisk分三个区分别给
- overlay(sda2:3G):作为openwrt的软件层,存储各类工具软件,需要进行扩容。
- docker(sda3:30G):存储docker的根目录。
- 剩余容量存储挂载(sda4):作为影音存储。
然后Write进去并重启路由器。
格式化硬盘为ext4格式
1
2
3mkfs.ext4 /dev/sda2
mkfs.ext4 /dev/sda3
mkfs.ext4 /dev/sda4挂载刚刚的三个分区
1
2
3mount /dev/sda2 /mnt/sda2
mount /dev/sda3 /mnt/sda3
mount /dev/sda4 /mnt/sda4备份overlay的配置,否则之后重启路由器后会丢失配置
1
cp -r /overlay/* /mnt/sda2
如果有upper和work说明正确
启用挂载点,在web界面挂载点中挂载overlay的sda2和docker的sda3
重启路由器,看系统-软件包是否扩容成功
/etc/docker/daemon.json更换docker国内源,在面板启动项中重启dockerd,或者/etc/init.d/dockerd restart,重启,docker info查看是否成功
1
2
3
4
5
6
7
8
9{
"registry-mirrors": [
"https://b2tx75ys.mirror.aliyuncs.com",
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
],
"data-root": "/opt/",
"log-level": "warn"
}使用/etc/docker-web启用portainer docker管理界面,其实就是命令,ip:9999就是portainer管理界面
1
docker run -d --restart=always --name="portainer" -p 9999:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
使用Jellyfin镜像作为影音管理系统,Jellyfin的使用不再赘述
1
2
3docker pull jellyfin/jellyfin:latest
mkdir -p /dev/sda4/jellyfin/{config,cache,media}
docker run -d --restart=always --name="myJellyfin" -p 8096:8096 -v /mnt/sda4/jellyfin/config:/config -v /mnt/sda4/jellyfin/cache:/cache -v /mnt/sda4/jellyfin/media/:/media jellyfin/jellyfin:latestip:8096就可以访问到Jellyfin,然后就可以进行常规的配置了
网络共享中可以将sda4分享出去,注意权限0777,修改invaliduser,并设置samba密码
网络唤醒
- 闲置笔记本惠普暗夜精灵3,两块移动硬盘
- 将笔记本作为主机合盖使用,节约空间
所以基于以上条件使用wake on lan技术作为网络唤醒
- 将BIOS系统升级到最新版本,操作参考惠普官网。
- F10进入BIOS开启网络唤醒的选项。
- 进入win10的设备管理器,修改有线网卡驱动的选项,开启网络唤醒选项,确保魔术封包支持开启。
- win10下载wake on lan软件,用于测试。
- 安卓端下载极致工具箱,配置mac地址,电脑坐在网络段,端口默认9。
- 安卓端发送测试包,wake on lan打开封包监控管理工具接受魔术封包,如果能够接受到,基本说明成功。
- 网线连接路由器Lan口和电脑网口,关机后后手机端发送网络唤醒请求,理论上可以唤醒成功。