之前买的数智佳 H618 电视盒子被我乱刷固件刷成有锁的了,近日翻了出来,重新编译最终吃上了armbian。本篇教程是AI写的,把其中的坑给大家排一排。
如果你也是同款数智佳盒子,不要着急看这个教程,可以参考这个:https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=8469382&extra=&highlight=h618%2Barmbian&page=1 因为这个盒子本身是无锁的,这个教程上半仅适用于有锁机器的引导启动。
这篇文章可以解决下面几个特殊问题:
- 普通
eGON.BT0镜像无法从 TF 卡引导; - 必须使用自签名
TOC0U-Boot; - 安装到 eMMC 时必须同步替换 rootfs 内的 U-Boot;
- 自动升级会覆盖定制内核和 DTB,导致无法启动;
- Docker 需要使用
iptables-legacy。
本机配置:
SoC: Allwinner H618
内存: 3.8GiB 可用(标称 4GB)
eMMC: 58.3GiB(标称 64GB)
网卡: RTL8211F 千兆网卡
系统: Debian Bookworm / Armbian 25.05
内核: 6.12.11-edge-sunxi64
根分区: /dev/mmcblk0p1
引导格式: TOC0.GLH
本文只在这一块数智佳 H618 4+64G、X98H 配置、RTL8211F 网卡的主板上验证成功。即使商品名称和容量相同,不同批次的 DRAM、eMMC、网卡、供电及安全熔丝也可能不同。务必先从 TF 卡验证,确认成功后再写 eMMC。
一、核心原理
普通 Allwinner Armbian 镜像的引导头通常是:
eGON.BT0
这台锁机盒子不会执行 TF 卡里的普通 eGON SPL。实测必须把 SPL/U-Boot 打包成 TOC0,正确镜像从 8KiB 偏移开始应看到:
TOC0.GLH
对应十六进制:
54 4f 43 30 2e 47 4c 48
本机可以接受本地密钥签名的 TOC0,说明它要求 TOC0 格式,但没有被不可替换的厂商 ROTPK 完全锁死。其他机器如果已经把厂商公钥哈希写入 eFuse,本文镜像仍可能被拒绝。
二、开始前准备
准备以下物品:
- armbian 自签 TOC0 镜像;
- 与镜像配套的
linux-u-boot-x98h-edgeDEB; - 一张大于4G的 TF 卡,读卡器和 Rufus、balenaEtcher 或 Win32 Disk Imager。
- 有线网络和能够查看 DHCP 地址的路由器。
(所需文件网盘链接放在文章结尾了,大家可以自取)
三、写入 TF 卡并验证启动
把文末提供的最终镜像完整写入 TF 卡:
Armbian-unofficial_25.05.0-trunk_h618_debian_edge_6.12.11_server_TOC0_TF_4G_TEST.img
盒子彻底断电,插卡后再上电。从路由器中寻找新的 DHCP 地址,然后 SSH 登录。
四、安装到 eMMC 前必须替换系统内的 U-Boot
这是整套流程最关键的一步。
最终 TF 镜像的裸引导区虽然已经写入 TOC0,但 rootfs 内的 U-Boot 文件可能仍是普通 eGON 版本。armbian-install 会使用 rootfs 里的文件写入 eMMC;如果跳过本节,TF 可以启动,拔卡后 eMMC 可能无法启动。
从电脑上传配套 DEB:
scp linux-u-boot-x98h-edge_25.05.0-trunk_arm64__2025.01-S6d41-P754c-H8869-Ve54e-Bb703-R448a.deb root@盒子IP:/root/
在盒子中校验并安装:
cd /root
echo 'aaa99261873553a21cf72d16f02bed3ad9683a8047c17dd6b2ff3ccd362cfb9c linux-u-boot-x98h-edge_25.05.0-trunk_arm64__2025.01-S6d41-P754c-H8869-Ve54e-Bb703-R448a.deb' \
| sha256sum -c -
dpkg -i linux-u-boot-x98h-edge_25.05.0-trunk_arm64__2025.01-S6d41-P754c-H8869-Ve54e-Bb703-R448a.deb
验证待写入文件:
sha256sum /usr/lib/linux-u-boot-edge-x98h/u-boot-sunxi-with-spl.bin
od -An -tx1 -N8 /usr/lib/linux-u-boot-edge-x98h/u-boot-sunxi-with-spl.bin
必须得到:
2340dae80c0ba7caf96d2edf548beca1e141e3d1e1d40fed54cc3b4d2416fcec
54 4f 43 30 2e 47 4c 48
五、确认 TF 与 eMMC 的设备名
不要照抄设备编号,先检查本机:
findmnt /
lsblk -e7 -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL
dmesg | grep -Ei 'mmc|emmc|sdhci' | tail -80
本机的对应关系是:
| 设备 | 含义 |
|---|---|
/dev/mmcblk1,29.1GiB | TF 卡 |
/dev/mmcblk0,58.3GiB,型号 TWSC | eMMC |
/dev/mmcblk0boot0、boot1 | eMMC 引导分区 |
如果你的编号相反,必须按实际结果操作。写错设备会破坏 TF 卡或 eMMC。
六、安装 Armbian 到 eMMC
确认当前根分区来自 TF、内存为 3.8GiB,并且 rootfs 内已经是正确 TOC0 U-Boot 后执行:
armbian-install
本机选择:
2 Boot from eMMC - system on eMMC
目标选择已核对的 eMMC,文件系统选择 ext4,等待复制完成。这个过程会清空 eMMC 原有系统和分区。
完成后:
sync
poweroff
彻底断电后拔掉 TF 卡,再上电。登录后检查:
findmnt /
free -h
uname -r
成功结果:
/dev/mmcblk0p1
Mem: 3.8Gi
6.12.11-edge-sunxi64
七、第一时间锁定板级软件包
这台机器依赖定制 U-Boot、内核和 DTB。普通 apt upgrade 曾把包升级到 Armbian 26.5.1,实际装入 7.0.12-edge-sunxi64,重启后 HDMI 和网络全部不可用。
首次从 eMMC 启动成功后,立即锁定以下四项:
apt-mark hold \
armbian-bsp-cli-x98h-edge \
linux-dtb-edge-sunxi64 \
linux-image-edge-sunxi64 \
linux-u-boot-x98h-edge
apt-mark showhold
应显示四个包。
默认源为官方源,在国内建议自行换源。
之后升级用户空间前先模拟:
apt update
apt upgrade --dry-run
确认没有上述四项,再执行:
apt upgrade
不要使用 armbian-upgrade,暂时避免 apt full-upgrade 和 dist-upgrade,也不要显式安装这四个包的新版本。
八、安装 Docker 与 1Panel(可选)
1Panel 使用 Docker/Compose 管理网站、数据库和应用,所以安装前必须准备 Docker。
安装时大概率会报错Job for docker.service failed because the control process exited with error code.See “systemctl status docker.service” and “journalctl -xeu docker.service” for details.应该是系统默认的 iptables-nft 与精简内核不匹配,可以按照以下流程配置。
1. 检查 Docker 所需模块
这张 6.12.11 镜像已经包含 Docker 基础模块:
for m in \
overlay bridge br_netfilter veth \
nf_conntrack nf_nat \
ip_tables iptable_filter iptable_nat iptable_raw \
xt_MASQUERADE
do
if modprobe "$m"; then
echo "[成功] $m"
else
echo "[失败] $m"
fi
done
没有问题的话,应该是全部加载成功的。
2. 切换到 iptables-legacy
内核保留了完整的 legacy iptables/NAT 模块,但 nftables 的 IPv4/IPv6 table 支持不完整。Debian 默认的 iptables-nft 可能让 Docker 报出“无法创建 NAT chain”一类错误。
apt-get install --no-install-recommends iptables
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
iptables --version
ip6tables --version
iptables -t nat -S
版本中应出现 (legacy),NAT 表应能够正常列出。
让模块开机自动加载:
tee /etc/modules-load.d/docker.conf >/dev/null <<'EOF'
overlay
bridge
br_netfilter
veth
nf_conntrack
nf_nat
ip_tables
iptable_filter
iptable_nat
iptable_raw
xt_MASQUERADE
EOF
启用容器转发:
tee /etc/sysctl.d/99-docker.conf >/dev/null <<'EOF'
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
EOF
sysctl --system
3. 验证:
systemctl is-enabled docker
systemctl is-active docker
docker version
docker info
docker run --rm hello-world
1pctl user-info
*九、容易踩的坑
坑 1:普通 Armbian 镜像写卡后毫无反应
原因:镜像使用 eGON.BT0,锁机 BootROM 不执行它。
处理:使用开头为 TOC0.GLH 的配套镜像。不要因为同为 H618 就把本文 U-Boot 直接写入其他批次 eMMC,应先从 TF 测试。
坑 2:系统启动了,但只有 1.9GiB 内存
原因:TOC0 回退路径中 U-Boot proper 的内存探测上限为 2GiB。
处理:使用包含 4GiB 探测补丁的 U-Boot。正确的设备树内存长度为 00000001 00000000。
这个一般不会出现,因为我上传的就是带4g补丁的包。我也把探测补丁一并放在了压缩包中。
坑 3:TF 能启动,安装 eMMC 后拔卡黑屏
原因:只替换了镜像外部裸引导区,没有替换 rootfs 内的 U-Boot;armbian-install 又把旧 eGON 文件写进了 eMMC。
处理:运行 armbian-install 前必须安装本文配套的 U-Boot DEB,并检查文件哈希和 TOC0.GLH 引导头。
坑 4:照抄 /dev/mmcblk0 或 /dev/mmcblk1
不同镜像和设备树可能交换 TF/eMMC 编号。必须结合 findmnt、容量、型号及 boot0/boot1 判断,不能只看编号。
坑 5:普通 apt upgrade 覆盖了内核和 DTB
本机升级后包版本变成 26.5.1,实际内核为 7.0.12-edge-sunxi64,重启后无法启动。修复文件系统后仍无法启动,降回 25.05.0-trunk / 6.12.11 后恢复。
处理:首次成功启动就锁定 BSP、内核、DTB、U-Boot 四个包。注意:显式执行 dpkg -i 降级内核后,内核和 DTB 的 hold 状态会被重置,必须再次 apt-mark hold。
坑 6:升级过程中整机卡死,强制重启后无法启动
本机曾出现:
bad block bitmap checksum
Filesystem failed CRC
从已验证 TF 启动后确认根分区为 /dev/mmcblk1p1,再修复未挂载的 eMMC:
findmnt /
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS,MODEL
umount /mnt/emmc 2>/dev/null || true
# /dev/mmcblk0p1 是本机 eMMC;其他机器必须按 lsblk 结果修改
e2fsck -f -y -v /dev/mmcblk0p1
本机 FSCK_EXIT=1,表示发现并修复错误,且显示 0 bad blocks。如果出现大量 I/O error,应优先怀疑 eMMC 或供电,不要继续写盘。
坑 7:误以为 Docker 一定缺少 NAT/iptables 内核模块
这张镜像实际包含 iptable_nat、nf_nat、xt_MASQUERADE、bridge、veth 和 overlayfs。模块能够加载、NAT 表也能工作。
真正的问题是用户空间默认调用 iptables-nft,而精简内核的 nftables table 支持不完整。切换到 iptables-legacy 后 Docker 成功启动。必须以 systemctl status docker 和 journalctl -u docker 的具体错误为准,不能只看通用结论。
*十、内核升级后无法启动的救援方法
*十一、编译信息备忘
*十二、参考资料
- 恩山无线论坛:H618 防刷/锁机相关讨论
- 恩山无线论坛:H618 Armbian 卡刷方案
- NickAlilovic/Armbian build
- U-Boot v2025.01:sunxi-common.h
- Armbian:供电与故障排查
- Docker:Debian 安装说明
- 1Panel:在线安装说明
十三、下载与附件
下载的压缩包包含如下文件。最终镜像和配套 U-Boot DEB 是普通用户安装所必需的,其他文件用于救援或复现。
| 文件 | 用途 | SHA256 |
|---|---|---|
Armbian-unofficial_25.05.0-trunk_h618_debian_edge_6.12.11_server_TOC0_TF_4G_TEST.img | 最终 TF 启动镜像 | 295dce9b6f69d4eb15426769c5fb928b46a29ef9ba32b68fa17bd9f8df5d0428 |
linux-u-boot-x98h-edge_25.05.0-trunk_arm64__2025.01-S6d41-P754c-H8869-Ve54e-Bb703-R448a.deb | eMMC 安装前替换 rootfs 内 U-Boot | aaa99261873553a21cf72d16f02bed3ad9683a8047c17dd6b2ff3ccd362cfb9c |
u-boot-sunxi-with-spl_4G_TOC0.bin | 裸 U-Boot、救援及二次制作镜像 | 2340dae80c0ba7caf96d2edf548beca1e141e3d1e1d40fed54cc3b4d2416fcec |
173-sunxi-h616-toc0-probe-up-to-4g.patch | 4GB 探测源码补丁 | d65adc72b53fc56855a8f453be1396a54d01809a64628c9d20d5d140b4cdcf72 |
SHA256SUMS.txt | 所有下载文件校验清单 | – |
下载链接:
夸克网盘:https://pan.quark.cn/s/3386785fb30a?pwd=EhSm 提取码:EhSm
网卡是百兆把armbian固件换成对应的就行了吗,有锁机刷完以后可以变无锁吗
可以试一下,理论上是可行的,刷完也不能变无锁,所有固件都得这么搞一遍才行
哈哈哈哈,今天就刷到了,昨天写的教程
armbian-install没反应,dd if=/dev/mmcblk1 of=/dev/mmcblk0 bs=4M status=progress conv=fsync亦然。emmc明明已加载