👁 2760
这台京东云盒 Athena AX6600 在我桌上摆了大半年,一直当京东 PCDN 跑,吃灰得厉害。终于趁周末把它折腾了——目标是刷成 GWRT,跑 Docker、SSH、自定义插件,把 IPQ6018 + 1G RAM 的硬件资源真正榨出来。
整套流程拆开来其实就五件事:在线开 telnet → 备份 eMMC → 刷第三方 U-Boot → 刷扩容 GPT → 刷 GWRT 固件。其中 75% 的时间花在”想清楚每一步在干嘛”和”备份”上,真正的刷写动作只占几分钟。这篇就把整个折腾过程一点不漏地记下来,包括踩过的坑、走过的弯路,给后来人当参考。
另外说一下,IPQ6018 这颗 SoC 京东云一口气出了好几台机器,分区结构完全一致,只有 U-Boot 和固件不同:
- JDBox Athena AX6600(本文主角)→
jdcloud_re-cs-02,三频 WiFi6,平时功耗 ~12W - JDBox AX1800 Pro →
jdcloud_re-ss-01,双频 WiFi6 - JDBox 太乙(PCDN/NAS 专用,没 WiFi)→
jdcloud_re-cs-07,就是 cs-02 砍掉 WiFi 的版本
所以这篇虽然以 AX6600 为例,AX1800Pro 和太乙的兄弟们看了直接照搬就行,只换 U-Boot 文件。
一、为什么要刷?先看清楚分区
京东云盒系统是 OpenWrt 18.06 魔改的,闭源、阉割得很狠。最致命的是 rootfs 只给了 60MB——不只是慢,是装不下任何稍微像样的第三方插件。装个 SmartDNS、UnblockNeteaseMusic 啥的就喊空间不足,更别提 Docker。
用 fdisk -l /dev/mmcblk0 看 eMMC 分区,27 个分区,密密麻麻。挑出关键的几个:
| 分区 | 名称 | 大小 | 作用 | 能不能动 |
|---|---|---|---|---|
| p1 | SBL1 | 512K | 一级引导(写在 ROM 里指定位置) | ❌ 千万别碰,刷坏只能编程器救或合成镜像一起刷 |
| p2/p3 | BOOTCONFIG | 32K | 记录当前活跃槽位 A/B | A/B 切换才动 在线刷uboot后一般察除它 |
| p4~p9 | QSEE/DEVCFG 等 | ~6MB | 高通固件、TZ、DPR 等 | 不要动,跟 SoC 强绑定 |
| p10/p11 | CDT | 32K | 内存识别表 | ❌ 硬改内存才碰,乱刷其他必砖风险大 |
| p13/p14 | APPSBL (U-Boot) | 512K x2 | U-Boot 引导器(A/B) | ✅ 这就是要刷的 |
| p15 | 0:ART | 1MB | MAC/SN/WiFi 校准 | ❌ 每台唯一,丢了只能下别人的 修改mac可以改这个永久 |
| p16/p17 | HLOS | 6M x2 | Linux 内核(A/B) | ✅ 刷固件时改 |
| p18~p23 | rootfs / rootfs_data | 60M x2 + … | 根文件系统(A/B) | ✅ 太小了所以要扩容 |
| p24~p26 | plugin/log/swap | 各几十MB~1G | 用户数据 | 不跑分了这几个分区用不到可以删除合并到后面分区 swap交换分区没有数据,前面分区调整可以先删除再建这是给内存小的机器用大内存的一半用不到 |
| p27 | storage | 剩余 | 大容量用户数据 | 用 no-last-partition GPT 后只这个会消失,进系统手动建 |
所以刷机的真实动作就两个:刷 p13/p14(换 U-Boot),然后扩容 p18/p20 的 rootfs。其余一切折腾都是围绕这两件事服务的。
二、阶段一:在线开 telnet(不拆机,不绑 App)
老办法是拆机焊串口(TTL 转 USB),但这台机器外壳卡得紧、PCB 走线也不是 TX/RX/GND 一字排开那种好焊的——能不拆机就坚决不拆机。而且实际操作下来,连京东 App 都用不上,全程浏览器搞定。
2.1 进 Web 后台设个登录密码
新机或者重置过的机器接通电源,电脑用网线接 LAN 口,浏览器访问 192.168.68.1。第一次进去会让你设管理员密码——就设一个你能记住的,比如随便一个 jdbox888 之类的。
这个密码很重要,因为它有双重身份:
- Web 后台登录密码
- 等下 telnet 进系统时的 root 密码(同一个,京东云盒就这么设计的)
设完密码登录进 Web 后台,能看到熟悉的状态页就行。不需要下载京东 App,不需要账号绑定,不需要跑 PCDN。这是很多教程上来就让你装 App 的最大误区,其实纯本地操作就够。
2.2 浏览器书签脚本一键开 telnet
京东云盒系统里的 telnet 服务是带着的,只是默认没启动。社区已经反编译出后台调用接口,写成了一段 JavaScript bookmarklet(书签栏脚本)——把脚本代码作为 URL 存到浏览器书签栏,登录路由后台之后点一下书签,它就用你已经登录的 session 调内部接口把 23 端口开起来。再点一下能反过来关掉。
可以直接看这里在线开 telnet :https://gwrt.uk/jdc-arthur-telnet-4546.html
用法非常傻瓜:
- 在浏览器书签栏新建一个书签,名字随便(比如
JDBox开/关 telnet) - 地址栏填那段
javascript:...开头的脚本 - 登录路由后台
192.168.68.1 - 点书签 → 弹窗提示成功 → telnet 已开
- 用完之后再点一次书签 → 关掉
原理就是调用后台自己的内部接口,跟京东服务端没关系——这就是为什么不需要 App、不需要绑账号。比起需要 SN/App/抓包的老方案,这个是目前最干净的一种。
2.3 telnet 连进去
电脑还在 192.168.68.x 段(DHCP 拿的),直接 telnet:
telnet 192.168.68.1
# login: root
# Password: (刚才在 Web 后台设的那个密码)
注意 telnet 不是无密码——账户 root,密码就是 Web 后台密码,端口默认 23。这点跟一些老教程不一样(早年的 XOS 老固件确实有过无密码的版本,新固件都改了)。
进去先确认两件事:
# 看分区表,确认是 IPQ6018 的 27 分区
fdisk -l /dev/mmcblk0
# 看 rootfs 实际大小(验证扩容前的必要性)
df -h
能看到 /dev/mmcblk0p18 或 p20 挂在 /,大小 60MB 出头——确认这就是要扩容的对象。
三、阶段二:备份 eMMC(救命的一步)
这一步我多花了半小时,因为p15 ART 真的是丢了就 GG——它存着这台机器的 MAC 地址、序列号、WiFi 射频校准数据,每台都不一样。即便你能从别人那里搞到同型号的 ART,刷上去 WiFi 也会因为校准不对而表现奇怪(信号弱、温飘大、断流)。
3.1 准备备份目录
eMMC 总共 8GB,所有分区一起 dd 出来大概 1.28GB。机器内的 storage 分区(p27)有几个 G 富余可以临时放。备份完之后立刻拷到电脑、NAS、网盘,至少 3 个位置,离线再单独留 1 份。
# 在机器上找一个能写的大目录
df -h | grep -E 'storage|plugin'
# 假设 p27 是 storage,挂载在 /mnt/mmcblk0p27
mkdir -p /mnt/mmcblk0p27/emmc_backup
cd /mnt/mmcblk0p27/emmc_backup
3.2 一把梭备份脚本
p1 到 p25 全备(p26/p27 是用户数据可选):
for i in $(seq 1 25); do
echo "dumping p$i..."
dd if=/dev/mmcblk0p$i of=p$i.bin bs=1M 2>/dev/null
done
# GPT 头(最前面 34 个扇区)
dd if=/dev/mmcblk0 of=gpt_primary.bin bs=512 count=34
# GPT 备份头(在 eMMC 末尾)—— 看 fdisk 输出的总扇区数 N,N-33 到 N
SEC=$(blockdev --getsz /dev/mmcblk0)
dd if=/dev/mmcblk0 of=gpt_backup.bin bs=512 skip=$((SEC-33)) count=33
# 校验
md5sum *.bin > md5sums.txt
ls -lh *.bin
du -sh .
3.3 拷出来 + 二次校验
拷出来的方式很多种,挑顺手的:
# 法 1:起个 HTTP server 直接浏览器拉
busybox httpd -p 8080 -h /mnt/mmcblk0p27/emmc_backup
# 浏览器访问 http://192.168.68.1:8080/
# 法 2:nc 单文件
# 电脑端先:nc -l -p 9999 > p15.bin
# 机器端:nc 192.168.68.100 9999 < p15.bin
# 法 3:scp(如果 dropbear 在跑)
scp *.bin [email protected]:/path/
拷到电脑后再 md5sum 一次,跟机器上的 md5sums.txt 对一对,一字不差才算备份完。
这一步我推荐写个备份脚本一把梭,按顺序 dd 完所有分区、生成 md5、再统一拷出去。脚本怎么写第三章 3.2 已经给了,照抄即可。
四、阶段三:刷第三方 U-Boot
这是整个流程里最关键也最危险的一步——U-Boot 是引导器,刷错了机器就开不了机。但 IPQ6018 的好处是 A/B 双槽设计,即便一个槽刷坏了,另一个槽还能引导,所以稳妥起见两个槽都刷。
4.1 挑对 U-Boot 文件 + 期望 MD5
开头列过对应关系。三个机型对应三个 U-Boot 文件,我已经传到 godsun.pro,下面就直接用 curl 在 telnet 里拉。每个文件都标了期望 md5sum,下载完一定要对一下。
| 机型 | U-Boot 文件 | 期望 MD5 |
|---|---|---|
| AX6600 / Athena | uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin |
0c74af00d882d462f43fe10bf9e0aaf4 |
| AX1800 Pro | uboot-ipq60xx-emmc-jdcloud_re-ss-01.bin |
2266697f5106c170a91e283adf7a3d19 |
| 太乙 | uboot-ipq60xx-emmc-jdcloud_re-cs-07.bin |
c862a792447131e832fd2daf7546fbf0 |
文件 640KB 比官方分区 512KB 大——这是正常的,第三方 U-Boot 加了 Web 刷机界面,但实际写入 eMMC 的部分仍在分区大小内。
4.2 在线下载 + MD5 校验(推荐)
京东云盒原厂固件就能联网,所以前面把 telnet 开通后,直接 telnet 里 curl 我博客上的附件最方便——不用搭本地 httpd、不用 scp、不用 U 盘。在 telnet 里:
# 1) 切到 tmpfs(写在内存里,刷完一断电就清,干净)
cd /tmp
# 2) 一行下载 + 立刻 md5sum(AX6600 为例)
curl -fLO https://godsun.pro/wp-content/uploads/flash-files/uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin && md5sum uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin
看到输出的 md5 跟上表里的 0c74af00d882d462f43fe10bf9e0aaf4 完全一致才能继续。如果对不上(或者 curl 中途断了),就再来一次:
# 不对就删掉重新拉,网络抖一下很常见
rm -f uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin
curl -fLO https://godsun.pro/wp-content/uploads/flash-files/uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin && md5sum uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin
AX1800 Pro 和太乙换对应文件名和 MD5 即可。MD5 一致再往下,不一致绝不 dd——错的 U-Boot 写下去就是开机黑屏。
顺便也把全部 MD5 列表传上了,懒得抄表的话直接拉:
curl -s https://godsun.pro/wp-content/uploads/flash-files/MD5SUMS
# 然后 md5sum -c 一把对比所有 .bin
curl -s https://godsun.pro/wp-content/uploads/flash-files/MD5SUMS > MD5SUMS
md5sum -c MD5SUMS 2>/dev/null | grep -E 'cs-02|ss-01|cs-07'
4.3 dd 写入 p13/p14
MD5 对上之后,在 telnet 里直接干(AX6600 为例,其他机型替换文件名):
# A 槽
dd if=uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin of=/dev/mmcblk0p13 bs=128K
sync
# B 槽
dd if=uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin of=/dev/mmcblk0p14 bs=128K
sync
每条 dd 完都立刻 sync,防止数据还在缓存里。两条都写完之后,先别重启,回读对比一下两个分区:
# 算源文件大小对应的扇区数(128K 块为单位)
SRC=uboot-ipq60xx-emmc-jdcloud_re-cs-02.bin
BLOCKS=$(($(stat -c%s $SRC) / 131072)) # 640K/128K = 5
# 回读 A/B 同样块数,跟源文件比 md5
dd if=/dev/mmcblk0p13 bs=128K count=$BLOCKS 2>/dev/null | md5sum
dd if=/dev/mmcblk0p14 bs=128K count=$BLOCKS 2>/dev/null | md5sum
md5sum $SRC
三行 md5 必须完全相同——A/B 两个槽位的内容跟源 U-Boot 文件一致就放心了。如果哪个槽对不上,就再 dd 一次那一个槽。

4.4 进 U-Boot Web 界面
这一步要心理准备:断电拔电源,按住 reset 键不松,再插电源,按住至少 10 秒。机器会用 U-Boot 救砖模式起来,灯会有规律地闪(红 / 蓝交替之类的,看具体型号)。
等灯稳定下来,电脑接 LAN 口,配静态 IP 192.168.1.x,浏览器访问:
http://192.168.1.1
看到一个朴素的 Web 刷机界面(通常是 jdcloud_re 风格的页面,有 “GPT 分区表”、”factory 镜像”、”sysupgrade 镜像” 几个上传位)—— 看到这个界面 = U-Boot 刷成功 ✓。
如果没看到(页面打不开、灯不闪),别慌:
- 先看 LAN 口灯有没有亮,确认物理连接
- 电脑 IP 是不是真的在 192.168.1.x 段(DHCP 可能没拿到 IP)
- 实在不行就上 9008 救砖,把 p13/p14 用之前的备份刷回去(备份做对了这步就是稳的)

五、阶段四:刷扩容 GPT 分区表
U-Boot 刷完之后,下一步是改 GPT,让 rootfs 从 60MB 变 2GB。GPT 有两种刷法:U-Boot Web 上传(保守)、或 telnet 里在线 dd(更快)。两种都行,下面分别给出。
5.1 挑 GPT 模板 + 期望 MD5
GPT 模板按 SoC + 内存挑(AX6600 和太乙共用同一份,因为分区结构一样):
| 机型 | GPT 模板 | 期望 MD5 |
|---|---|---|
| AX6600 / 太乙 | gpt-AX6600-rootfs2048M.bin |
f05fb87ce722f422e3e3eb4a651f74be |
| AX1800 Pro | gpt-AX1800Pro-rootfs2048M.bin |
4e68b53b2646a4824aed74a4f5b656ea |
关键字看 rootfs2048M(rootfs 2GB)HLOS12M(内核 12MB,已够新版 GWRT 用)no-last-partition(不预留最后的 storage 分区,留给我们后面手动建)。文件只有 17KB——它只覆盖 eMMC 前 34 个扇区(每扇区 512 字节)的 GPT 头。
5.2 写法 A:U-Boot Web 上传(保守推荐)
这是默认教程的走法——刷完 U-Boot 后按 reset 进 U-Boot Web 界面,找到 “GPT 分区表” / “Partition Table” 上传位,把 GPT 模板传上去。
千万别传到 “全盘镜像 / Whole flash” ——那个是覆盖整个 eMMC(包括 ART!),传错就废。
点上传,等几秒,提示成功后先别动——这时候机器分区表已经换了,但还在 U-Boot 里没启动操作系统,可以继续刷 factory(下一阶段)。
5.3 写法 B:telnet 里在线 dd(更快,老手推荐)
既然 4.2 已经在 telnet 里 curl 过了 U-Boot,GPT 也完全可以同样地拉下来、md5 校验、dd 直接写。这一步可以在刷 U-Boot 之前的同一个 telnet 会话里就做完,把所有”分区前提”一次性搞定,省得再切换 U-Boot Web。
cd /tmp
# 1) 在线下载 + md5sum(AX6600 / 太乙 用同一份)
curl -fLO https://godsun.pro/wp-content/uploads/flash-files/gpt-AX6600-rootfs2048M.bin && md5sum gpt-AX6600-rootfs2048M.bin
# 期望:f05fb87ce722f422e3e3eb4a651f74be
# 不一致就 rm -f 重拉
# 2) MD5 正确才 dd,写到 /dev/mmcblk0 最前面(覆盖 MBR + 主 GPT 头)
dd if=gpt-AX6600-rootfs2048M.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync
sync
# 3) 回读对比,确认 dd 内容正确
dd if=/dev/mmcblk0 bs=512 count=34 2>/dev/null | md5sum
md5sum gpt-AX6600-rootfs2048M.bin
两个 md5 完全一致就说明 GPT 已经换好了。这时候不要重启(重启会按新 GPT 加载,可能因为内核 A/B 分区还没刷新固件而启动不了)—— 直接接 4.3 的 dd U-Boot,然后按 reset 进 U-Boot Web 刷 factory。
AX1800 Pro 同样办法,把文件名换成 gpt-AX1800Pro-rootfs2048M.bin、MD5 换成 4e68b53b2646a4824aed74a4f5b656ea 即可。
选 A 还是 B? 第一次刷强烈推荐 A——U-Boot Web 有图形界面,看得见进度和报错,心里踏实。我自己折腾到现在,第二台机器开始就走 B 了,telnet 一把梭,三五分钟搞定。
5.4 心理准备:只有最后一个分区会消失
这套 GPT 模板叫 no-last-partition,意思是不预留最后那个 storage 分区——刷完之后 p27 storage 不见了,留出剩余空间给我们自己规划。前面 p24~p26(plugin / log / swap)位置都没变,原本里面的数据理论上也都在。但我建议反正备份做了,刷完 GPT 之后就当 p24~p26 也是空的处理,重新格式化一下,省得新老数据混着出怪问题。
所以阶段五要做的是:补建 storage 分区,顺便把 plugin/log 格式化一遍。备份的价值还是不亏。
六、阶段五:刷 GWRT + 重建分区
6.1 刷 factory 固件
U-Boot Web 上,找到 “factory 镜像” 上传位,把 GWRT 的 factory 镜像传上去。factory 镜像包含 kernel + rootfs + 启动配置,首刷必须走 factory,之后才能用 sysupgrade 升级。
固件本身去 GWRT 官方 / GitHub Action 拉对应机型的:
- AX6600 →
gwrt-ipq60xx-jdcloud_re-cs-02-factory.bin - AX1800Pro →
gwrt-ipq60xx-jdcloud_re-ss-01-factory.bin - 太乙 →
gwrt-ipq60xx-jdcloud_re-cs-07-factory.bin
上传完点确认刷写,等几分钟(中间灯会变化),机器自动重启。
6.2 进 GWRT
电脑接 LAN(IP 还在 192.168.1.x 段),浏览器 192.168.1.1——看到熟悉的 LuCI 界面,恭喜。默认账户:
root / (空密码)
立刻进系统做这几件事:
- System → Administration → 改 root 密码
- Network → Interfaces → 配 WAN(接外网)
- System → Software →
opkg update(确认软件源能拉到) - SSH 进去看
uname -a、df -h,确认 rootfs 2GB 没问题
6.3 补建 storage(+ 顺手格式化 plugin/log)
只有 storage(p27)需要重新建,plugin/log/swap 分区表里还在,只需要重新格式化一下。SSH 进 GWRT:
# 1. 用 fdisk 创建 p27 storage(剩余全部空间)
fdisk /dev/mmcblk0
# n 新建分区 → 编号 27 → 起止扇区默认(用全部剩余)→ t 类型 Linux (83) → w 写盘
# 2. 格式化 plugin / log / swap / storage
mkfs.ext4 -F -L plugin /dev/mmcblk0p24
mkfs.ext4 -F -L log /dev/mmcblk0p25
mkswap -L swap /dev/mmcblk0p26
mkfs.ext4 -F -L storage /dev/mmcblk0p27
# 3. 加进 /etc/config/fstab 自动挂载
cat >> /etc/config/fstab << EOF
config mount
option label 'plugin'
option target '/mnt/plugin'
option enabled '1'
EOF
# 类似地加 log / storage,swap 用 config swap
/etc/init.d/fstab enable && /etc/init.d/fstab start
重启验证 df -h 全部正确挂载,就齐活了。
七、踩过的坑
一些我或者别人踩过的细节,看一眼能省事:
- md5 验证不能省:拿来的 U-Boot 文件、GPT 模板,下载完先 md5sum,传到机器上再 md5sum 一次,写完 eMMC 再读出来 md5sum 一次。任何一次对不上都不能继续。
- sync 大法:每次 dd 之后立刻
sync,否则重启可能数据没真正落盘。 - 9008 模式是底牌:万一刷砖,9008 救砖是最后底牌(短接特定测试点 + 厂商救砖工具 + 把 p13/p14 备份刷回去)。短接位置网上 IPQ6018 都有图,平时记一下。
- BOOTCONFIG 别随便改:A/B 双系统的切换靠它,原理是 fastboot 风格的 active slot。手贱用 dd 把它清零会进不了系统。
- 第三方 U-Boot 选对 NOR/eMMC:JDBox 是 eMMC 版本,文件名带
emmc;同系列也有 NOR 版本(比如某些 AX1800Pro 老批次),用错文件直接砖。 - 升级走 sysupgrade:首刷必须 factory,但之后千万别再走 U-Boot,直接 SSH 进 GWRT 用
sysupgrade -n /tmp/firmware.bin升级。-n 是不保留配置,第一次升级建议用,跑一段时间稳了之后可以去掉。 - 太乙的特殊性:cs-07 就是 cs-02 去 WiFi 模块的版本,刷机流程一模一样,但装完 GWRT 别去 LuCI 看 WiFi——根本没有,不是 bug。当 NAS / PCDN 用是真香。
八、刷机文件下载(单文件 + MD5)
所有 U-Boot 和 GPT 模板按单文件直接提供,每个文件的期望 MD5 都在 §四、§五 里给过了。telnet 里直接 curl 拉对应文件即可,比解压 zip 省事:
| 类型 | 文件 | MD5 |
|---|---|---|
| U-Boot · AX6600 / Athena | jdcloud_re-cs-02.bin |
0c74af00d882d462f43fe10bf9e0aaf4 |
| U-Boot · AX1800 Pro | jdcloud_re-ss-01.bin |
2266697f5106c170a91e283adf7a3d19 |
| U-Boot · 太乙 | jdcloud_re-cs-07.bin |
c862a792447131e832fd2daf7546fbf0 |
| GPT · AX6600 / 太乙 | gpt-AX6600-rootfs2048M.bin |
f05fb87ce722f422e3e3eb4a651f74be |
| GPT · AX1800 Pro | gpt-AX1800Pro-rootfs2048M.bin |
4e68b53b2646a4824aed74a4f5b656ea |
| 📋 全部 MD5 列表 | MD5SUMS |
|
GWRT factory 固件本身因为体积大、迭代快,建议去 GWRT 官方 GitHub Action 拉最新版。备份脚本因为涉及读取 ART 等敏感分区,没放在这里——直接照着第三章 3.2 抄一份就够用。
九、写在最后
整个过程从拿到机器到完整跑起来 GWRT、装好 Docker,花了大概一个下午。最费时间的地方不是刷机本身(实际刷写就几分钟),而是反复确认——每一步动手之前都要再 md5、再 fdisk、再 df 看一眼,确认动的是该动的那块。京东云盒这种工厂魔改机的最大风险不是技术,是手快眼快脑子慢,一不留神 dd 错分区,ART 就没了。
但只要备份做对了,最坏的结局也就是回 9008 救砖把所有分区刷回原样,机器照样还是原来那台跑 PCDN 的”无线宝”。所以大胆刷,谨慎备,就这八个字。
有问题评论区交流,或者翻一下站里其他京东云盒相关的折腾记录。
本文流程实测于 JDBox Athena AX6600(XOS 4.5.x 固件),AX1800Pro / 太乙 因分区结构一致仅 U-Boot 文件不同,原理同。涉及刷机有变砖风险,请充分理解每一步含义后操作,作者不为变砖负责。
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复