个人家庭影音系统

基于OpenWrt以及闲置硬件打造一个简易版的家庭影音管理系统。

需求分析

笔者有收藏电影,MV,音频,照片的需求,在体量还比较小的时候,依赖文件命名分层来进行管理还是足够的。但是当量级达到TB后,简单的文件夹管理已经不够了,存在下面几个问题:

  • 文件夹层级过深,电影等打标元数据复杂。
  • 缺乏预览图片,类型打标搜索等能力,数据可视化困难。
  • 难以随时浏览,必须启动电脑来做数据入口。

为此,针对以上问题,笔者总结了几点需求:

  • 自动化打标,分类。
  • 数据可视化,提供预览能力。
  • 局域网内随时可访问(暂时没有广域网需求)。

经过调研,最简单的方案是比较成熟的群辉,但是最近市场硬盘太贵,决定还是自己DIY,依赖已有的能力去搭建一个局域网网络环境。

基本条件

  • 路由器:Linksys wrt32x,支持千兆网络,一个USB3.0接口,一个USB2.0接口
  • 硬盘:闲置的希捷酷鱼4T,并补充了一个绿联硬盘盒
  • 笔记本:闲置暗夜精灵3,大学用的游戏本,现在主要来做拓展功能
  • 网络:移动百兆宽带

路由器是之前双十一半价700入手,一直只是作为普通路由器使用,这次决定进行升级改造,基于OpenWrt加外挂硬盘,并配合docker来进行支持服务,能够拥有更高的可玩性。

环境搭建

固件编译

OpenWrt版本选择lean大的版本,维护良好,插件众多,并开源易定制化,本次采用本地编译的方式。

  1. Ubuntu20.04 vmware安装

  2. 配置qv2ray代理,配置好v2ray-core等依赖环境,确保能够稳定科学上网。

  3. 安装proxychains-ng来作为命令行代理,注意设置配置文件中不代理本地IP。

  4. 配置Golang最新版本,并设置GOPROXY代理,某些插件可能依赖go库(很奇怪proxychains没有代理到go mod,只能单独配置下GOPROXY代理)

  5. https://github.com/coolsnowwolf/lede 按介绍进行编译

    1
    2
    3
    4
    5
    6
    git 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

  6. 根据https://ssr.tools/1366选择相应的配置,笔者的是wrt32x。

    1
    2
    3
    Target System : Marvell EBU Armada
    Subtarget : Marvell Armada 37x/38x/XP
    Target Profile : Linksys WRT32x
  7. 第一次编译时不选择多余的插件,确保主模块能够顺利编译,首次编译可能需要2到3个小时。

    1
    2
    proxychains4 make -j8 download V=s 使用代理下载依赖库
    make -j1 V=s 第一次使用单线程编译方便定位出错

    如果成功编译,输出的文件在bin/target中。

  8. 第二次重新编译

    1
    2
    rm -rf ./tmp && rm -rf .config 删除原本的配置
    make menuconfig

    以安装docker为例子选择所需的选项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Target 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
    5
    git pull
    ./scripts/feeds update -a && ./scripts/feeds install -a
    make defconfig
    make -j8 download
    make -j$(($(nproc) + 1)) V=s

路由器配置

对于linksys wrt32x是拥有双分区来保证刷不死特性,具体不在这里赘述,

  1. 将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 && reboot
  2. moxeterm ssh连接然后将img固件上传并升级

    1
    sysupgrade -n -v ***.img
  3. 重新连接WiFi,ssh连接后lsblk查看硬盘信息,假如之前硬盘没有分区,利用cfdisk将硬盘划分为三个区,cfdisk分三个区分别给

    • overlay(sda2:3G):作为openwrt的软件层,存储各类工具软件,需要进行扩容。
    • docker(sda3:30G):存储docker的根目录。
    • 剩余容量存储挂载(sda4):作为影音存储。

    然后Write进去并重启路由器。

  4. 格式化硬盘为ext4格式

    1
    2
    3
    mkfs.ext4 /dev/sda2
    mkfs.ext4 /dev/sda3
    mkfs.ext4 /dev/sda4
  5. 挂载刚刚的三个分区

    1
    2
    3
    mount /dev/sda2 /mnt/sda2
    mount /dev/sda3 /mnt/sda3
    mount /dev/sda4 /mnt/sda4
  6. 备份overlay的配置,否则之后重启路由器后会丢失配置

    1
    cp -r /overlay/* /mnt/sda2

    如果有upper和work说明正确

  7. 启用挂载点,在web界面挂载点中挂载overlay的sda2和docker的sda3

  8. 重启路由器,看系统-软件包是否扩容成功

  9. /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"
    }
  10. 使用/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

  11. 使用Jellyfin镜像作为影音管理系统,Jellyfin的使用不再赘述

    1
    2
    3
    docker 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:latest
  12. ip:8096就可以访问到Jellyfin,然后就可以进行常规的配置了

  13. 网络共享中可以将sda4分享出去,注意权限0777,修改invaliduser,并设置samba密码

网络唤醒

  • 闲置笔记本惠普暗夜精灵3,两块移动硬盘
  • 将笔记本作为主机合盖使用,节约空间

所以基于以上条件使用wake on lan技术作为网络唤醒

  1. 将BIOS系统升级到最新版本,操作参考惠普官网。
  2. F10进入BIOS开启网络唤醒的选项。
  3. 进入win10的设备管理器,修改有线网卡驱动的选项,开启网络唤醒选项,确保魔术封包支持开启。
  4. win10下载wake on lan软件,用于测试。
  5. 安卓端下载极致工具箱,配置mac地址,电脑坐在网络段,端口默认9。
  6. 安卓端发送测试包,wake on lan打开封包监控管理工具接受魔术封包,如果能够接受到,基本说明成功。
  7. 网线连接路由器Lan口和电脑网口,关机后后手机端发送网络唤醒请求,理论上可以唤醒成功。

参考资料