1. 为什么偏偏是魔百盒M401A
1.1 从吃灰盒子到家庭服务器
家里有运营商宽带的朋友,大概率都见过这种场景:装宽带时送了一个电视盒子,用了一两年之后,运营商又打电话说可以免费升级,于是旧盒子就被拔下来扔进抽屉,再也没拿出来过。魔百盒M401A就是这类设备里非常典型的一款——晶晨S905L3A/S905L3A-B主控,2GB内存,8GB或16GB eMMC存储,带千兆网口(部分批次是百兆,这个后面会专门讲怎么分辨),支持双频WiFi和蓝牙。这个配置放在电视盒子领域属于入门偏上,但放在“常年通电、低功耗、跑轻量服务”的场景里,它其实相当能打。
我手头这台M401A是2021年前后办的宽带套餐里配的,型号印在底部标签上,S905L3A-B,2G+8G版本。闲置了两年多,直到我开始认真折腾智能家居,才发现这东西的价值:功耗低(实测待机2W出头,满载不超过5W)、被动散热无风扇(放卧室也不吵)、原生带网口(比WiFi稳定太多)、价格几乎为零(二手市场也就三四十块)。用它来跑Home Assistant,比买树莓派4B(现在价格依然不便宜)或者N100小主机(动辄六七百)划算得多。
1.2 为什么选Armbian而不是安卓
M401A出厂是安卓系统,理论上也能装安卓版的Home Assistant,但我不推荐。原因有三点:第一,安卓系统后台进程多,内存占用高,2GB内存跑完系统本身就没剩多少了;第二,安卓的电源管理策略是为“遥控器开关机”设计的,长时间运行容易因为内存回收把HA进程杀掉;第三,Armbian是完整的Debian/Ubuntu环境,Docker、Python、各种命令行工具都能直接用,Home Assistant Supervised的官方安装脚本就是为Debian系设计的,在Armbian上跑最顺。
Armbian对S905L3A系列的支持已经比较成熟了,社区里有专门针对M401A的dtb文件,网口、WiFi、蓝牙、USB都能正常驱动。刷上Armbian之后,这台盒子就变成了一台完整的Linux小主机,你想跑什么就跑什么。
1.3 Home Assistant Supervised到底值不值得装
Home Assistant有四种安装方式:OS、Supervised、Container、Core。很多人一上来就推荐HAOS,说“官方支持、一键刷机、最省心”。这话没错,但HAOS对硬件有硬性要求——至少2GB内存和32GB存储,而且它把整个系统都接管了,你没法在同一个系统里跑其他服务。M401A的8GB eMMC装HAOS会很紧张,系统更新几次就满了。
Supervised模式的好处在于:它跑在你自己装的Debian/Armbian系统上,HA核心、Supervisor、各种Add-on都能用,同时你还能在同一个系统里跑其他Docker容器(比如Mosquitto、Node-RED、zigbee2mqtt)。代价是安装过程比HAOS麻烦一些,需要手动装Docker、装os-agent、跑官方脚本,而且系统更新时要注意别把Supervised的环境搞坏。但我觉得这个代价是值得的,尤其是当你只有一台设备、想让它物尽其用的时候。
注意:Home Assistant官方对Supervised的支持态度是“支持但不推荐给新手”,因为Supervised依赖宿主系统的Docker和NetworkManager配置,系统层面出问题会直接影响HA。如果你完全不想碰命令行,HAOS是更稳妥的选择;如果你愿意花一个下午折腾,Supervised能给你更大的自由度。
2. 刷机前的准备工作
2.1 确认你的M401A具体型号和硬件版本
这一步非常关键,因为M401A有好几个批次,主控和网口配置不一样。我见过的情况包括:S905L3A(无-B后缀)、S905L3A-B、S905L3B,网口有千兆的也有百兆的,WiFi芯片有RTL8822CS也有其他型号。刷错固件轻则网口不工作,重则变砖。
确认方法很简单:把盒子拆开,看主板上的丝印。主控芯片上会印着“S905L3A”或“S905L3A-B”,网口变压器旁边如果有“G”字样通常是千兆,没有就是百兆。WiFi芯片在主板背面或者正面角落,常见的是RTL8822CS(支持双频+蓝牙)。记下这些信息,后面选dtb和固件的时候要用。
另外,M401A的eMMC容量有8G和16G两个版本,8G版本装完Armbian和Docker之后剩余空间会比较紧张,建议外接一个U盘或者移动硬盘来存Docker数据和HA的配置备份。
2.2 需要的工具和软件清单
我把整个流程需要的东西列一下,你可以提前准备好:
- USB转TTL串口线(CH340G或CP2102芯片的都可以,十几块钱):用于查看启动日志和进入U-Boot,刷机过程中如果出问题,串口是唯一的救命稻草。
- 双公头USB线:用于线刷救砖,平时不一定用得上,但建议备一根。
- 8GB以上U盘:用于制作Armbian启动盘,建议用USB 2.0的,3.0的U盘在部分盒子上识别有问题。
- 网线:连接盒子和路由器,刷机后通过SSH访问。
- 电脑:Windows或Linux都行,Windows下用balenaEtcher写盘,Linux下用dd命令。
- 晶晨刷机工具(Amlogic USB Burning Tool):只在需要线刷救砖时使用,版本建议用2.2.0或2.1.6。
- Armbian镜像:推荐使用社区维护的
armbianfors905l3a分支,具体下载地址在Armbian论坛的“Amlogic”板块里找,搜“M401A”或“S905L3A”就能找到对应的镜像和dtb。 - dtb文件:M401A对应的dtb通常是
meson-g12a-s905l3a-m401a.dtb或类似命名,具体以你下载的镜像包里附带的为准。
2.3 制作Armbian启动U盘
下载好Armbian镜像(通常是.img.xz格式)之后,用balenaEtcher写入U盘。写完之后,U盘会被分成两个分区:一个是FAT32的boot分区,一个是ext4的rootfs分区。在Windows下你只能看到boot分区,这是正常的。
接下来要做两件事:第一,把下载好的dtb文件复制到boot分区的dtb目录下,覆盖或新增;第二,编辑boot分区根目录下的uEnv.txt或armbianEnv.txt(不同版本文件名不一样),把fdtfile指向你刚才放进去的dtb文件。比如:
fdtfile=amlogic/meson-g12a-s905l3a-m401a.dtb有些镜像版本会自动识别,但M401A不一定在自动识别列表里,手动指定最保险。
实操心得:如果你不确定dtb文件名,可以在boot分区的
dtb/amlogic目录下找找有没有包含“m401”或“s905l3a”的文件。如果没有,可以去Armbian论坛的对应帖子下载,或者从其他S905L3A设备的镜像里提取。
3. 从安卓到Armbian的完整刷机流程
3.1 进入U-Boot并设置从U盘启动
M401A默认从eMMC启动安卓,要让它从U盘启动Armbian,需要进入U-Boot命令行。方法有两种:一种是按住复位键(AV孔里面那个按钮)再通电,另一种是通过TTL串口在启动时按回车打断自动启动。
我推荐用TTL串口,因为你能看到完整的启动日志,出问题的时候知道卡在哪一步。接线方式:盒子主板上有三个焊盘,分别是GND、TX、RX,用杜邦线连接到USB转TTL模块的对应引脚(GND接GND,TX接RX,RX接TX)。然后在电脑上打开串口终端(Windows下用PuTTY或MobaXterm,Linux下用minicom或screen),波特率115200。
通电后,串口会输出大量启动日志,在出现“Hit any key to stop autoboot”的时候快速按回车,就能进入U-Boot命令行。然后输入:
setenv bootfromusb 1 usb start fatload usb 0:1 0x01000000 uImage bootm 0x01000000如果一切正常,系统会从U盘启动Armbian。第一次启动会比较慢,因为要初始化各种服务,耐心等两三分钟。
3.2 首次启动后的初始化配置
Armbian首次启动会要求你设置root密码、创建普通用户、选择时区和语言。这些按提示操作就行。有一点要注意:不要跳过创建普通用户这一步,Home Assistant Supervised的安装脚本要求有一个非root用户,并且该用户要有sudo权限。
启动完成后,用ip addr查看网口是否获取到了IP地址。如果网口没起来,大概率是dtb不对,需要换一个dtb再试。如果WiFi能用但网口不行,也可以先用WiFi顶着,但长期运行还是建议用网口。
确认网络正常后,先更新系统:
sudo apt update && sudo apt upgrade -y然后安装一些基础工具:
sudo apt install -y curl wget git vim htop net-tools3.3 把系统写入eMMC
U盘启动只是临时的,每次重启都要插着U盘太麻烦。Armbian提供了一个armbian-install脚本,可以把当前系统写入eMMC。运行:
sudo armbian-install脚本会问你几个问题:选择要安装的设备(选eMMC)、是否格式化、是否保留U盘启动等。按提示操作,写入过程大概需要五到十分钟。写完之后关机,拔掉U盘,再通电,系统就会从eMMC启动了。
注意:写入eMMC之前,建议先用
dd命令备份一下原安卓系统的boot分区,万一以后想刷回安卓还能用。备份命令:sudo dd if=/dev/mmcblk0boot0 of=~/boot0_backup.img bs=1M。不过说实话,刷了Armbian之后基本不会想回去了。
4. Home Assistant Supervised安装实操
4.1 安装Docker和必要依赖
Supervised模式依赖Docker和NetworkManager。Armbian默认可能没装NetworkManager,需要手动装:
sudo apt install -y network-manager sudo systemctl enable NetworkManager sudo systemctl start NetworkManager然后安装Docker。官方推荐用Docker的官方脚本安装,但国内网络环境可能不太顺畅,可以用阿里云的镜像源:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun装完之后,把当前用户加入docker组,这样不用sudo也能跑docker命令:
sudo usermod -aG docker $USER然后退出重新登录,或者执行newgrp docker让组权限生效。
4.2 安装os-agent
os-agent是Home Assistant Supervisor用来和宿主系统通信的组件,必须安装。去Home Assistant的GitHub releases页面下载对应架构的os-agent包。M401A是aarch64架构,下载os-agent_linux_aarch64.deb:
wget https://github.com/home-assistant/os-agent/releases/download/1.6.0/os-agent_1.6.0_linux_aarch64.deb sudo dpkg -i os-agent_1.6.0_linux_aarch64.deb安装完成后,验证一下:
gdbus introspect --system --dest io.hass.os --object-path /io/hass/os如果能看到一堆接口信息,说明os-agent正常工作。
4.3 运行官方安装脚本
Home Assistant提供了一个安装脚本,会自动检测系统环境、安装Supervisor、拉取HA核心镜像。脚本地址在GitHub上,直接运行:
wget https://github.com/home-assistant/supervised-installer/releases/latest/download/homeassistant-supervised.deb sudo dpkg -i homeassistant-supervised.deb安装过程中会问你设备类型,选qemuarm-64(因为M401A是aarch64架构)。脚本会自动拉取Docker镜像,这个过程取决于网络速度,可能需要十几分钟到半小时。
安装完成后,Supervisor会自动启动。你可以用以下命令查看状态:
sudo systemctl status hassio-supervisor如果显示active (running),就说明安装成功了。然后在浏览器里访问http://盒子的IP:8123,就能看到Home Assistant的初始化界面。
4.4 首次配置和基础设置
第一次访问HA,会要求你创建管理员账号、设置家庭名称和位置。这些按提示操作就行。进入HA之后,建议先做几件事:
第一,在“设置 > 系统 > 存储”里检查一下可用空间。8G eMMC装完Supervised之后可能只剩2-3G,如果空间紧张,建议把Docker的数据目录迁移到外接U盘或移动硬盘。
第二,在“设置 > 加载项”里安装常用的Add-on,比如Mosquitto broker(MQTT)、File editor(文件编辑)、Terminal & SSH(终端)。这些Add-on在Supervised模式下都能正常使用。
第三,配置自动备份。HA的备份功能可以把配置、Add-on数据、数据库打包成一个tar文件,建议定期备份到外接存储或网络位置。
实操心得:Supervised模式下,HA的配置目录在
/usr/share/hassio/homeassistant,Docker的数据在/usr/share/hassio下。如果你想迁移Docker数据目录,可以修改/etc/docker/daemon.json,把>sudo homeassistant-supervised-installer --check根据输出提示补齐缺失的依赖。另外,Armbian的某些版本可能被脚本识别为“不支持的系统”,这时候可以修改脚本里的检测逻辑,或者手动设置
/etc/os-release里的VERSION_CODENAME为bookworm或bullseye。5.3 内存不足导致HA频繁重启
2GB内存跑Supervised确实有点紧张,尤其是你装了几个Add-on之后。我实测下来,HA核心+Supervisor+Mosquitto+zigbee2mqtt,内存占用大概在1.2-1.5G之间,如果再加Node-RED或者ESPHome,就容易触发OOM(内存不足)导致进程被杀。
解决办法有几个:第一,关掉不用的Add-on;第二,在HA的配置里限制数据库记录条数(
recorder组件的purge_keep_days设为7天以内);第三,加一个swap分区。Armbian默认可能没有swap,可以手动创建一个:sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabswap放在eMMC上会增加写入量,但总比OOM强。如果你外接了U盘或移动硬盘,把swap放在外接存储上更好。
5.4 系统更新后Supervised失效
Armbian的系统更新(
apt upgrade)有时会升级内核或Docker,导致Supervised的某些组件不兼容。我踩过的坑是:某次内核升级后,os-agent的gdbus接口变了,Supervisor启动时报“Unable to connect to os-agent”。解决办法是重新安装os-agent,或者回滚内核版本。为了避免这个问题,建议在
/etc/apt/apt.conf.d/下创建一个配置文件,把关键包hold住:Package: docker-ce linux-image-* linux-dtb-* Pin: version * Pin-Priority: -1这样
apt upgrade就不会动这些包了。需要升级的时候再手动解除hold。5.5 常见问题速查表
问题现象 可能原因 解决方法 网口不亮/无法获取IP dtb不对或MAC未设置 换dtb,U-Boot里手动设MAC 系统启动卡在U-Boot U盘识别失败 换USB 2.0 U盘,重新写盘 Supervised安装报错 依赖缺失或系统不识别 装NetworkManager、os-agent,改os-release HA频繁重启 内存不足 关Add-on、限制recorder、加swap 系统更新后HA挂了 内核/Docker版本冲突 重装os-agent,hold关键包 eMMC空间不足 8G版本容量小 迁移Docker数据到外接存储 WiFi不能用 驱动缺失 换dtb,或外接USB WiFi网卡 蓝牙不能用 固件缺失 安装 bluez-firmware和对应固件6. 长期运行的经验和优化建议
6.1 散热和供电
M401A的被动散热在冬天没问题,夏天室温超过30度的时候,主控温度会到60度以上。虽然S905L3A的耐温上限是85度,但长期高温会加速eMMC老化。我的做法是在盒子底部贴几个橡胶脚垫,把它垫高一点,增加空气流通。如果温度还是高,可以加一个小USB风扇对着吹,或者换一个金属外壳。
供电方面,M401A原装电源是5V/2A,带一个盒子绰绰有余。但如果你外接了移动硬盘,建议换5V/3A的电源,否则硬盘启动时可能因为电流不足而掉盘。
6.2 数据备份策略
HA的配置和数据库都在eMMC上,eMMC的寿命有限,而且一旦损坏数据很难恢复。我的备份策略是:每周自动备份到外接U盘,每月手动备份一份到NAS。HA自带的备份功能可以设置自动备份,在“设置 > 系统 > 备份”里配置。
另外,Docker的卷数据(比如zigbee2mqtt的数据库、Mosquitto的持久化消息)也要备份。这些数据在
/usr/share/hassio下,可以用rsync定期同步到外接存储。6.3 远程访问方案
HA默认只能在局域网访问,如果你想在外面也能控制家里的设备,有几种方案。最简单的是用HA Cloud(Nabu Casa),每月几美元,配置最简单。如果不想花钱,可以用DuckDNS+Let's Encrypt做HTTPS反向代理,或者用ZeroTier/Tailscale组建虚拟局域网。这几种方案各有优劣,DuckDNS需要公网IP,ZeroTier/Tailscale不需要但需要额外装客户端。
注意:无论用哪种远程访问方案,都建议开启HA的双因素认证(2FA),并且不要把HA的8123端口直接暴露在公网上。我见过太多因为端口暴露被扫到、然后被暴力破解的案例。
6.4 后续扩展方向
M401A跑HA只是起点,这台小盒子还能做很多事。比如:装AdGuard Home做全网广告过滤;装Nginx做反向代理;装Node-RED做复杂的自动化流程;装ESPHome编译固件;甚至装一个轻量级的NAS(比如OpenMediaVault)做文件共享。只要内存和存储够用,它就是一个全能的小型家庭服务器。
我目前的配置是:HA Supervised + Mosquitto + zigbee2mqtt + Node-RED + AdGuard Home,内存占用稳定在1.6G左右,加了2G swap之后没有出现过OOM。eMMC只用来跑系统,Docker数据和HA配置都放在外接的64G U盘上,读写速度虽然不如eMMC,但胜在容量大、可更换。
最后分享一个小技巧:如果你觉得M401A的8G eMMC实在不够用,可以把整个系统迁移到外接SSD上。方法是用
armbian-install把系统写到SSD,然后在U-Boot里设置从USB启动。SSD的读写速度和寿命都比eMMC好得多,而且容量随便选。我试过用一块128G的SATA SSD加USB转接盒,系统跑起来比eMMC还流畅。