1. 为什么是E900V22C:这笔账算清楚再动手
电视盒子这东西,恐怕是智能家居时代最容易被忽视的闲置硬件。很多人换了新盒子之后,旧盒子就躺在抽屉里吃灰,觉得它跑不动、没系统、没生态,卖掉又不值几个钱。但我手里这台 E900V22C,后来被我刷成了 Armbian,再用 Docker 跑起了青龙面板,现在每天定时执行各种脚本,相当于一台 24 小时不关机的家庭自动化调度服务器。整个过程下来只花了几十块电费,比再买一台 NAS 或者云服务器划算得多。
先给不熟悉这台盒子的朋友一个大体画像。E900V22C 是国内运营商盒子比较常见的一个型号,不同批次配置略有差异,但整体方向一致:晶晨 Amlogic 平台的四核 CPU、2GB 内存、8GB eMMC 存储,带百兆有线网口,整体功耗非常低。这种底子用在安卓电视系统上,确实只是当个播放器;但换成 Linux 系统之后,它完全可以胜任轻量级容器服务的宿主。
| 项目 | 常见配置 | 对服务器的影响 |
|---|---|---|
| CPU | 四核 Arm 架构 | 跑轻量 Docker 容器问题不大 |
| 内存 | 2GB | 适合同时跑 3-5 个轻量服务 |
| 存储 | 8GB eMMC | 系统加 Docker 加青龙足够,别拿它存媒体 |
| 网口 | 百兆有线 | 传大文件会慢,做自动化任务完全够 |
| 功耗 | 3-5W 左右 | 24 小时开机基本可以忽略电费 |
很多人在搭建家庭服务器时陷入了“配置焦虑”,总觉得要用 x86 小主机、要用大内存、要搞万兆网口。但冷静想想,如果只是跑青龙面板、定时脚本、AdGuard Home、Node-RED 这类轻量服务,一台 2GB 内存的电视盒子已经能扛住。真正需要大内存的场景,比如视频转码、虚拟机、大型数据库,本来就不适合放在这种盒子上,硬塞上去只会频繁 OOM。
从我的实际使用经验来看,E900V22C 更适合当“调度中枢”而不是“存储仓库”。它把定时任务自动化这件事做得非常好:24 小时在线、功耗低、重启成本低、坏了也不心疼。相比之下,云服务器虽然稳定,但每年几百块的续费,放在“跑个定时脚本”这个需求上实在浪费。这也是我强烈建议先把盒子刷成 Armbian 的原因——安卓系统放在后台跑脚本又别扭又不可靠,只有换成真正的 Linux 发行版,Docker 生态才能稳稳落地。
2. 刷 Armbian 前必须搞明白的三件事:版本、存储介质、引导方式
2.1 Armbian 版本怎么选
如果你去 Armbian 官方或者第三方固件发布页看,会发现镜像文件非常多,命名规则也五花八门。对于 E900V22C 这类晶晨盒子,优先找 Amlogic 平台对应的 Armbian 镜像,一般会写明支持 s905x3 或者包含 S905L3A 系列 dtb。我手上这台用的是 server 版而不是 desktop 版,原因很简单:电视盒子不需要图形桌面,多一个桌面环境就多吃几百 MB 内存,还会抢 eMMC 空间,得不偿失。
选内核版本时,尽量挑 6.x LTS 这类稳定分支,太新的内核不一定对这盒子优化得好,太老的内核又可能缺少对 Docker 和容器特性的支持。如果固件发布页同时提供了多个 dtb 文件,优先找和 E900V22C 对应的型号。启动后如果发现网口不亮、显示异常或无线网卡识别不了,八成是 dtb 选错了,需要去/boot/uEnv.txt里改FDT=路径,换成驱动匹配的设备树文件。
2.2 U盘还是TF卡
E900V22C 不是所有批次都有 TF 卡槽,所以大多数人用的是 U 盘方案。我的建议是别用家里随便拿的旧 U 盘,也别用那种已经写了很多次、寿命不明的杂牌盘。Armbian 写入 U 盘后,如果只是用来做最开始的引导,那对 U 盘性能要求不高;但如果你打算长期用 U 盘跑系统,那 U 盘的写入稳定性和寿命就非常关键。
更推荐的方案是先把 Armbian 烧到 U 盘上,从 U 盘启动成功后再把系统安装到盒子自带 eMMC 里。这样做有几个好处:一是系统跑在 eMMC 上,读写速度比大多数 U 盘稳定;二是拔掉 U 盘后盒子内部更整洁,不会因为 U 盘松动导致系统异常断电;三是不会占用唯一的 USB 口,后面插其他设备更方便。
2.3 刷机前必须先做的事
在刷机之前,先做好两件准备。第一,确认盒子的主控型号和当前系统版本,最好在安卓系统设置里看一眼,或者拆开盒子看主板上丝印。不同批次的 E900V22C 可能使用不同主控,刷错镜像轻则无法启动,重则需要重新线刷。第二,如果原机系统还能正常开机,尽量把原厂固件备份一下。很多盒子的刷机教程都会提到“线刷全量备份”,虽然操作稍稍麻烦,但一旦后续玩坏了,还能刷回安卓看电视剧。
这里必须提醒一句:刷机有风险,任何操作都有可能让设备变砖。但电视盒子和其他贵重设备不一样,砖了也就几十块钱的事,心理压力没那么大。只要你不是在刷写 eMMC 的过程中突然拔电,通常都有救。
2.4 U盘引导的常见坑
晶晨盒子的外置引导逻辑比较特殊,不是插上 U 盘通电就会自动从 U 盘启动。常见触发方式有几种:一种是按住机身 AV 孔里的复位键再上电,一种是短接主板上的引导触点,还有一种是从安卓系统里通过 ADB 命令切换启动模式。不同省份、不同固件的盒子,触发方式可能不一样,这也是很多人第一次刷 Armbian 卡住最多的地方。
我实际遇到的情况是,写完 U 盘后插上电,屏幕一直停在安卓开机画面,完全没进 Armbian。后来换了一个 USB 口,再按住复位键上电,才正常进入引导。所以不要只试一次就怀疑镜像坏了,多换几个 USB 口、多试几次触发方式,成功率会高很多。进系统之后的第一件事,不是急着装 Docker,而是先把系统源、时区和网络调好,这些基础不打好,后面容器装得再漂亮也白搭。
3. Armbian 的安装与首次启动:外置引导、写入 eMMC、固定 IP
3.1 制作启动盘
制作 Armbian 启动盘和制作普通 Linux 安装盘差不多,直接用 balenaEtcher 或 Rufus 把镜像写入 U 盘即可。强烈注意,这个操作会清空 U 盘上的所有数据,如果 U 盘里还有重要文件,先拷出来。
写入完成后,不要急着拔 U 盘。Windows 可能会提示 U 盘无法识别或需要格式化,直接忽略。如果系统里有杀毒软件弹出“可疑引导区修改”的警告,也要先确认,别让安全软件把引导文件隔离了。把 U 盘插到盒子靠近电源口或网口的 USB 口上,按前面说的引导方式开机,看到类似 Arm Linux 的滚动日志,说明 Armbian 已经跑起来了。
3.2 首次登录与基础配置
Armbian 首次登录默认用户是 root,密码在旧版固件里通常是 1234,部分新版固件会要求在第一次启动时直接设置新密码。如果登录后系统提示必须修改密码,就按提示设一个强密码。这个密码非常重要,因为它同时是 SSH 登录密码,如果太弱,同一局域网里的其他人很容易用暴力枚举猜出来。
登录后的基础配置建议按这个顺序:
- 更新软件源和系统:
sudo apt update && sudo apt upgrade -y - 设置时区:
sudo timedatectl set-timezone Asia/Shanghai - 创建普通用户:日常操作别一直用 root,给后续 Docker 操作留一个普通账号更安全
- 启用 SSH:如果默认没开,用
sudo systemctl enable --now ssh
第一次做完这些操作后,如果网络没问题,系统会自动把 eMMC/U 盘的分区扩展到剩余空间。这个过程可能需要一点时间,再执行df -h看根分区容量是否变了。如果没变,可以重启一次。
3.3 从 U 盘系统写入 eMMC
确认系统稳定运行后,下一步就是把 Armbian 安装到盒子内置 eMMC。进入系统后查看/root目录,一般会有install-aml.sh或类似名称的安装脚本。执行前先看清楚脚本提示,它会让你选择安装到哪个磁盘,这时候一定要选 eMMC,而不是当前正在运行的 U 盘。
# 在 /root 目录下找安装脚本 ls /root # 如果脚本叫 install-aml.sh,执行: sudo /root/install-aml.sh脚本运行过程中会清空 eMMC 上的原有数据,如果你已经备份过原厂固件,这里可以放心继续。安装完成后,系统会提示关机还是重启,先把 U 盘拔掉,再重新上电。只要能正常进入 Armbian 命令行,说明 eMMC 里的系统已经接管了启动流程,之后就不用再依赖 U 盘了。
这里我不建议手动用dd把镜像写到 eMMC,因为盒子分区结构比较特殊,手动搞容易把引导分区写乱。用固件自带的安装脚本是最稳的方式,它知道该往哪里放 bootloader、哪里放 rootfs。
3.4 固定 IP,服务器最重要的长寿秘诀
电视盒子作为家庭服务器,如果 IP 每次都从路由器动态获取,下次重启很可能就换了一个地址,所有依赖这个 IP 的服务、脚本、SSH 配置都会跟着失效。所以装好系统第一件事,建议把有线网口设成固定 IP。
用 nmcli 操作最直接。先看一下网卡和连接名:
nmcli con show找到有线连接名,一般是“Wired connection 1”或类似名字,然后设置静态地址:
sudo nmcli con mod "Wired connection 1" ipv4.addresses 192.168.1.50/24 sudo nmcli con mod "Wired connection 1" ipv4.gateway 192.168.1.1 sudo nmcli con mod "Wired connection 1" ipv4.dns "223.5.5.5" sudo nmcli con mod "Wired connection 1" ipv4.method manual sudo nmcli con up "Wired connection 1"IP 地址不要乱填,先在路由器后台找一个没被占用的地址,最好和你的电脑、手机在同一个网段。设置完后再ip addr确认一下,如果地址生效,后续访问青龙面板时就可以始终用同一个 IP。
4. 把 Docker 装稳:镜像源、权限、资源配额一起配好
4.1 安装 Docker 的最省心方式
Armbian 本身的软件仓库里可能也有 Docker,但版本不一定新。为了减少后续问题,直接用 Docker 官方安装脚本是比较稳妥的选择。装完之后把当前用户加入 docker 组,可以不用每次加 sudo,操作起来舒服很多。
curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker $USER newgrp docker如果官方脚本因为网络不稳定没跑通,也不要硬刚,直接用 Armbian 仓库自带的 Docker 也可以:
sudo apt update sudo apt install -y docker.io docker-compose-v2 sudo systemctl enable --now docker无论用哪种方式,装完第一件事都是执行docker version和docker compose version,确认 Docker 和 Compose 插件都可用。如果提示docker compose命令不存在,说明装的是旧版独立 compose,可以用docker-compose替代,但更建议补齐插件版,兼容性更好。
4.2 给 Docker 配置镜像加速和日志上限
国内网络环境下,直接拉取 Docker Hub 镜像经常失败或慢到让人怀疑人生。解决方式不是去开代理,而是给 Docker 配置一个可用的镜像加速器。在/etc/docker/daemon.json里写入 registry-mirrors 即可。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<'EOF' { "registry-mirrors": [ "https://docker.m.daocloud.io" ], "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF sudo systemctl restart docker这个配置除了加速镜像下载,还干了另一件重要的事——限制容器日志体积。电视盒子的 eMMC 空间不大,如果不限制日志大小,青龙面板或某个容器疯狂输出日志,几天就能把 8GB 磁盘写满,导致系统卡死。配置完镜像源后,用docker info查看 Registry Mirrors 一栏,能看到地址就说明生效了。
4.3 内存和存储的规划思路
2GB 内存在跑 Docker 时并不充裕,所以要提前想好哪些容器值得跑。青龙面板是刚需,占用的内存大约在几百 MB 到 1GB 左右;如果再跑 Home Assistant、Node-RED、AdGuard Home,内存就会比较紧张。我建议先跑青龙,观察空闲内存:
free -h如果还剩 1GB 以上,再去考虑加其他容器。存储方面,青龙的镜像本身几百 MB,数据目录主要存脚本、日志和数据库文件,日常占用不会太大。但保险起见,给 Docker 做一次定期清理是很有必要的:
docker system df docker image prune -f docker system prune -fdocker system prune会清理已经停止的容器、未使用的网络和悬空镜像,执行时要注意不要删掉还在用的东西。这个命令我在电视盒子上会定期跑一次,因为 eMMC 空间太宝贵,一旦被垃圾镜像填满,系统行为会变得非常诡异。
5. 青龙面板的容器化部署:Compose 文件怎么写、目录怎么规划
5.1 为什么不用 docker run 一条命令搞定
青龙面板的部署方式非常成熟,很多教程直接给一条docker run命令,复制粘贴就能跑起来。但我更建议用 Docker Compose 管理,原因很简单:Compose 文件本身就是配置文档,容器要映射哪些端口、挂载哪些目录、设置哪些环境变量,一眼就能看明白。以后换设备、重装系统,一个文件就能把青龙容器原样恢复出来,不用回忆当初敲过哪条命令。
5.2 目录规划和 Compose 配置
我习惯把所有容器数据放在/home/用户/containers下面,每个容器一个独立目录,这样备份和迁移都非常清晰。
mkdir -p ~/containers/qinglong/data cd ~/containers/qinglong然后创建docker-compose.yml:
services: qinglong: image: whyour/qinglong:latest container_name: qinglong restart: unless-stopped ports: - "5700:5700" environment: - TZ=Asia/Shanghai volumes: - ./data:/ql/data这个文件里,image用的是青龙官方镜像;restart: unless-stopped保证盒子意外重启后容器能自动拉起;5700是青龙面板默认端口,左边可以改成其他端口,比如5701:5700,避免和别的服务冲突;./data:/ql/data是把容器里的数据目录挂载到宿主机,所有配置、脚本、日志都会落在我们创建的 data 目录里,备份时只需要打包这一个目录。
如果后续感觉青龙占用内存过高,可以给它加一个限制:
mem_limit: 1g cpus: 2注意,内存限制设置过低会导致容器被杀掉。建议先不加,跑一段时间观察docker stats qinglong再决定。
5.3 启动、验证日志、访问面板
写好 Compose 文件后,执行:
docker compose up -d第一次启动会自动到 Docker Hub 拉取镜像,如果之前镜像加速器配好了,这步会很顺利。启动完用docker ps看容器状态,再查看日志:
docker logs -f qinglong日志里出现服务启动成功的提示后,在浏览器打开http://盒子IP:5700。第一次访问会进入初始化页面,按提示创建管理员账号和密码。这里务必用强密码,因为这个面板一旦暴露在局域网里,有权限的人可以直接执行容器里的脚本和命令,弱口令等于把服务器大门敞开了。
5.4 保守初始化,别急着开一堆功能
青龙面板的功能菜单很多,新手容易一进去就乱点。我的建议是初始化阶段只做三件事:设好管理员密码、检查系统设置的时区是否为上海、看一眼通知设置里有没有可用的推送渠道。其他高级功能,比如环境变量、脚本管理、依赖管理,等后面真正用到时再配。
通知渠道值得花点时间配上,因为青龙最大的价值就是定时任务跑完后把结果推给你。没有通知,脚本跑成功还是失败,你都得自己打开面板查看,自动化体验会大打折扣。常见的通知方式有 Bark、Server酱、Telegram Bot 等,按自己的使用习惯选一个即可。填通知 key 时注意别泄露,毕竟这类 token 等同账号权限。
6. 依赖管理和定时任务:先跑通最小闭环,再决定要不要拉脚本
6.1 青龙面板的脚本和依赖到底是怎么回事
很多第一次用青龙的朋友,被“依赖管理”四个字吓住了。其实道理很简单:青龙面板本身只是定时任务调度器,它不提供脚本。脚本是你放进去的 JS 或 Python 程序,而脚本运行时需要用到的第三方库就叫依赖。
比如一个脚本里写了require('axios'),但容器里没有安装 axios,脚本一运行就会报模块找不到。所以用青龙面板,必须先搞清楚你的脚本需要哪些依赖,然后去面板的“依赖管理”里逐个安装。不要照着别人的教程把所有依赖全装一遍,那样既浪费内存,也可能因为版本冲突把环境搞乱。
6.2 Node 和 Python 依赖分别怎么装
在青龙面板左侧菜单找到“依赖管理”,新建依赖时需要选类型。Node 依赖就是 npm 包,Python 依赖就是 pip 包。常见的 Node 依赖包括crypto-js、axios、moment、dotenv、typescript、tslib、@types/node、png-js、jsdom等。Python 依赖则常见requests、pycryptodome、beautifulsoup4、urllib3等。
安装的时候可以一次批量添加多个依赖,青龙会自动调用对应包管理器安装。装完可以在依赖列表里看到安装状态,如果某个依赖一直失败,先检查网络和镜像配置,而不是反复重装。依赖安装失败很大概率是下载源不通,调整容器内 npm 或 pip 的源就能解决。
给小白的建议是:不要一开始就追求“全量依赖”,先把自己要跑的脚本放到面板里试跑一次,看日志缺什么装什么。这个过程看起来慢,实际上最省心,因为只有实际运行的依赖才是必要的。
6.3 用一分钟验证青龙定时任务链路
为了确认青龙容器环境是健康的,我通常会在“脚本管理”里新建一个最简单的脚本hello.js:
console.log("hello from qinglong");保存后,去“定时任务”页面新建任务,命令填node hello.js,定时规则填一个测试用的 cron,比如*/5 * * * *,意思是每五分钟跑一次。保存后先点“运行”,再点“日志”,如果状态显示成功,日志里输出hello from qinglong,就说明脚本管理、依赖环境、定时任务调度全链路都是通的。
这个最小闭环非常重要。很多人第一次用青龙,直接拉一个几百 KB 的公共脚本,跑出一堆报错,根本分不清是脚本本身的问题、依赖缺失问题还是定时任务配置问题。先用最小脚本验证基础链路,之后排查问题会轻松很多。
6.4 拉取公共脚本的尺度:能用,但要留个心眼
青龙面板之所以在家庭服务器圈子里流行,和“拉库”机制分不开。通过ql repo或ql raw命令,可以直接从代码仓库拉取脚本到面板里,并自动创建定时任务。这个机制非常适合批量管理脚本,但同时也带来了风险。
我个人的原则是:不明仓库不拉、过度索取权限的不拉、要求填账号密码或扫码的不拉。青龙脚本经常需要环境变量来提供 Cookie 或 token,如果不小心拉了一个带有恶意代码的仓库,等于把你的账号凭据直接送给了别人。所以即使你看到某个“全自动任务仓库”很火,也建议先 fork 一份,自己看看主要代码逻辑再决定要不要用。
如果只是自己写一些健康检查、签到提醒、账单统计之类的脚本,其实完全够用,也不需要冒险。青龙面板的本质是定时任务执行器,不是羊毛收割机,摆正这个心态,才能长期稳定地用下去。
7. 长期开机运行:散热、日志、备份和故障排查的实战经验
7.1 散热和供电:电视盒子最容易被忽视的两个物理坑
电视盒子的外壳设计本来是按“看几个小时后待机”的场景做的,拿来 24 小时跑容器,散热压力会明显上升。E900V22C 这类盒子有些是金属外壳,有些是塑料外壳,长时间满负荷运行时,外壳摸起来会很烫。我的处理方式很简单:给盒子底部垫几个脚垫,保证通风;放在家里阴凉、不积灰的位置;如果环境特别热,花几块钱贴一片散热片也有明显改善。
另一个容易被忽视的是供电。直接用机顶盒原来的 5V/2A 电源问题不大,但千万不要为了省插座,把盒子插在电视的 USB 口上供电。电视关机时 USB 口断电,盒子直接异常掉电,正在写入的容器数据可能损坏。单独插在墙插上,让盒子 7x24 小时保持稳定供电,是最基本的保障。
7.2 别把 eMMC 当传家宝,但也不能乱折腾
eMMC 闪存有写入寿命,虽然正常使用下没那么容易坏,但在这种低功耗盒子上,频繁大量写入会让寿命加速缩短。所以有两个操作我特别不建议:一是在 eMMC 上挂 swap 文件,二是让容器日志无限增长。
Armbian 默认的内存压缩机制 zram 已经能解决大部分内存紧张问题,不需要再额外塞一个 swap 文件到 eMMC 上。容器日志的问题在前面已经通过daemon.json做了限制,青龙面板自己的日志目录也要留意。时间长了可以在宿主机上看一下~/containers/qinglong/data/log占了多少空间,如果发现很多无用日志,直接在面板里清理定时任务日志即可。
7.3 常见故障的排查链路
长期运行不可能一次问题都不出,下面这个表格是我实际踩过的最常见的几类问题,以及对应的排查顺序。
| 症状 | 可能的根因 | 排查与解决 |
|---|---|---|
| 青龙面板打不开 | 容器没启动或端口映射异常 | docker ps -a看容器状态,docker logs -f qinglong看日志 |
| 定时任务一直显示等待 | cron 时区错误或容器没运行 | 检查系统时区、面板时区、容器 restart 策略 |
| 脚本报“Cannot find module” | 依赖没装或装错环境 | 在依赖管理里确认对应 Node/Python 依赖已安装 |
| 青龙页面能打开但操作很卡 | 内存不足 | free -h、docker stats查看内存占用,考虑停掉多余容器 |
| 盒子突然断网或重启 | 供电不稳或散热过高 | 检查电源适配器、摸外壳温度、看系统日志dmesg |
遇到问题不要第一时间怀疑盒子坏了,先看容器、再看系统日志、最后才考虑硬件。这条链路能解决 90% 以上的日常故障。
7.4 备份青龙数据:一晚上就鼓捣出来的备份习惯
青龙的面板配置、脚本源码、任务列表都在~/containers/qinglong/data目录里。备份最简单的方式就是打包这个目录,然后把打包文件拷到电脑或另一台设备上:
tar -czf ql-backup-$(date +%F).tar.gz ~/containers/qinglong/data如果连青龙面板都进不去了,也可以从宿主机直接打包,然后在新容器里恢复挂载目录,整个服务就能完整还魂。给我最大的安全感不是青龙本身多稳定,而是数据目录随时可备份、容器环境随时可重建。
我用这台盒子跑青龙到现在,最明显的感觉是:电视盒子不是越贵越好,而是越用得久越值。它没有给我省下什么大钱,但帮我把每天要手动处理的零碎事务变成了无人值守的定时任务。如果你手里也有一台 E900V22C 或者其他晶晨盒子,别让它继续吃灰了,按照这个流程把它变成 24 小时待命的家庭自动化调度器,性价比真的比再买一台 NAS 高得多。