准备刷机文件和工具软件

SSH工具软件:Xshell https://pan.lanzoui.com/b0f19ry9g 或者putty https://www.423down.com/11333.html
文件传输工具软件:WinSCP https://winscp.net/eng/index.php
下载仓库中的刷机文件压缩包,里面包含了需要的刷机文件。

开启SSH

百里没有软破解SSH,是通过在原厂固件升级官方的原生OP获取SSH权限再刷第三方OP的。
在原厂系统下,升级原生OP:
openwrt-re-cp-03-4.1.0.r4005-1287bf0122329d5c3acbb7198e04b1e4.bin
注意:升级原生OP官方宣传会失去保修。

image-20240909110548815

image-20240909110610378

image-20240909110631920

重启后,SSH登录192.168.68.1,端口22,用户名root,没有密码。
输入命令删除这两个环境变量:

fw_setenv jdc_crc_version
fw_setenv jdc_opp_version

image-20240909111022922

image-20240909111122338

备份原厂分区

只需要备份到mmcblk0p12 swap即可,最后一个mmcblk0p13 storage分区太大不备份了。
因为plugin、swap分区都有1G,比较大,所以备份到/mnt/mmcblk0p13中,然后使用WinScp登录再下载下来。
WinScp软件登录路由,协议SCP,IP 192.168.68.1,端口22。
WinScp下载大文件提示主机超过15秒无通信,需要点击高级,高级站点设置-连接 去掉勾选“优化连接缓冲大小”,再点击登录。

提示:bl2在/dev/mmcblk0boot0,uboot在fip分区。
unpartitioned.bin是全0的空白文件,是为了后面可以使用备份的分区按顺序直接合并得到一个eMMC img镜像。
除更换eMMC,这个img基本用不到,不过还是全部分区备份为好。

直接复制下面全部命令,粘贴执行即可,等待执行完成:

dd if=/dev/mmcblk0boot0 of=/mnt/mmcblk0p13/mmcblk0boot0_bl2.bin conv=fsync
dd if=/dev/mmcblk0p1 of=/mnt/mmcblk0p13/mmcblk0p1_PMBR.bin conv=fsync
dd if=/dev/mmcblk0 bs=512 skip=34 count=8158 of=/mnt/mmcblk0p13/mmcblk0p1_unpartitioned.bin conv=fsync
dd if=/dev/mmcblk0p2 of=/mnt/mmcblk0p13/mmcblk0p2_u-boot-env.bin conv=fsync
dd if=/dev/mmcblk0p3 of=/mnt/mmcblk0p13/mmcblk0p3_factory.bin conv=fsync
dd if=/dev/mmcblk0p4 of=/mnt/mmcblk0p13/mmcblk0p4_fip.bin conv=fsync
dd if=/dev/mmcblk0p5 of=/mnt/mmcblk0p13/mmcblk0p5_kernel.bin conv=fsync
dd if=/dev/mmcblk0p6 of=/mnt/mmcblk0p13/mmcblk0p6_rootfs.bin conv=fsync
dd if=/dev/mmcblk0p7 of=/mnt/mmcblk0p13/mmcblk0p7_kernel2.bin conv=fsync
dd if=/dev/mmcblk0p8 of=/mnt/mmcblk0p13/mmcblk0p8_rootfs2.bin conv=fsync
dd if=/dev/mmcblk0p9 of=/mnt/mmcblk0p13/mmcblk0p9_rootfs_data.bin conv=fsync
dd if=/dev/mmcblk0p10 of=/mnt/mmcblk0p13/mmcblk0p10_log.bin conv=fsync
dd if=/dev/mmcblk0p11 of=/mnt/mmcblk0p13/mmcblk0p11_plugin.bin conv=fsync
dd if=/dev/mmcblk0p12 of=/mnt/mmcblk0p13/mmcblk0p12_swap.bin conv=fsync

执行完后使用WinSCP之类的软件登录路由器,到/mnt/mmcblk0p13下载文件保存到电脑。

image-20240909111453006

刷bl2和单分区uboot

百里的bl2和uboot是开启了Secure Boot验证的,需要把bl2和uboot所在fip分区一起替换掉,不能只替换uboot!!!
因为有些数据洁癖,我直接将编译得到的bl2二进制文件尾部填充0扩大至256KB,fip尾部填充0至2048KB。
这样刷文件就可直接覆盖有数据部分,和清空分区再刷是一样,所以文件看着有点大。
直接使用编译得到的原始文件也没问题,只是文件大小不一,原分区上可能有点多余数据不会被覆盖,这也不影响使用。

mt7986_jdcloud_re-cp-03-bl2_mod.binmt7986_jdcloud_re-cp-03-fip_mod.bin上传tmp文件夹,SSH输入命令验证md5:

md5sum /tmp/mt7986_jdcloud_re-cp-03*_mod.bin

我这个2024.04.05版的bl2、uboot,md5值是这样:

root@OpenWrt:~# md5sum /tmp/mt7986_jdcloud_re-cp-03-*_mod.bin
ba6edf33d825811ddabc11b54312cccd  /tmp/mt7986_jdcloud_re-cp-03-bl2_mod.bin
cc78be76b99ed27ed6e8a6f7cef112c2  /tmp/mt7986_jdcloud_re-cp-03-fip_mod.bin

核对md5正常后,输入命令刷写bl2和uboot,命令全部复制一起执行:

ash
echo 0 > /sys/block/mmcblk0boot0/force_ro
dd if=/tmp/mt7986_jdcloud_re-cp-03-bl2_mod.bin of=/dev/mmcblk0boot0 conv=fsync
echo 1 > /sys/block/mmcblk0boot0/force_ro
dd if=/tmp/mt7986_jdcloud_re-cp-03-fip_mod.bin of=$(blkid -t PARTLABEL=fip -o device) conv=fsync

image-20240909112158623

刷写完没有报错,则检查下分区的md5值,和我一样即可,不一样就重新刷,不能重启!!

md5sum /dev/mmcblk0boot0 && md5sum $(blkid -t PARTLABEL=fip -o device)

输出结果和我一样即可:

root@OpenWrt:~# md5sum /dev/mmcblk0boot0 && md5sum $(blkid -t PARTLABEL=fip -o device)
57b4fda67b6ef534f50fa5b7f1f15be4  /dev/mmcblk0boot0
cc78be76b99ed27ed6e8a6f7cef112c2  /dev/mmcblk0p4

到这里bl2和单分区uboot已经刷好了,不要重启,接着刷单分区gpt分区表。

刷单分区gpt分区表

原生OP没有sgdisk,刷单分区gpt分区表前,首先安装sgdisk以便后面编辑分区表。
将sgdisk文件夹里面的sgdisk_1.0.6-1_aarch64_cortex-a53.ipk上传tmp文件夹,然后SSH运行下面命令安装:
opkg install -d root /tmp/sgdisk_1.0.6-1_aarch64_cortex-a53.ipk

image-20240909112506647

分区表文件夹中的gpt文件,rootfs512M对应rootfs是512MB大小,依次类推。
这个rootfs就是固件+overlay的大小,overlay近似是刷固件后剩余软件包空间大小,选择自己需要的rootfs大小的分区表即可。

上传你需要rootfs大小的gpt分区表文件到tmp文件夹,先验证md5:

md5sum /tmp/jdcloud_re-cp-03_single-boot_rootfs*M_no-last-partition-gpt.bin
root@OpenWrt:~# md5sum /tmp/jdcloud_re-cp-03_single-boot_rootfs*M_no-last-partition-gpt.bin
234744da27ad54233bc3d528b05443a1  /tmp/jdcloud_re-cp-03_single-boot_rootfs512M_no-last-partition-gpt.bin
e120108dbfd143dc2b92d0ed8ad0e7f2  /tmp/jdcloud_re-cp-03_single-boot_rootfs1024M_no-last-partition-gpt.bin
514797957059d0a808a3ab53327d79c4  /tmp/jdcloud_re-cp-03_single-boot_rootfs2048M_no-last-partition-gpt.bin

你上传的文件的md5信息和上面对应文件的md5对比,没问题即可。
接着修改下面命令中的gpt文件名为你上传的文件名,然后复制命令粘贴一起执行:

dd if=/tmp/jdcloud_re-cp-03_single-boot_rootfs512M_no-last-partition-gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync && \
sgdisk -e -n 0:0:0 -c 0:storage -t 0:0FC63DAF-8483-4772-8E79-3D69D8477DE4 -u 0:5D18C072-ADB3-412B-BF95-37617B01ADF8 -p /dev/mmcblk0

image-20240909113355892

root@OpenWrt:~# md5sum /tmp/jdcloud_re-cp-03_single-boot_rootfs*M_no-last-partition-gpt.bin
514797957059d0a808a3ab53327d79c4  /tmp/jdcloud_re-cp-03_single-boot_rootfs2048M_no-last-partition-gpt.bin
root@OpenWrt:~# dd if=/tmp/jdcloud_re-cp-03_single-boot_rootfs512M_no-last-partition-gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync && \
> sgdisk -e -n 0:0:0 -c 0:storage -t 0:0FC63DAF-8483-4772-8E79-3D69D8477DE4 -u 0:5D18C072-ADB3-412B-BF95-37617B01ADF8 -p /dev/mmcblk0
dd: can't open '/tmp/jdcloud_re-cp-03_single-boot_rootfs512M_no-last-partition-gpt.bin': No such file or directory
root@OpenWrt:~# dd if=/tmp/jdcloud_re-cp-03_single-boot_rootfs2048M_no-last-partition-gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync && \
> sgdisk -e -n 0:0:0 -c 0:storage -t 0:0FC63DAF-8483-4772-8E79-3D69D8477DE4 -u 0:5D18C072-ADB3-412B-BF95-37617B01ADF8 -p /dev/mmcblk0
34+0 records in
34+0 records out
Setting name!
partNum is 8
Disk /dev/mmcblk0: 119783424 sectors, 57.1 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 2BD17853-102B-4500-AA1A-8A21D4D7984D
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 119783390
Partitions will be aligned on 1024-sector boundaries
Total free space is 8158 sectors (4.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            8192            9215   512.0 KiB   8300  u-boot-env
   2            9216           13311   2.0 MiB     8300  factory
   3           13312           17407   2.0 MiB     8300  fip
   4           17408           50175   16.0 MiB    8300  kernel
   5           50176         4244479   2.0 GiB     8300  rootfs
   6         4244480         4378623   65.5 MiB    8300  log
   7         4378624         6475775   1024.0 MiB  8300  plugin
   8         6475776         8572927   1024.0 MiB  8300  swap
   9         8572928       119783390   53.0 GiB    8300  storage
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

dd写入没有报错,sgdisk最后输出successfully即可,有错误则及时排错,重新刷。
检查第5分区rootfs是分区表设置的大小,比如rootfs512M的分区表rootfs就是512MB。
检查第9分区storage大小接近整个EMMC大小,比如128G EMMC,storage分区有112GB左右。

建议此时备份下载修改后的分区表,以后有问题进不了系统,可以直接uboot刷这个分区表。
当然刷no-last-partition的分区表后再新建分区也行,一样的。

dd if=/dev/mmcblk0 bs=512 count=34 of=/tmp/mmcblk0_GPT_sgdisk.bin

都没有问题可以断电,按reset上电进uboot刷固件了。

uboot刷固件和格式化data分区

这个uboot不支持DHCP,电脑需要设置ip 192.168.1.2/24,连接网线到路由器lan口,路由上电按reset,等待灯变为蓝色,说明uboot webui已启动,可以松开按钮,浏览器打开192.168.1.1,上传固件刷写成功后绿灯会亮3秒,然后重启。注意:其他大佬的uboot可能指示灯不一样。
这个uboot是2024.04.05编译的 U-Boot 2022.07-rc3 (Apr 05 2024 - 16:00:44 +0800)
uboot不仅可以刷固件,还可以更新bl2、uboot和gpt,打开相应网页即可,非不要不需要更新:
http://192.168.1.1/bl2.html
http://192.168.1.1/uboot.html
http://192.168.1.1/gpt.html

uboot刷好第三方OP系统后,先SSH格式化下最后一个storage分区。

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

image-20240909114659000

image-20240909114713624

完成

image-20240909115800776