个人家庭影音系统2.0

基于软路由打造的新一版家庭网络拓扑图

需求分析

接上文《个人家庭影音系统》,在测试运行一段时间后遇上一些问题:

  1. wrt32x 路由器刷自编译的 openwrt 不够稳定,有时候需要重启路由器才能连接网络。
  2. 直接路由器裸接硬盘盒的管理方式稍显粗糙。
  3. 最重要的是路由器的天线给猫撞断了。

本来笔者考虑的是否买一个路由器重新刷 openwrt,例如红米 AX6000。但是考虑到后续家庭的网络拓展以及自己动手的乐趣,最终决定上手软路由,基于软路由来打造整个家庭的网络拓扑。

硬件准备

通过在恩山论坛,v2ex,知乎等平台研究了几天,大致理清了整个软路由硬件的体系。购买软路由最为主要的就是挑选 CPU 型号,其中 CPU 又分为 x86 和 arm 架构,x86 架构的软路由更加通用并且可拓展性可玩性更好,arm 架构的 CPU 会更便宜,笔者根据自身需求选择 x86 架构的 CPU。目前市面上主流的 x86 软路由 CPU 型号为 J4125,N5105,以及比较新的 N100 等。对于笔者,由于选择的电信宽带暂时还是 300M 的,并且也并不准备在软路由上运行 Windows 虚拟机等过于复杂的操作,所以选择了 J4125 作为入门软路由的第一站。

EEE690B2-CC22-4AD2-AD7F-323B6802EE90

倍控这款 J4125 最主要的是有 4 个 2.5G 的网口,并配有 2 个 3.0 的 USB 口,这也是后面最为主要使用的。裸的 J4125 软路由需要自己搭配内存条以及固态硬盘,目前的内存和固态硬盘都十分便宜,这里在京东上选择了内存条为光威 3200 DDR4 8G * 2,其实这款最高内存频率只支持到 2666MHz,但是由于 J4125 比较吃内存颗粒,不是每个内存条都能点亮所以,最后 3200 点亮后不想再麻烦更换了。

59BC446E-506F-404D-A924-037ED607E718_1_102_o

固态硬盘的话,这款支持 mSATA 和 2.5 寸的 SATA 固态同时安装,这里随便购买了金百达的 mSATA 240GB 固态作为软路由的系统盘,因为无论是目前临时使用硬盘盒还是之后添加 NAS,笔者都认为路由处理,数据存储等各种服务最好还是隔离,毕竟 ALL IN ONE 等于 ALL IN BOOM。

7A2038F3-AE4B-4DC9-B105-ED8305620AAD_1_105_c

拆机将内存和硬盘安装上,效果图大致如下:

IMG_0020

然后软路由如果想要支持 WiFi 连接需要一个信号发射器,那么之前使用的路由器用来当作 AP 再好不过了,笔者使用的是经典的红米 AC2100。整体的大致物理网络连接图如下:

physics_network

软件安装

技术选型

对于软路由的有多种技术选型,例如简单的有直接物理机安装 OpenWrt,iKuai 等软路由操作系统、物理机安装 ikuai 虚拟机安装 OpenWrt、物理机安装虚拟机,虚拟机中运行操作系统等等部署方式。经过简单的调研这边考虑到可玩性、稳定性、可移植等因素,最终选择了虚拟机安装操作系统,其中常见的虚拟机 ESXi、PVE、unRaid:

  • ESXi:是VMWare vSphere Hypervisor套件之下重要组件。前身是ESX,依赖Linux源码,后来抛弃Linux源码做成了ESXi。整个产品商用气息浓重,界面清晰易用,但硬件兼容性较差(主要面向服务器),没什么扩展性(毕竟不是linux)。
  • PVE:全称Proxmox Virtual Environment,是基于Debian的Linux系统,虚拟机内核为KVM。硬件兼容性优秀。界面功能不强,很多操作要靠命令行,但扩展能力几乎是无限的。
  • unRaid:其实是个NAS系统,是基于Slackware的Linux系统,虚拟机内核也是KVM。磁盘阵列管理非常有特色,灵活性很高。同时还有很不错的插件、Docker和虚拟机支持。

具体的对比可参考这篇文章:ESXi、PVE、unRaid对比,笔者身为程序员肯定是选择可拓展性,可玩性更好的 PVE。

系统安装

之后就是 PVE 以及软路由系统的安装配置,具体参考这篇文章不再赘述:保姆级J4125下安装pve/爱快/op 或者教程视频参考:YouTube 视频

安装之后整个的网络配置,子网网段:192.168.31.xxx/256

  • PVE 虚拟机:192.168.31.2:8006
  • ikuai 主路由:192.168.31.3
  • OpenWrt 旁路由:192.168.31.5

其中 ikuai 通过 DHCP 自动从天翼网关获取 IP,这里其实也可以用宽带账号 + 密码 PPPoE 拨号上网,这里暂时不想折腾要密码。

image-20230706002040310

安装好的 OpenWrt 设置 Lan 口,将网关指向 ikuai 主路由:

image-20230706002527757

ikuai 主路由负责家庭的正常上网,OpenWrt 负责科学上网等各种特殊操作折腾而不会影响到主路由的正常使用,那么设备想要科学上网如何选择究竟走哪个网关,有一种解法是主路由和旁路由网关互指,就不需要改设置网关,但是这个操作很不优雅,并且旁路由问题可能会影响到主路由,这是不想要的。所以目前暂时还是通过设备手动指定网关,或者在 ikuai 的 DHCP 静态分配中指定网关。例如笔者的 Windows 系统是网线连接路由器,静态绑定 IP 后可以通过内网 WiFi 远程唤醒 WakeOnLan,这里就可以指定 Windows 网关到 OpenWrt 的地址 192.168.31.5。Windows 就会走 OpenWrt 的科学代理,再通过 ikuai 主路由连接到互联网了。

截屏2023-07-06 00.32.07

至此整个家里的各种设备就应该可以正常联网了。

服务拓展

接下来就是各种服务例如 Jellyfin 应该如何运行呢,同样有各种技术选型,对于笔者来说各种服务肯定优先运行在 docker 中,那么问题就是 docker 在 PVE 中如何安装呢,通过搜索资料大致集中方式如下:

  1. 直接安装在 PVE 上
  2. 安装在 ikuai,OpenWrt 等路由系统的 Docker 中
  3. 安装在 lxc 上,模版选择 Ubuntu,Debian 等系统模版
  4. 安装在虚拟机上,用 Ubuntu,Debian 等系统镜像

每个方案来大致讲解下:

对于方案一,直接安装在 PVE 虚拟机底座系统上就污染基础环境,十分不推荐。
对于方案二,将服务安装在路由系统上十分不优雅,路由系统故障可能导致其他服务不可用,所以也会有单点故障的问题,不可选。
对于方案三,LXC 的大致原理是利用 namespace, cgroup 等技术,轻量级的虚拟化技术。
对于方案四,虚拟机中安装更加隔离,安全性更好,但是消耗的资源相对较多一些,同样复杂一些,这是 PVE 官方推荐安装 docker 的方式。

综合考虑方案三,四都是可以的,安全性和资源消耗都暂时不是考虑的重点,所以这里笔者选择了教程比较多的使用 LXC 安装 docker 并部署 Jellyfin 的方式,具体步骤参考这个视频:免费开源影音服务Jellyfin部署,PVE下LXC套娃安装Debian Docker,核显硬解转码以N5105为例低功耗intel CPU核显通用

Jellyfin 服务跑在 Ubuntu22 的 LXC 容器安装的 docker 中,使用 portainer 来管理 Docker 并安装 N 大的中国定制版 Jellyfin。但是在实际使用的时候,因为 J4125 与 N5105 不同,所以有些步骤弄了半天没有开启例如低电压模式,暂时放弃测试局域网硬解效果还可以就不再折腾,毕竟音视频驱动不是笔者擅长的。

这里可以简单看下硬解的作用,主要是为了客户端无法支持的编码,或者外网带宽不够需要调整清晰度在服务端解码,如果此时使用软解那么整个软路由的 CPU 就会 100% 被挤爆,路由等其他服务也会受到影响,这也是为什么需要将 J4125 的集成显卡 600 分配直通给 LXC 容器,并透传给 docker 容器中。

image-20230706221651903

最终部署好 Ubuntu lxc 容器在 192.168.31.41:9443 端口

image-20230706223504020

并运行 Jellyfin 服务在 192.168.31.41:8096 上,通过 Chrome 浏览器播放 4k 的《星际穿越》,然后在 Ubuntu 中运行 intel_gpu_top 命令来观察显卡的运行情况,可以看到硬解已经成功开启。image-20230706231009589

然后可以看到网页上实时播放信息,视频的转码帧率 36 fps 还可以接受,到此为止显卡硬解直通 Jellyfin 的链路成功。

截屏2023-07-06 23.12.32

然后如果可以的话,其实局域网内直接客户端解码最好,例如 iOS 选择 infuse 作为客户端。

总结回顾

最后可以看到我的整个家庭网络架构图如下:

physics_network_2

整个网络拓扑图中基本已经能满足日常运行,更多可以改进的例如添加 NAS,交换机等再后续改造中进行升级。

参考资料