linuxer
linuxer
发布于 2024-07-05 / 3,132 阅读
0
0

京东路由器亚瑟 AX1800pro雅典娜 AX6600 太乙 ,赵云be6500 太乙plus 刷机openwrt 后一下修补 分区新建

前序 部分 引用网上的 毕竟被人已经很完善了!

github 咖啡猫大佬的

收藏到的 附件 在此网盘

信息搜集自网上,感谢大佬的分享 ~

目录
1. 旧版本固件开 SSH
2. 系统分区及 eMMC 简单介绍(不需要可以不看)
3. 备份分区(SSH 备份 TTL 备份)
4. 刷不死 uboot 和双分区 gpt 分区表
5. 新建 storage 分区并还原跑分分区
6.USB 9008 救砖

下载好工具软件备用:
SSH 工具软件:Xshell https://pan.lanzoui.com/b0f19ry9g 或者 putty https://www.423down.com/11333.html
文件传输工具软件:WinSCP https://www.ghxi.com/winscp.html
TFTP 服务器工具:Tftpd64 https://bitbucket.org/phjounin/tftpd64/downloads/tftpd64.464.zip

1.旧版本固件开SSH

旧版本开启ssh

1.5.40.r2181(2022-03-01) 及之前版本 SSH 开门:
直接浏览器登录路由器,浏览器上按 F12 打开控制台,在 Console 选项卡下方编辑区域粘贴并回车运行下方代码。
然后就可以 SSH 登录路由器了,IP 192.168.68.1,端口 22,用户名 root,密码是路由器登录密码。
注:如果 Console 不能输入代码,先解除浏览器上的限制。

$.ajax({
    url: "/jdcapi",
    async: false,
    data: JSON.stringify({
        jsonrpc: "2.0",
        id: 1,
        method: "call",
        params: [
            $.cookie("sessionid"),
            "service",
            "set",
            {
                "name": "dropbear",
                "instances": {"instance1": {"command": ["/usr/sbin/dropbear"]}}
            }
        ]
    }),
    dataType: "json",
    type: "POST"
})

1.5.50r2204(2022-04-22) 的 SSH 开门参考:
京东云 - 郑羊羊咩的窝 https://zyyme.com/jdc.html

1.5.80.r2262(2022-12-15) 及之前版本 SSH 开门参考:
京东云无线宝 r2262 之前固件版本开 SSH(有限) https://www.bilibili.com/read/cv21409975
京东云无线宝升级 r2262 固件后打开 SSH(有限) https://www.bilibili.com/read/cv21907565
注:因为固件联网会自动接收下发的热补丁干掉 SSH 进程,所以需要先断网,再重置系统才能开门。
SSH 开门后,只要联网也会下方补丁,SSH 就没了。
详见https://www.right.com.cn/forum/forum.php?mod=redirect&goto=findpost&ptid=8278061&pid=18501460

1.5.80.r2262 方法中在 Linux 或带 USB 的 openwrt 中生成 uci.sh 文件的快捷方式,将系统中的 uci.sh 映射到移动硬盘第二分区的 uci.sh,以便通过添加网络位置编辑 uci.sh,后面通过网络位置编辑 uci.sh 需要不报错正常保存才可以。

1.5.81.r2279(2023-04-06)、4.0.0.r4015(2023-10-16) 和最新 4.3.0.r4211(2024-06-14) 目前未见公开解锁 SSH(Telnet) 方法。
【注意】在线升级 4.3.0.r4211(2024-06-14) 会强制更新 uboot,官方新 uboot 不能中断,如果升级了只能 USB 9008 或者等公开解锁 SSH(Telnet) 方法。
可以直接不死 uboot 刷 4.3.0.r4211,uboot 不会掉,但是不要官方系统上直接升级 4.3.0.r4211。

基本通用的这个,但不一定适用最新的了!!!

新版在线开ssh,最最新不适合!

OpenWrt Telnet 开启助手

🚀 功能介绍

本工具专门用于 OpenWrt 系列路由器, 实测支持 JDC 亚瑟 雅典娜 be6500 等路由器。

通过浏览器远程加载脚本,可以在不拆机的情况下:

  • 一键开启 Telnet (端口 23)

  • 查看设备型号、MAC、SN 及固件版本

  • 一键清理注入设置并关闭服务

🛠️ 方法一:浏览器控制台执行 (推荐)

1. 登录路由器后台 ( 比如 JDC 路由器通常是 192.168.68.1)。

2. 按下 F12 键,或右键点击页面选择“检查”,切换到 Console (控制台) 面板。

3. 复制下方代码并粘贴:

复制代码

var s=document.createElement('script');s.src='https://xos.vvvvvv.de5.net/openwrt/telnet.js?t='+Date.now();document.head.appendChild(s);

⚠️ 注意:浏览器拦截粘贴怎么办?
现代浏览器(如 Chrome/Edge)为了安全,当你第一次粘贴代码时会提示 允许粘贴。你需要手动输入 allow pasting 然后回车,之后就可以正常粘贴代码执行了。

🔖 方法二:存为书签执行 (更方便)

1. 复制下方代码:

复制代码

javascript:alert('\u6b63\u5728\u52a0\u8f7d\u5de5\u5177\u7bb1...');var s=document.createElement('script');s.src='https://xos.vvvvvv.de5.net/openwrt/telnet.js?t='+Date.now();document.head.appendChild(s);

2. 在浏览器书签栏右键选择“添加网页”。

3. 名称填入“JDC 工具箱”,网址粘贴刚才复制的 javascript: 代码。

4. 以后在路由器后台页面,点一下这个书签即可弹出面板。

2.系统分区及eMMC简单介绍(不需要可以不看)

系统分区

如果原厂系统可以开 SSH,则 SSH 软件直接登录 192.168.68.1,端口 22,用户名 root,密码是设置的路由器登录密码。
不能开则只能拆机接 USB 转 TTL(亚瑟建议 1.8V 电平的,雅典娜建议 3.3V 电平的),来备份和刷机了。

下面以亚瑟为例,SSH 登录输入 blkid 命令可以看到分区信息。
亚瑟和雅典娜采用的分区布局相同,个别分区大小不同。
注意使用 TTL 备份分区时,读分区是通过偏移量读取的,所以两者备份命令有所不同。
SSH 备份分区则是直接读取分区,两者备份分区命令相同。

可以看到 blkid 输出中,许多分区都有两个,即一个正常命名的分区,一个尾部加“_1”的分区,其中系统分区有两组 0:HLOS、rootfs、WIFIFW 和 0:HLOS_1、rootfs_1、WIFIFW_1,就是所说的双分区,共享同一个 rootfs_data 挂载系统数据。原厂分区表 0:HLOS 有 6MB,rootfs 只有 60MB,所以原厂分区表下如果刷第三方单分区 OP 固件,只能小于 60MB,且刷之后会利用剩余 rootfs 空间 /dev/loop0 挂载为 overlay,可用空间更小。
BOOTCONFIG 和 BOOTCONFIG1 两个分区数据完全相同,存储分区切换的信息,除了上述的两组系统分区会在升级固件或者一些启动失败 failsafe 情况下切换,其他分区一般默认不变。但在官方进行强制更新时,其他分区会切换。比如 BOOTCONFIG 记录现在系统使用 0:DEVCFG、0:DEVCFG、0:RPM、0:CDT、0:APPSBL 这组分区启动,在官方进行强制更新 single image 镜像时就会刷写新的数据到另外一组带“_1”的分区,并更新 BOOTCONFIG 和 BOOTCONFIG1,反之相同。其他分区是官方强制更新时才会切换,系统分区则是每次固件更新就切换,当然强制更新也会更新固件。如 BOOTCONFIG 记录使用的是 0:HLOS、rootfs、WIFIFW,更新固件会写入数据到 0:HLOS_1、rootfs_1、WIFIFW_1,并更新 BOOTCONFIG 和 BOOTCONFIG1 切换系统分区到 0:HLOS_1、rootfs_1、WIFIFW_1。

其他一些分区可以看下面的简单解释:
GPT: GUID Partition Table (GPT 分区表,在 eMMC 的 UserData 区域即 /dev/mmcblk0 的前 34 个扇区)
SBL1: Secondary Boot Loader Stage 1
BOOTCONFIG: Boot configuration (Failsafe partition information 存储分区切换的信息,其中第 5 个扇区存储 age,即切换分区的次数,可以理解为原厂系统升级的次数)
QSEE: Qualcomm Secure Execution Environment (TrustZone/TZ)
DEVCFG: Device Configuration (Dynamic xPU configuration)
RPM: Resource Power Manager
CDT: Configuration Data Table (Platform ID and DDR configuration 包含平台 ID 和 DDR 参数,SBL1 根据这个平台 ID 加载对应 uboot,uboot 根据平台 ID 加载对应 DTB)
ART: Atheros Radio Test (Wi-Fi calibration data 无线校准数据,包含 MAC,每台机子是唯一的,注意备份)
APPSBLENV: APPS Boot Loader Environment (U-Boot ENV variables U-Boot 环境变量,建议备份)
APPSBL: APPS Boot Loader (U-Boot applications boot loader)
HLOS: High-Level Operating System (Kernel + DTB)
rootfs: Root file system
WIFIFW: Wi-Fi firmware
rootfs_data: Root file system data (原厂固件需要挂载 overlay 到 rootfs_data,一般单分区固件直接挂载 overlay 到 /dev/loop0,不需要这个分区)
plugin: 京东云原厂使用这个分区保存跑分 log,不知为何命名为 plugin 分区
log: 京东云原厂使用这个分区保存跑分插件,不知为何命名为 log 分区,恢复跑分并绑定,需要这个分区,建议备份
swap: swap memory (这个分区是使用闪存空间当做虚拟内存,会损耗 eMMC 寿命)
storage: 京东云原厂使用这个分区存储跑分的缓存数据
BackupGPT: Backup GUID partition table (GPT 备份分区表,在 eMMC 的 UserData 区域即 /dev/mmcblk0 的最后 33 个扇区)

U-Boot (High-level boot loader for Linux)
ELF (Executable and Linkable Format 可执行链接格式)
MBN (Modem Configuration binary)
XPU (Embedded Memory Protected Unit)
DTB (Device Tree Blob 设备树二进制)
DTS (Device Tree Source 设备树源码)
FDT (Flattened Device Tree 扁平设备树)

高通 IPQ60XX、IPQ807X QSDK 系统启动过程分析 https://www.openwrt.pro/post-595.html
高通 android 开发摘要 https://www.cnblogs.com/liang123/p/6325271.html

BusyBox v1.30.1 () built-in shell (ash)

 --------------------------------------------------------------------------
   Welcome to JDBox Router
 --------------------------------------------------------------------------

   $$$$$\ $$$$$$$\         $$$$$$\  $$\       $$$$$$\  $$\   $$\ $$$$$$$\  
   \__$$ |$$  __$$\       $$  __$$\ $$ |     $$  __$$\ $$ |  $$ |$$  __$$\ 
      $$ |$$ |  $$ |      $$ /  \__|$$ |     $$ /  $$ |$$ |  $$ |$$ |  $$ |
      $$ |$$ |  $$ |      $$ |      $$ |     $$ |  $$ |$$ |  $$ |$$ |  $$ |
$$\   $$ |$$ |  $$ |      $$ |      $$ |     $$ |  $$ |$$ |  $$ |$$ |  $$ |
$$ |  $$ |$$ |  $$ |      $$ |  $$\ $$ |     $$ |  $$ |$$ |  $$ |$$ |  $$ |
\$$$$$$  |$$$$$$$  |      \$$$$$$  |$$$$$$$$\ $$$$$$  |\$$$$$$  |$$$$$$$  |
 \______/ \_______/        \______/ \________|\______/  \______/ \_______/ 
                                                                     
 --------------------------------------------------------------------------
   For those about to rock... (1.5.40.r2181, facbb2f3e+r49254)
 --------------------------------------------------------------------------
root@JDBoxV2:~# blkid
/dev/mmcblk0: PTUUID="98101b32-bbe2-4bf2-a06e-2bb33d000c20" PTTYPE="gpt"
/dev/mmcblk0p1: PARTLABEL="0:SBL1" PARTUUID="76956397-a5ca-abcf-cfff-49da1c1c1be8"
/dev/mmcblk0p2: PARTLABEL="0:BOOTCONFIG" PARTUUID="7ba9c6de-ca09-2821-690a-64095242d2a0"
/dev/mmcblk0p3: PARTLABEL="0:BOOTCONFIG1" PARTUUID="1a1ed8db-f385-e8e6-9c74-e18d77bd489b"
/dev/mmcblk0p4: PARTLABEL="0:QSEE" PARTUUID="60f4eda8-3aad-0876-e16a-85254a9fd2a0"
/dev/mmcblk0p5: PARTLABEL="0:QSEE_1" PARTUUID="0cbb89b7-6322-4f98-2a36-c86b2161e82d"
/dev/mmcblk0p6: PARTLABEL="0:DEVCFG" PARTUUID="3871eeb7-ffd8-da0b-c61a-3b98b877a59e"
/dev/mmcblk0p7: PARTLABEL="0:DEVCFG_1" PARTUUID="4d84d3c2-4b7e-026a-3859-9399e060fd5b"
/dev/mmcblk0p8: PARTLABEL="0:RPM" PARTUUID="ad59f4d5-ef22-0f8f-08eb-e52be4d4fd62"
/dev/mmcblk0p9: PARTLABEL="0:RPM_1" PARTUUID="0315721b-068c-c728-8f13-b5154fe16902"
/dev/mmcblk0p10: PARTLABEL="0:CDT" PARTUUID="55d84ba7-7afe-068e-f02b-2b67dd330510"
/dev/mmcblk0p11: PARTLABEL="0:CDT_1" PARTUUID="8d32c906-b4e5-28bc-3050-5be0a3401b36"
/dev/mmcblk0p12: PARTLABEL="0:APPSBLENV" PARTUUID="a65238ed-379f-52e9-f01a-0e45a12d9da4"
/dev/mmcblk0p13: PARTLABEL="0:APPSBL" PARTUUID="88236518-8902-2ecf-6bfb-a33684f1fea0"
/dev/mmcblk0p14: PARTLABEL="0:APPSBL_1" PARTUUID="37a1760e-fea6-1e41-3446-9f4b78492b4c"
/dev/mmcblk0p15: PARTLABEL="0:ART" PARTUUID="e0ab46b9-b259-2644-58d6-5edd6f28e130"
/dev/mmcblk0p16: PARTLABEL="0:HLOS" PARTUUID="8a64c084-9d78-bc87-1438-cbeb2dd343ee"
/dev/mmcblk0p17: PARTLABEL="0:HLOS_1" PARTUUID="486078f8-baec-2466-2dc0-4e4d197f4440"
/dev/mmcblk0p18: TYPE="squashfs" PARTLABEL="rootfs" PARTUUID="39677e50-19f8-f4e2-71c0-8998c27e4b12"
/dev/mmcblk0p19: TYPE="squashfs" PARTLABEL="0:WIFIFW" PARTUUID="d1f6197d-bc9b-8f34-3d34-867f2a94c20a"
/dev/mmcblk0p20: TYPE="squashfs" PARTLABEL="rootfs_1" PARTUUID="8821dc34-da76-d18d-5141-7ed3c9c988d8"
/dev/mmcblk0p21: TYPE="squashfs" PARTLABEL="0:WIFIFW_1" PARTUUID="0665f737-3484-6a78-51fb-f5bc008dee0d"
/dev/mmcblk0p22: UUID="3d9a7891-66d6-4c9d-892f-10d850a7e19a" TYPE="ext4" PARTLABEL="rootfs_data" PARTUUID="a3c6191b-5e4b-9895-6289-886424d7a8ca"
/dev/mmcblk0p23: PARTLABEL="0:ETHPHYFW" PARTUUID="4a60b8d4-5f17-c1eb-5ea8-ada9a8fc0a9d"
/dev/mmcblk0p24: UUID="1d89ec7d-79d9-4a35-9329-30999a73f5af" TYPE="ext4" PARTLABEL="plugin" PARTUUID="4856f760-73f1-4db4-d89d-1eaae564bb24"
/dev/mmcblk0p25: UUID="1dc4f6fd-f03f-4589-9e37-409872cbde7c" TYPE="ext4" PARTLABEL="log" PARTUUID="380a410e-0479-abb6-37f7-0c792c436ef2"
/dev/mmcblk0p26: TYPE="swap" PARTLABEL="swap" PARTUUID="da210aab-3fdf-2640-f432-4c604371906b"
/dev/mmcblk0p27: UUID="afe9b133-ad0d-4f1f-86d6-c577b9df2490" TYPE="ext4" PARTLABEL="storage" PARTUUID="ceb8abfc-7258-fe04-17ae-6e699579e38f"
root@JDBoxV2:~# fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 57.1 GiB, 61329113088 bytes, 119783424 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 98101B32-BBE2-4BF2-A06E-2BB33D000C20

Device                                            
/dev/mmcblk0p1                                    
/dev/mmcblk0p2                                    
/dev/mmcblk0p3                                    
/dev/mmcblk0p4                                    
/dev/mmcblk0p5                                    
/dev/mmcblk0p6                                    
/dev/mmcblk0p7                                    
/dev/mmcblk0p8                                    
/dev/mmcblk0p9                                    
/dev/mmcblk0p10                                   
/dev/mmcblk0p11                                   
/dev/mmcblk0p12                                   
/dev/mmcblk0p13                                   
/dev/mmcblk0p14                                   
/dev/mmcblk0p15                                   
/dev/mmcblk0p16                                   
/dev/mmcblk0p17                                   
/dev/mmcblk0p18                                   
/dev/mmcblk0p19                                   
/dev/mmcblk0p20                                   
/dev/mmcblk0p21                                   
/dev/mmcblk0p22                                   
/dev/mmcblk0p23                                   
/dev/mmcblk0p24                                   
/dev/mmcblk0p25                                   
/dev/mmcblk0p26                                   
/dev/mmcblk0p27                                   
root@JDBoxV2:~# cat /proc/partitions
major minor  #blocks  name

   1        0       4096 ram0
   1        1       4096 ram1
   1        2       4096 ram2
   1        3       4096 ram3
   1        4       4096 ram4
   1        5       4096 ram5
   1        6       4096 ram6
   1        7       4096 ram7
   1        8       4096 ram8
   1        9       4096 ram9
   1       10       4096 ram10
   1       11       4096 ram11
   1       12       4096 ram12
   1       13       4096 ram13
   1       14       4096 ram14
   1       15       4096 ram15
 179        0   59891712 mmcblk0
 179        1        768 mmcblk0p1
 179        2        256 mmcblk0p2
 179        3        256 mmcblk0p3
 179        4       1792 mmcblk0p4
 179        5       1792 mmcblk0p5
 179        6        256 mmcblk0p6
 179        7        256 mmcblk0p7
 179        8        256 mmcblk0p8
 179        9        256 mmcblk0p9
 179       10        256 mmcblk0p10
 179       11        256 mmcblk0p11
 179       12        256 mmcblk0p12
 179       13        640 mmcblk0p13
 179       14        640 mmcblk0p14
 179       15        256 mmcblk0p15
 179       16       6144 mmcblk0p16
 179       17       6144 mmcblk0p17
 179       18      61440 mmcblk0p18
 179       19       4096 mmcblk0p19
 179       20      61440 mmcblk0p20
 179       21       4096 mmcblk0p21
 179       22      20480 mmcblk0p22
 179       23        512 mmcblk0p23
 179       24      89600 mmcblk0p24
 179       25     307200 mmcblk0p25
 179       26     524288 mmcblk0p26
 179       27   58798046 mmcblk0p27
 179       32       4096 mmcblk0rpmb
root@JDBoxV2:~# cat /sys/kernel/debug/mmc0/ios
clock:    192000000 Hz
actual clock: 192000000 Hz
vdd:    18 (3.0 ~ 3.1 V)
bus mode: 2 (push-pull)
chip select:  0 (don't care)
power mode: 2 (on)
bus width:  3 (8 bits)
timing spec:  9 (mmc HS200)
signal voltage: 0 (1.80 V)
driver type:  0 (driver type B)

查看eMMC寿命参考:
var="$(cat /sys/kernel/debug/mmc0/mmc0\:0001/ext_csd)"
eol=${var:534:2};slc=${var:536:2};mlc=${var:538:2}
echo "EOL:0x$eol SLC:0x$slc MLC:0x$mlc"

输出是这样的:

root@JDBoxV2:~# var="$(cat /sys/kernel/debug/mmc0/mmc0\:0001/ext_csd)"
root@JDBoxV2:~# eol=${var:534:2};slc=${var:536:2};mlc=${var:538:2}
root@JDBoxV2:~# echo "EOL:0x$eol SLC:0x$slc MLC:0x$mlc"
EOL:0x01 SLC:0x04 MLC:0x01

EOL:0x01 代表 eMMC 状态正常
SLC:0x04 代表已使用 30%-40% 的寿命,预计剩余 60%。
MLC:0x01 江波龙这个型号的这个参数好像不变,不用看
不同型号 SLC 和 MCL 定义不同,简单只看数最大的即可。

或者刷第三方 OP 后自己安装 mmc-utils 再运行命令查看:

opkg update
opkg install mmc-utils
mmc extcsd read /dev/mmcblk0 | grep -e "Life Time" -e "EOL"

查看 emmc 的启动设置命令:

mmc extcsd read /dev/mmcblk0 | grep -e BOOT_BUS_CONDITIONS -e PARTITION_CONFIG -e RST_N_FUNCTION

可以看到亚瑟和雅典娜的 eMMC 并没有设置 /dev/mmcblk0/boot0 或者 boot1 硬件分区启动。
SBL1 在 UserData 硬件分区,这个硬件分区使用软件分区表 GPT 进行分区,SBL1 在第一个软件分区上。

root@QWRT:~# mmc extcsd read /dev/mmcblk0 | grep -e "Life Time" -e "EOL"
eMMC Life Time Estimation A [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]: 0x04
eMMC Life Time Estimation B [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]: 0x01
eMMC Pre EOL information [EXT_CSD_PRE_EOL_INFO]: 0x01
root@QWRT:~# mmc extcsd read /dev/mmcblk0 | grep -e BOOT_BUS_CONDITIONS -e PARTITION_CONFIG -e RST_N_FUNCTION
Boot configuration bytes [PARTITION_CONFIG: 0x00]
Boot bus Conditions [BOOT_BUS_CONDITIONS: 0x00]
H/W reset function [RST_N_FUNCTION]: 0x00

[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]: life time estimation for the MLC user partition eraseblocks, provided in steps of 10%, e.g.:
0x01 means 0%-10% device life time used.
0x02 means 10%-20% device life time used.
...
[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]: life time estimation for the SLC boot partition eraseblocks, provided in steps of 10%, e.g.:
0x01 means 0%-10% device life time used.
0x02 means 10%-20% device life time used.
...
[EXT_CSD_DEVICE_PRE_EOL_INFO]: overall status for reserved blocks. Possible values are:
0x00 - Not defined.
0x01 - Normal: consumed less than 80% of the reserved blocks.
0x02 - Warning: consumed 80% of the reserved blocks.
0x03 - Urgent: consumed 90% of the reserved blocks.

寿命说明:0x0 是未定义,0x1 是已使用 0-10% 寿命,0x2 是已使用 10%-20% 寿命,依次类推,详见下方
https://wiki.friendlyelec.com/wiki/index.php/EMMC/zh
eMMC 5.1 JEDEC 标准
https://pdfcoffee.com/jesd84-b51-pdf-free.html

9008救砖

如果原厂系统可以开 SSH,可以直接系统中备份分区。
如果不能开则需要拆机 TTL 刷 uboot,再刷旧版固件以便破解 SSH。
拆机接 TTL 详看 TTL 备份分区那部分的内容,先 TTL 备份 uboot 分区(0:APPSBL 和 0:APPSBL_1),当然原厂 uboot 不备份也可,然后 TTL 刷 uboot。
重启进 uboot 刷原厂 1.5.40.r2181 原厂固件,再按旧版本固件方法,不联网破解 SSH 后,系统中备份分区。

刷其他第三方 OP 固件再备份也可,自行选择。
第三方 OP 固件是单分区的,刷固件只是覆盖 0:HLOS 和 rootfs 这两个分区,不会影响其他分区数据。
当然直接 TTL(uboot 控制台)备份也可,不过麻烦,详细 TTL 备份看后面。

固件启动后 SSH 输入 ls -l /mnt 查看是是否挂载了 /mnt/mmcblk0p27

root@JDBoxV2:~# ls -l /mnt
drwxrwxrwx    4 root     root          4096 Mar 24 15:20 mmcblk0p27

刷其他 OP 没有挂载的,自己新建文件夹并挂载,然后再 ls -l /mnt 检查:

mkdir /mnt/mmcblk0p27
mount -t ext4 /dev/mmcblk0p27 /mnt/mmcblk0p27

然后按照老方法备份到 eMMC 的 storage 分区即 /mnt/mmcblk0p27,再通过 WinScp 登录路由器下载保存。
WinScp 软件登录原厂系统,协议 SCP,IP 192.168.68.1,端口 22。
WInScp 下载大文件会提示主机超过 15 秒无通信,需要登录时点击高级,高级站点设置 - 连接 去掉勾选“优化连接缓冲大小”,再登录。

如果心疼读写 2G 数据到 eMMC 的话,备份到 USB 移动硬盘也可以,命令中 /mnt/mmcblk0p27 替换为 USB 的挂载点例如 /mnt/sda1 即可。
确保 USB 移动硬盘有 2G 剩余空间,插上后查看移动硬盘的挂载点,这里是 /mnt/sda1。

root@JDBoxV2:~# ls -l /mnt
drwxrwxrwx    4 root     root          4096 Mar 24 15:20 mmcblk0p27
drwxrwxrwx    2 root     root          1024 Mar  1  2022 sda1

只备份 GPT 分区表和 mmcblk0p1-26,mmcblk0p27 是京东云跑分缓存数据,太大且恢复跑分可以重新缓存,不备份了。
建议分开备份分区,后面需要的时候只要按顺序合并就得到了 mmcblk0p0-26.img 镜像了。
复制命令粘贴一起执行:

dd if=/dev/mmcblk0 bs=512 count=34 of=/mnt/mmcblk0p27/mmcblk0_GPT.bin conv=fsync
dd if=/dev/mmcblk0p1 of=/mnt/mmcblk0p27/mmcblk0p1_0SBL1.bin conv=fsync
dd if=/dev/mmcblk0p2 of=/mnt/mmcblk0p27/mmcblk0p2_0BOOTCONFIG.bin conv=fsync
dd if=/dev/mmcblk0p3 of=/mnt/mmcblk0p27/mmcblk0p3_0BOOTCONFIG1.bin conv=fsync
dd if=/dev/mmcblk0p4 of=/mnt/mmcblk0p27/mmcblk0p4_0QSEE.bin conv=fsync
dd if=/dev/mmcblk0p5 of=/mnt/mmcblk0p27/mmcblk0p5_0QSEE_1.bin conv=fsync
dd if=/dev/mmcblk0p6 of=/mnt/mmcblk0p27/mmcblk0p6_0DEVCFG.bin conv=fsync
dd if=/dev/mmcblk0p7 of=/mnt/mmcblk0p27/mmcblk0p7_0DEVCFG_1.bin conv=fsync
dd if=/dev/mmcblk0p8 of=/mnt/mmcblk0p27/mmcblk0p8_0RPM.bin conv=fsync
dd if=/dev/mmcblk0p9 of=/mnt/mmcblk0p27/mmcblk0p9_0RPM_1.bin conv=fsync
dd if=/dev/mmcblk0p10 of=/mnt/mmcblk0p27/mmcblk0p10_0CDT.bin conv=fsync
dd if=/dev/mmcblk0p11 of=/mnt/mmcblk0p27/mmcblk0p11_0CDT_1.bin conv=fsync
dd if=/dev/mmcblk0p12 of=/mnt/mmcblk0p27/mmcblk0p12_0APPSBLENV.bin conv=fsync
dd if=/dev/mmcblk0p13 of=/mnt/mmcblk0p27/mmcblk0p13_0APPSBL.bin conv=fsync
dd if=/dev/mmcblk0p14 of=/mnt/mmcblk0p27/mmcblk0p14_0APPSBL_1.bin conv=fsync
dd if=/dev/mmcblk0p15 of=/mnt/mmcblk0p27/mmcblk0p15_0ART.bin conv=fsync
dd if=/dev/mmcblk0p16 of=/mnt/mmcblk0p27/mmcblk0p16_0HLOS.bin conv=fsync
dd if=/dev/mmcblk0p17 of=/mnt/mmcblk0p27/mmcblk0p17_0HLOS_1.bin conv=fsync
dd if=/dev/mmcblk0p18 of=/mnt/mmcblk0p27/mmcblk0p18_rootfs.bin conv=fsync
dd if=/dev/mmcblk0p19 of=/mnt/mmcblk0p27/mmcblk0p19_0WIFIFW.bin conv=fsync
dd if=/dev/mmcblk0p20 of=/mnt/mmcblk0p27/mmcblk0p20_rootfs_1.bin conv=fsync
dd if=/dev/mmcblk0p21 of=/mnt/mmcblk0p27/mmcblk0p21_0WIFIFW_1.bin conv=fsync
dd if=/dev/mmcblk0p22 of=/mnt/mmcblk0p27/mmcblk0p22_rootfs_data.bin conv=fsync
dd if=/dev/mmcblk0p23 of=/mnt/mmcblk0p27/mmcblk0p23_0ETHPHYFW.bin conv=fsync
dd if=/dev/mmcblk0p24 of=/mnt/mmcblk0p27/mmcblk0p24_plugin.bin conv=fsync
dd if=/dev/mmcblk0p25 of=/mnt/mmcblk0p27/mmcblk0p25_log.bin conv=fsync
dd if=/dev/mmcblk0p26 of=/mnt/mmcblk0p27/mmcblk0p26_swap.bin conv=fsync

注意亚瑟和雅典娜 GPT 分区表是不一样的,因为有三个分区大小是不一样的:
ART: 亚瑟 256KiB 雅典娜 512KiB
plugin: 亚瑟 87.5MiB 雅典娜 87.25MiB
log: 亚瑟 300MiB 雅典娜 1024 MiB

TTL备份分区

如果没有办法 SSH 或者 eMMC 已经接近挂了,路由器红灯重置也没有用,那只能拆机试试 TTL 有没有输出。
【亚瑟拆机】 从机身底部开始拆,把底部橡胶垫对准 5 个角的部分撕开,就可以看到 5 颗十字螺丝,不需要把底部橡胶垫全部撕开。
拆掉底盖 5 颗螺丝,拿下底盖,然后再拆支架的 4 颗十字螺丝,新机型顶部还有 2 颗十字螺丝,需要先垂直五边形用撬棒撬开顶盖,再拆这 2 颗螺丝。
拆完之后可以把路由器横放在地上(地上用毛巾之类的垫着防止刮花)。
有网口那一面横放,然后稍微用力往下压外壳,使之变形,以便网口陷进外壳,支架和主板可以从底部慢慢抽出来了。
【亚瑟接 TTL】 可以看到主板上 4 个并排的孔 V R T G 就是 TTL 接口了,VCC RX TX GND,线序详见刷机文件压缩包中的图片,亚瑟建议用 1.8V 的 USB 转 TTL。
VCC 不用接,路由器的 RX 接 USB 转 TTL 的 TX,路由器的 TX 接 USB 转 TTL 的 RX,GND 接 GND。
使用串口工具软件打开 USB 转 TTL,然后路由器上电,串口工具软件会跑马,不停按回车中断启动进入 uboot 控制台。
窗口出现 IPQ6018# 即进入 uboot 控制台了。

【雅典娜拆机】 雅典娜需要轻轻撬开前面板,然后使用梅花带孔 T10 或者 T9 的螺丝刀扭开 4 颗螺丝就可以拆开外壳,还有内部有两颗螺丝需要 3.5 或 3.0 的十字螺丝刀。
【雅典娜接 TTL】 雅典娜支持 TTL 探针,只需要拆前面板,然后使用间距是 2.54mm 的 TTL 探针即可,详见刷机文件压缩包中的图片。
有梅花带孔 T10 螺丝刀直接拆也可以,拆开可以看到主板边缘有 TTL 焊盘,需要焊接或者用夹子什么的固定住。雅典娜建议使用 3.3V 的 USB 转 TTL,线序详见刷机文件压缩包中的图片。
注:拆开散热器里面还有一组带孔的 TTL 接口。但是旧机子不改内存不建议拆散热器,拆开再装上不如之前的贴合度好,温度会提高 1-2 摄氏度。

【搭建 tftp 服务器】 接好 USB 转 TTL 路由器上电开机,不停按回车中断启动进入 uboot 控制台。
输入 help 命令可以查看 uboot 支持的命令,输入 printenv 查看环境变量。
可以看到 tftp 服务器 IP 是 192.168.10.1,电脑搭建 fttp 服务器,将电脑的有线网卡设置 IP 为 192.168.10.1。
关闭电脑防火墙,打开 tftp 软件 Tftpd64,选择 192.168.10.1 网卡,则 tftp 服务器设置好了。
网卡连接路由器 LAN 口,然后 uboot 控制台中输入 ping 192.168.10.1 来查看是否通。

IPQ6018# printenv
baudrate=115200
bootargs=console=ttyMSM0,115200n8
bootcmd=bootipq
bootdelay=2
eth1addr=dc:d8:7c:00:00:4a
eth2addr=dc:d8:7d:00:00:4a
eth3addr=dc:d8:7e:00:00:4a
eth4addr=dc:d8:7c:00:00:4b
ethact=eth0
ethaddr=dc:d8:7b:00:00:4a
fdt_high=0x48500000
fdtcontroladdr=4a477ea0
flash_type=5
ipaddr=192.168.10.10       ##<<<<<<<<<<<<< 路由器IP
jdc_crc_enable=1
machid=8030201
netmask=255.255.255.0
serverip=192.168.10.1      ##<<<<<<<<<<<<< tftp服务器即电脑IP
soc_hw_version=20170100
soc_version_major=1
soc_version_minor=0
stderr=serial@78B1000
stdin=serial@78B1000
stdout=serial@78B1000

Environment size: 556/262140 bytes

TTL 备份是通过 mmc read 先将分区读取到内存,再通过 tftpput 传给 tftp 服务器保存到电脑。
不过 tftpput 命令好像传输过大,在传输完成后会重启,所以备份的单个分区不能太大。
像最后两个分区 log 有 300M(雅典娜 log 有 1024M),swap 有 512M,我单独对这两个分区进行了分段备份。
后面用 BIN 文件合并工具或者命令合并还原回 log 和 swap 分区。
使用教程文件夹里的 BIN 文件合并工具 V1.1 合并,或者使用下面命令合并(自行修改文件名,注意文件顺序)。

Linux:
cat file1.bin file2.bin file3.bin > merged_file.bin

Windows:
copy /B file1.bin + file2.bin + file3.bin merged_file.bin

mmc read 命令用法:mmc read addr blk# cnt
addr 是数据读取到内存中的地址,blk# 是要读取的扇区起始地址 (十六进制),一个扇区是 512 字节,cnt 是要读取的扇区数量 (十六进制)。
tftpput 用法:tftpput Address Size [[hostIPaddr:]filename]
Address 是要读取内存中数据的内存地址,Size 是数据字节(十六进制)
mmcblk0p27 第 27 分区是京东云的数据分区,太大了不能备份,只能放弃了

GPT 分区表和前面 14 个分区大小,亚瑟和雅典娜是一样的,都用下面命令备份,复制命令一行一行执行即可:

mmc read 0x50000000 0x00000000 0x00000022 && tftpput 0x50000000 0x00004400 mmcblk0p_GPT.bin
mmc read 0x50000000 0x00000022 0x00000600 && tftpput 0x50000000 0x000c0000 mmcblk0p1_0SBL1.bin
mmc read 0x50000000 0x00000622 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p2_0BOOTCONFIG.bin
mmc read 0x50000000 0x00000822 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p3_0BOOTCONFIG1.bin
mmc read 0x50000000 0x00000a22 0x00000e00 && tftpput 0x50000000 0x001c0000 mmcblk0p4_0QSEE.bin
mmc read 0x50000000 0x00001822 0x00000e00 && tftpput 0x50000000 0x001c0000 mmcblk0p5_0QSEE_1.bin
mmc read 0x50000000 0x00002622 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p6_0DEVCFG.bin
mmc read 0x50000000 0x00002822 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p7_0DEVCFG_1.bin
mmc read 0x50000000 0x00002a22 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p8_0RPM.bin
mmc read 0x50000000 0x00002c22 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p9_0RPM_1.bin
mmc read 0x50000000 0x00002e22 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p10_0CDT.bin
mmc read 0x50000000 0x00003022 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p11_0CDT_1.bin
mmc read 0x50000000 0x00003222 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p12_0APPSBLENV.bin
mmc read 0x50000000 0x00003422 0x00000500 && tftpput 0x50000000 0x000a0000 mmcblk0p13_0APPSBL.bin
mmc read 0x50000000 0x00003922 0x00000500 && tftpput 0x50000000 0x000a0000 mmcblk0p14_0APPSBL_1.bin

注意亚瑟和雅典娜 GPT 分区表是不一样的,因为有三个分区大小是不一样的:
ART: 亚瑟 256KiB 雅典娜 512KiB
plugin: 亚瑟 87.5MiB 雅典娜 87.25MiB
log: 亚瑟 300MiB 雅典娜 1024 MiB

【亚瑟】后面的分区备份命令,耐心复制命令一行一行执行:

mmc read 0x50000000 0x00003e22 0x00000200 && tftpput 0x50000000 0x00040000 mmcblk0p15_0ART.bin
mmc read 0x50000000 0x00004022 0x00003000 && tftpput 0x50000000 0x00600000 mmcblk0p16_0HLOS.bin
mmc read 0x50000000 0x00007022 0x00003000 && tftpput 0x50000000 0x00600000 mmcblk0p17_0HLOS_1.bin
mmc read 0x50000000 0x0000a022 0x0001e000 && tftpput 0x50000000 0x03c00000 mmcblk0p18_rootfs.bin
mmc read 0x50000000 0x00028022 0x00002000 && tftpput 0x50000000 0x00400000 mmcblk0p19_0WIFIFW.bin
mmc read 0x50000000 0x0002a022 0x0001e000 && tftpput 0x50000000 0x03c00000 mmcblk0p20_rootfs_1.bin
mmc read 0x50000000 0x00048022 0x00002000 && tftpput 0x50000000 0x00400000 mmcblk0p21_0WIFIFW_1.bin
mmc read 0x50000000 0x0004a022 0x0000a000 && tftpput 0x50000000 0x01400000 mmcblk0p22_rootfs_data.bin
mmc read 0x50000000 0x00054022 0x00000400 && tftpput 0x50000000 0x00080000 mmcblk0p23_0ETHPHYFW.bin
mmc read 0x50000000 0x00054422 0x0002bc00 && tftpput 0x50000000 0x05780000 mmcblk0p24_plugin.bin

mmc read 0x50000000 0x00080022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log1.bin
mmc read 0x50000000 0x000a0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log2.bin
mmc read 0x50000000 0x000c0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log3.bin
mmc read 0x50000000 0x000e0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log4.bin
mmc read 0x50000000 0x00100022 0x00016000 && tftpput 0x50000000 0x02c00000 mmcblk0p25_log5.bin

mmc read 0x50000000 0x00116022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap1.bin
mmc read 0x50000000 0x00136022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap2.bin
mmc read 0x50000000 0x00156022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap3.bin
mmc read 0x50000000 0x00176022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap4.bin
mmc read 0x50000000 0x00196022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap5.bin
mmc read 0x50000000 0x001b6022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap6.bin
mmc read 0x50000000 0x001d6022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap7.bin
mmc read 0x50000000 0x001f6022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap8.bin

【雅典娜】后面的分区备份命令,耐心复制命令一行一行执行:

mmc read 0x50000000 0x00003e22 0x00000400 && tftpput 0x50000000 0x00080000 mmcblk0p15_0ART.bin
mmc read 0x50000000 0x00004222 0x00003000 && tftpput 0x50000000 0x00600000 mmcblk0p16_0HLOS.bin
mmc read 0x50000000 0x00007222 0x00003000 && tftpput 0x50000000 0x00600000 mmcblk0p17_0HLOS_1.bin
mmc read 0x50000000 0x0000a222 0x0001e000 && tftpput 0x50000000 0x03c00000 mmcblk0p18_rootfs.bin
mmc read 0x50000000 0x00028222 0x00002000 && tftpput 0x50000000 0x00400000 mmcblk0p19_0WIFIFW.bin
mmc read 0x50000000 0x0002a222 0x0001e000 && tftpput 0x50000000 0x03c00000 mmcblk0p20_rootfs_1.bin
mmc read 0x50000000 0x00048222 0x00002000 && tftpput 0x50000000 0x00400000 mmcblk0p21_0WIFIFW_1.bin
mmc read 0x50000000 0x0004a222 0x0000a000 && tftpput 0x50000000 0x01400000 mmcblk0p22_rootfs_data.bin
mmc read 0x50000000 0x00054222 0x00000400 && tftpput 0x50000000 0x00080000 mmcblk0p23_0ETHPHYFW.bin
mmc read 0x50000000 0x00054622 0x0002ba00 && tftpput 0x50000000 0x05740000 mmcblk0p24_plugin.bin

mmc read 0x50000000 0x00080022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log1.bin
mmc read 0x50000000 0x000a0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log2.bin
mmc read 0x50000000 0x000c0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log3.bin
mmc read 0x50000000 0x000e0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log4.bin
mmc read 0x50000000 0x00100022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log5.bin
mmc read 0x50000000 0x00120022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log6.bin
mmc read 0x50000000 0x00140022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log7.bin
mmc read 0x50000000 0x00160022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log8.bin
mmc read 0x50000000 0x00180022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log9.bin
mmc read 0x50000000 0x001a0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log10.bin
mmc read 0x50000000 0x001c0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log11.bin
mmc read 0x50000000 0x001e0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log12.bin
mmc read 0x50000000 0x00200022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log13.bin
mmc read 0x50000000 0x00220022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log14.bin
mmc read 0x50000000 0x00240022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log15.bin
mmc read 0x50000000 0x00260022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p25_log16.bin

mmc read 0x50000000 0x00280022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap1.bin
mmc read 0x50000000 0x002a0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap2.bin
mmc read 0x50000000 0x002c0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap3.bin
mmc read 0x50000000 0x002e0022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap4.bin
mmc read 0x50000000 0x00300022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap5.bin
mmc read 0x50000000 0x00320022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap6.bin
mmc read 0x50000000 0x00340022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap7.bin
mmc read 0x50000000 0x00360022 0x00020000 && tftpput 0x50000000 0x04000000 mmcblk0p26_swap8.bin

4.刷uboot和双分区gpt分区表

注意:用谁的 uboot 看谁的教程,我的 uboot 是亚瑟雅典娜通刷,别人的我不知道,不要乱用!!!
我这个 uboot 是可以亚瑟、雅典娜通用的,不区分双分区、单分区,默认 uboot 刷固件都会刷到 0:HLOS、rootfs。
如果擦除了 0:BOOTCONFIG 和 0:BOOTCONFIG1 分区,则启动只会用到第一个命名正常的分区(即不是尾部有“_1”的分区),uboot 只会启动系统分区 0:HLOS、rootfs。
如果保留 0:BOOTCONFIG 和 0:BOOTCONFIG1 分区,则按分区里面的设置启动对应的系统分区。
为了更好支持原厂系统,我是保留 0:BOOTCONFIG 和 0:BOOTCONFIG1 支持双分区的,gpt 分区表也使用的是双分区扩容分区表。

SSH刷写

已开 SSH 的可以 SSH 刷写,没有看下方的拆机 TTL 方法。
WinScp 上传 uboot 文件 uboot-JDC_AX1800_Pro-AX6600_Athena-20240510.bin 到 tmp 文件夹,然后 SSH 输入命令刷写 uboot 到 0:APPSBL 和 0:APPSBL_1 分区:

dd if=/tmp/uboot-JDC_AX1800_Pro-AX6600_Athena-20240510.bin of=$(blkid -t PARTLABEL=0:APPSBL -o device) conv=fsync
dd if=/tmp/uboot-JDC_AX1800_Pro-AX6600_Athena-20240510.bin of=$(blkid -t PARTLABEL=0:APPSBL_1 -o device) conv=fsync

输入命令检查分区 md5 hash 值,和我这版 2024.05.10 编译的 md5 一致即可:

md5sum $(blkid -t PARTLABEL=0:APPSBL -o device) && md5sum $(blkid -t PARTLABEL=0:APPSBL_1 -o device)
root@JDBoxV2:~# md5sum $(blkid -t PARTLABEL=0:APPSBL -o device) && md5sum $(blkid -t PARTLABEL=0:APPSBL_1 -o device)
5e1817f795ada48335fda9f22545a43e  /dev/mmcblk0p13
5e1817f795ada48335fda9f22545a43e  /dev/mmcblk0p14

分区表文件夹中的 gpt 文件,rootfs512M 对应 rootfs 是 512MB 大小,依次类推。
这个 rootfs 就是固件 +overlay 的大小,overlay 近似是刷固件后剩余软件包空间大小,选择自己需要的 rootfs 大小的分区表即可。
因为刷分区表是改变了后面的分区的偏移量,所以后面分区的数据就不能识别了。
后面会讲到,如果要回原厂跑分,需要先恢复 log、plugin、swap,后面新建的最后一个 storage 分区也要格式化才能用。

注意亚瑟和雅典娜的 gpt 分区表不同,不要上传错了!!!
上传你需要的 rootfs 大小的 gpt 分区表文件到 tmp 文件夹,先验证 md5:

md5sum /tmp/gpt-JDC_*_dual-boot_rootfs*M_no-last-partition.bin
root@JDBoxV2:~# md5sum /tmp/gpt-JDC_*_dual-boot_rootfs*M_no-last-partition.bin
##亚瑟gpt md5
9d9e3803ba541ff38449acd181026b28  /tmp/gpt-JDC_AX1800_Pro_dual-boot_rootfs512M_no-last-partition.bin
5aaf1b606458fbffc72342540db9bc52  /tmp/gpt-JDC_AX1800_Pro_dual-boot_rootfs1024M_no-last-partition.bin
b93b4823af2b4fc31d22c25468181e7a  /tmp/gpt-JDC_AX1800_Pro_dual-boot_rootfs2048M_no-last-partition.bin
##雅典娜gpt md5
3447887a5f47893fa099c7c076eeeee3  /tmp/gpt-JDC_AX6600_Athena_dual-boot_rootfs512M_no-last-partition.bin
1f8217d1f0e0478d2e884278ea30ece5  /tmp/gpt-JDC_AX6600_Athena_dual-boot_rootfs1024M_no-last-partition.bin
9a921ca450e8a5aebd218b7fd1d1c5a8  /tmp/gpt-JDC_AX6600_Athena_dual-boot_rootfs2048M_no-last-partition.bin

自己硬改 eMMC 并且使用我的分区表需要注意:
雅典娜 rootfs 2048M 分区表总扇区数已大于 4G,建议使用 8G 及以上 eMMC。其他亚瑟雅典娜的分区表总扇区数是小于 4G 的,理论可以使用 4G 及以上大小 eMMC。

原厂 eMMC 的不需要关注上面这个注意信息。
你上传的文件的 md5 信息和上面对应文件的 md5 对比,没问题即可。
接着修改下面命令中的 gpt 文件名为你上传的文件名,然后复制命令粘贴一起执行:
(只修改 gpt 文件名,其他不变,这里以 rootfs512M 的分区表为例)
第 1 条 dd 命令是写入 gpt 文件到 /dev/mmcblk0 的前 34 个扇区
第 2 条是 dd 读取分区表传递给 md5sum 校验数据的 md5 值

## 亚瑟 rootfs size 512M GPT
dd if=/tmp/gpt-JDC_AX1800_Pro_dual-boot_rootfs512M_no-last-partition.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync
dd if=/dev/mmcblk0 bs=512 count=34 | md5sum
## 雅典娜 rootfs size 512M GPT
dd if=/tmp/gpt-JDC_AX6600_Athena_dual-boot_rootfs512M_no-last-partition.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync
dd if=/dev/mmcblk0 bs=512 count=34 | md5sum

查看输出的 md5,和上传文件的 md5 一样即可断电进 uboot 刷 factory.bin 固件了。
刷第三方 OP 固件后再进行新建分区、还原分区操作。

TTL刷写

没有开 SSH 的,只能用 TTL 刷写 uboot,然后 uboot 刷原厂 1.5.40.r2181 固件,不联网破解 SSH 后备份分区,再刷分区表。
电脑设置 ip 192.168.10.1/24,关闭防火墙,把 uboot 文件放在 tftp 服务软件根目录,打开 tftp 服务软件。
USB 转 TTL,亚瑟建议使用 1.8V 的 TTL 电平,雅典娜建议使用 3.3V 的,连接路由器串口,电脑使用串口软件打开串口。
串口 TTL 接线可以教程文件夹中的图片。
路由器上电后不停按回车,中断启动,然后输入命令刷写:

tftpboot uboot-JDC_AX1800_Pro-AX6600_Athena-20240510.bin && flash 0:APPSBL && flash 0:APPSBL_1

可以输入命令检查分区 crc32 hash 值:

mmc read 0x50000000 0x00003422 0x500 && crc32 0x50000000 0xA0000
mmc read 0x51000000 0x00003922 0x500 && crc32 0x51000000 0xA0000

输出是这样的,最后得到我改的 2024.05.10 编译的 uboot crc32 值是 3ab2f8a6:

IPQ6018# mmc read 0x50000000 0x00003422 0x500 && crc32 0x50000000 0xA0000

MMC read: dev # 0, block # 13346, count 1280 ... 1280 blocks read: OK
crc32 for 50000000 ... 5009ffff ==> 3ab2f8a6
IPQ6018# mmc read 0x51000000 0x00003922 0x500 && crc32 0x51000000 0xA0000

MMC read: dev # 0, block # 14626, count 1280 ... 1280 blocks read: OK
crc32 for 51000000 ... 5109ffff ==> 3ab2f8a6

如果你已经备份好分区了,也可以直接 TTL 刷分区表。
把你需要的 rootfs 大小的 gpt 分区表放在 tftp 的根目录下,然后用下面命令刷写。
这里以 rootfs 512M 为例,其他的自行修改命令中的文件名。

## 亚瑟刷gpt
tftpboot gpt-JDC_AX1800_Pro_dual-boot_rootfs512M_no-last-partition.bin && mmc write $fileaddr 0x0 0x22
## 雅典娜刷gpt
tftpboot gpt-JDC_AX6600_Athena_dual-boot_rootfs512M_no-last-partition.bin && mmc write $fileaddr 0x0 0x22

刷完之后可以验证 crc32:

mmc read 0x50000000 0x0 0x22 && && crc32 0x50000000 0x4400

对应 crc32 值如下:

## 亚瑟gpt crc32值
B1CC2783  gpt-JDC_AX1800_Pro_dual-boot_rootfs512M_no-last-partition.bin
1D500B9C  gpt-JDC_AX1800_Pro_dual-boot_rootfs1024M_no-last-partition.bin
BE66A69F  gpt-JDC_AX1800_Pro_dual-boot_rootfs2048M_no-last-partition.bin
## 雅典娜gpt crc32值
98B76783  gpt-JDC_AX6600_Athena_dual-boot_rootfs512M_no-last-partition.bin
3A3064A4  gpt-JDC_AX6600_Athena_dual-boot_rootfs1024M_no-last-partition.bin
8D513E9D  gpt-JDC_AX6600_Athena_dual-boot_rootfs2048M_no-last-partition.bin

和文件的 crc32 一样即可断电进 uboot 刷 factory.bin 固件了。
刷第三方 OP 固件后再进行新建分区、还原分区操作。

Uboot支持的固件

uboot支持固件说明

uboot 始终刷写固件到系统 0 并设置 BOOTCONFIG 后从系统 0 启动,即从 0:HLOS、rootfs 启动。
20240510 版 uboot 开始,刷固件会清除固件的配置数据,不管刷 OP 还是原厂固件。
如果直接擦除 0:BOOTCONFIG、0:BOOTCONFIG1 分区,则始终从系统 0 启动。
注意,我的 20240510 版 uboot 开始在刷原厂固件的时候会擦除 rootfs_data 分区,即不保留原厂固件的设置信息。

uboot 支持原厂固件,需要分区表有 0:HLOS、rootfs、0:WIFIFW 和 rootfs_data 这几个分区。这个 0:HLOS 就是 kernel。
原厂是双分区 gpt 分区表,包含 0:HLOS、rootfs、0:WIFIFW 和另一组 0:HLOS_1、rootfs_1、0:WIFIFW_1,共享一个 rootfs_data。
目前 OP 系统不使用 0:WIFIFW、rootfs_data 分区,而是将固件的 kernel 刷入 0:HLOS,固件 rootfs 刷入 rootfs 分区,剩余 rootfs 分区的空间 /dev/loop0 挂载为 overlay 使用。
为了有更大空间刷 OP,可以在原厂双分区 gpt 基础上修改出扩大 rootfs 大小(其他分区不变,storage 大小需要根据调整改变)的双分区分区表使用,
也可以删除 0:HLOS_1、rootfs_1 分区,再扩大 rootfs 大小(其他分区不变,storage 大小需要根据调整改变)变为单分区分区表使用。
单分区分区表则擦除 0:BOOTCONFIG、0:BOOTCONFIG1 分区,使系统始终从系统 0 启动。
无论是单还是双分区,原厂固件需要使用 rootfs_data、0:WIFIFW 分区,不然不能启动,所以要使用原厂固件需要有 rootfs_data、0:WIFIFW 分区。
单分区或者双分区分区表都可以在原厂系统中更新原厂固件。
如果需要跑分,刷了其他分区表,该分区表除了 rootfs_data、0:WIFIFW 分区还需要有 0:ETHPHYFW、plugin、log、swap 这些分区,
并将备份的分区数据恢复到这几个分区,同时 OP 下格式化最后一个 storage 分区,然后 uboot 刷回原厂固件。 系统启动后打开无线宝 app,存储设置内置存储为本地网盘,然后直接恢复出厂,启动后再进入 app 设置内置存储为智能加速服务。

uboot 支持 kernel 固定 6M 大小的 OP factory.bin 固件,如大雕的 QWRT factory.bin 固件。
OP 仅需要分区表有 0:HLOS、rootfs 即可。

uboot使用

uboot使用

电脑网线接路由器 lan 口,电脑 ip 设置 192.168.1.2/24,然后路由器上电,按住 reset 按键不放,LED 灯红色会闪烁 5 次,然后 LED 灯会变蓝色。
LED 变蓝色说明 uboot failsafe webui 已经开启,浏览器打开登录地址 192.168.1.1。建议关闭所有网页,重新打开浏览器去打开 192.168.1.1,避免出错。
上传文件点击更新后,LED 灯蓝色闪烁,此时后台在上传文件并更新,更新完后出现 UPDATE IN PROGRESS 页面,同时 LED 灯会变绿 3 秒,没亮绿灯的是不成功,刷新浏览器 192.168.1.1 重新上传并更新。
【注意】个别机友反映刷 uboot 后设置固定 ip 进不来 uboot 的 webui。这个可能是网卡和 uboot 的驱动不兼容,此时可尝试将网卡速率的自动协商手动修改为 10M 全双工,再尝试访问 webui。刷好固件后再修改回自动协商。

uboot 页面下方 version:2024.05.10_12:22:07 是编译时间。
uboot 更新 gpt 后,建议进系统 SSH 登录再输入命令保存下分区表:

echo -e 'w' | fdisk /dev/mmcblk0

其实保存分区表更建议用 sgdisk 或 gdisk,不过一般固件没有集成需要自行安装:

sgdisk -e /dev/mmcblk0

进入 uboot webui 更新固件:支持 kernel 为 6MB 大小的 factory.bin 和官方原厂固件 JDCOS-JDC02。
http://192.168.1.1
更新 ART:
http://192.168.1.1/art.html
更新 CDT:上传 CDT 文件需要大于 10KB
http://192.168.1.1/cdt.html
更新 IMG:可更新 GPT 分区表或者 EMMC IMG 镜像
http://192.168.1.1/img.html
更新 U-BOOT:
http://192.168.1.1/uboot.html
注意:上传文件点击更新后,蓝灯会闪烁,然后更新成功后绿灯会亮 3 秒,没有亮绿灯的不成功,刷新浏览器 192.168.1.1 重新上传并更新。建议关闭所有网页,重新打开浏览器去打开 192.168.1.1,避免出错。

5.新建storage分区并格式化挂载

新建storage分区并格式化挂载

我刷分区表和新建分区使用到 sgdisk,但原厂系统安装插件报错。
所以刷好 uboot 后直接 uboot 刷第三方 OP factory.bin 固件,固件启动后,先手动安装 sgdisk,当然在线安装也可。

上传 sgdisk 文件夹中的 ipk 到 /tmp 文件夹,然后用下面命令安装:如果按照有了掠过

opkg install /tmp/sgdisk_1.0.6-1_aarch64_cortex-a53.ipk

接着使用下面命令,新建 storage 分区(亚瑟、雅典娜,太乙,太乙 plus,哪吒,后裔 == 带 emmc 的后面需要分区的都可以使用使用同一个命令即可):

sgdisk -e -n 0:0:0 -c 0:storage -t 0:1B1720DA-A8BB-4B6F-92D2-0A93AB9609CA -p /dev/mmcblk0

新建完成后输入下面指令刷新 emmc 分区表

partprobe /dev/mmcblk0

刷新完下面的格式化新建的分区

mkfs.ext4 $(blkid -t PARTLABEL=storage -o device)

格式化完然后手动挂起来,QWRT 的话重启会自动挂的,或你手动设置 挂载点哪里找到挂起来

已经格式化了 storage 分区,这里直接新建文件夹并挂载即可。

mkdir /mnt/mmcblk0p27

mount -t ext4 /dev/mmcblk0p27 /mnt/mmcblk0p27

启用交SWAP交换分区

启用交SWAP交换分区

另外需要开启的 swap 交换分区的继续看

swapoff $(blkid -t PARTLABEL=swap -o device)
mkswap $(blkid -t PARTLABEL=swap -o device)
swapon $(blkid -t PARTLABEL=swap -o device)

swapoff 命令如果 swap 分区已经卸载,会报错,这是正常的,不用管:failed to swapoff /dev/mmcblk0p26 (-1)

如果需要跑分,则不用在这里修复 swap 分区,可以直接往下看,恢复 plugin、log、swap 分区。
因为保留了双分区,所以刷 uboot 和 gpt 之后还是支持原厂系统的。
原厂系统升级会覆盖另外一个系统分区,如此反复。第三方 OP 一般是单分区固件,只在第一个系统分区升级,不会覆盖第二个系统分区。

恢复官方分区

需要跑分恢复官方分区

回官方原厂直接 uboot 刷回即可,但是要跑分需要恢复跑分的分区。
刷回原厂后想要再刷第三方 OP 则直接 uboot 刷即可,不需要其他操作了,可以自由切换。

可以将要恢复的分区文件拷贝到 USB 设备然后刷回,我这里以上传到 /mnt/mmcblk0p27 挂载点为例。

WinSCP 之类软件上传下面 3 个备份文件到 /mnt/mmcblk0p27
mmcblk0p24_log.bin
mmcblk0p25_plugin.bin
mmcblk0p26_swap.bin

使用下面命令刷回:

dd if=/dev/zero of=$(blkid -t PARTLABEL=0:ETHPHYFW -o device) conv=fsync
dd if=/mnt/mmcblk0p27/mmcblk0p24_plugin.bin of=$(blkid -t PARTLABEL=plugin -o device) conv=fsync
dd if=/mnt/mmcblk0p27/mmcblk0p25_log.bin of=$(blkid -t PARTLABEL=log -o device) conv=fsync
swapoff $(blkid -t PARTLABEL=swap -o device)
dd if=/mnt/mmcblk0p27/mmcblk0p26_swap.bin of=$(blkid -t PARTLABEL=swap -o device) conv=fsync
swapon $(blkid -t PARTLABEL=swap -o device)

第 1 个命令如果 swap 分区已经卸载,会报错,这是正常的,不用管:failed to swapoff /dev/mmcblk0p26 (-1)
第 2 个命令 dd 像 mmcblk0p23 没有空间,这是正常的,不用管:error writing '/dev/mmcblk0p23': No space left on device
其他几个个命令没有报错即可。

恢复完分区后可以删除文件,重启下就行。

如果后面要回原厂跑分,进入 uboot 直接刷原厂固件。
系统启动后打开无线宝 app,存储设置内置存储为本地网盘,然后直接恢复出厂,启动后再进入 app 设置内置存储为智能加速服务。
恢复智能跑分服务后可能无线宝 app 中的服务状态一直在自动修复,灯是蓝色的不能马上变绿灯,需要等待,我试的情况是有可能需要 1-2 个小时才恢复绿灯。
如果刷回原厂超过 2 小时跑分服务一直在修复,可以尝试重新刷 log、plugin、swap 分区。
再重试设置内置存储为本地网盘,然后直接恢复出厂,启动后再设置内置存储为智能加速服务。
如何恢复分区回原厂快速开始跑分,我没有摸索出规律,所以得大家自己多尝试。

##【刷分区表的一点小提示】##
建议用 fdisk、gdisk 之类的进行修改分区。
如果不慎修改后系统不能启动,可以进入 uboot,浏览器输入 http://192.168.1.1/img.html 重新刷正常的 gpt 分区表即可。

如果 uboot 或系统中更换了其他分区表,但不需要使用前面的 sgdisk 命令新建分区并保存分区表。
这样则建议在系统中使用 fdisk 或者 sgdisk(一般需要先安装)单独保存下分区表:
例如系统中单独写 gpt 分区表:

dd if=/tmp/gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync

则建议保存下分区表:

echo -e 'w' | fdisk /dev/mmcblk0

或者

sgdisk -e /dev/mmcblk0

##【关于分区表不包含最后那个大分区的原因】##
gpt 分区表的最大扇区数不能大于 EMMC 的物理最大扇区数,小于等于则没问题。比如 128G 的 EMMC 刷 64G 的分区表可以,刷 256G 的分区表会出错。
MT798X EMMC 机子的 bl2 在 boot0 硬件分区,不受 userdata 硬件分区的 gpt 分区表影响,即使 gpt 坏了也可以启动 uboot,所以比较抗揍。
比如百里测试刷最大扇区数大于 EMMC 扇区数的分区表也能启动 uboot,只是固件启动会报错,可以进 uboot 重新刷正常的分区表。
不过高通 IPQ60XX EMMC 机子 SBL 是在 userdata 硬件分区中由 gpt 分区表划分出来的第一个软件分区,会受到 gpt 分区表的影响。
比如京东云 AX1800 Pro 亚瑟测试直接刷最大扇区数大于 EMMC 扇区数的分区表会砖,需要 USB 救砖。

同时如果最后一个大的分区超过了 EMMC 的扇区数,fdisk、parted、gdisk 这些工具并不能直接修复,仍然需要删除新建。

基于这两个原因,我改的分区表都采用天灵大佬的 gpt 分区表的做法,不保留最后一个最大的分区了,即 no-last-partition。
这样的分区表只包含前面的小分区,扇区总数是小于 4G,所以适用所有大于 4G 的 EMMC。
注意:因为雅典娜 rootfs 2048M 已经超过 4G,所以如果自行更换 eMMC 使用雅典娜 rootfs 2048M 分区表的,建议使用 8G 及以上的 eMMC。
刷好 no-last-partition 分区表后,使用 sgdisk 用未分配空间新建一个分区,并还原分区的 type code。

6.USB 9008救砖

USB 救砖不是万能,只有特定情况可以不拆机。
可以不拆机的情况:
只要变砖后使用双公头 USB-A 线(有 Tpye-C 接口的也可以用一头 Tpye-C 一头 USB-A 数据线)接路由器和电脑,电脑设备管理器显示 QUSB 或 Qualcomm HS-USB QDLoader 9008 的,就可以直接救砖。会导致变砖路由器直接进入高通 9008 模式的情况:
1. 刷坏 gpt 分区表,导致不能启动 SBL1,只擦除 gpt 的话会使用 EMMC 最后 33 个扇区保存的备份 gpt 启动,不会砖;
2. 擦除或者刷其他文件(非 ipq60xx 系列 SBL1)到 SBL1 分区,QSEE、DEVCFG、RPM 这个分区同理,不过这个几个没什么刷的;
3. 擦除 uboot 分区(即 0:APPSBL 分区)或者刷了其他文件(非 ipq60xx 系列 uboot)到该分区;
4. 擦除 cdt 分区(即 0:CDT 分区)或者刷了非 cdt 文件到该分区。
需要拆机短接电阻进入高通 9008 模式的情况:
1. 刷错了 ipq60xx 系列 uboot(如 ax5_jdc gl-ax1800 uboot)到 uboot 分区,这种情况会启动 SBL1 加载 uboot,导致不能直接进 9008,要拆机用镊子短接启动电阻焊盘,才可以进 9008;
2. 刷错了 cdt(如 ax5_jdc gl-ax1800 cdt)到 cdt 分区。

详见 USB 救砖教程压缩包。

升级改内存 刷 CDT

3gcdt-JDC_AX6600_Athena_1024M32_DDR4.bin

3gcdt-JDC_AX6600_Athena_1024M32_DDR4.bin

wget https://godsun.pro/upload/3gcdt-JDC_AX6600_Athena_1024M32_DDR4.bin && dd if=3gcdt-JDC_AX6600_Athena_1024M32_DDR4.bin of=/dev/mmcblk0p10 && dd if=3gcdt-JDC_AX6600_Athena_1024M32_DDR4.bin of=/dev/mmcblk0p11


评论