嵌入式linux的固件提取,通过本文可以知道linux系统固件的制作,编译不是唯一途径,完全可以通过DD命令进行磁盘镜像,然后打包转换成固件使用。本文使用的机器是瑞芯微的PX30工控路由器,是鼎桥为电梯控制生产的机器。

其他嵌入式linux操作流程类似,只要更换主板响应的的打包刷机软件即可。

 

有一个工控路由器因为刷机变砖了,网上下载不到固件,自己暂时还没有搞过编译。我找到了同型号的路由器,尝试把它的系统制作成镜像。

具体操作分为三步:

第一步,直接用DD命令备份了几个分区,分区名我暂时还不知道,直接用分区编号命名:

dd if=/dev/mmcblk1p1  of=/media/usb0/mmcblk1p1
dd if=/dev/mmcblk1p2  of=/media/usb0/mmcblk1p2
dd if=/dev/mmcblk1p3  of=/media/usb0/mmcblk1p3
dd if=/dev/mmcblk1p4  of=/media/usb0/mmcblk1p4
dd if=/dev/mmcblk1p5  of=/media/usb0/mmcblk1p5
dd if=/dev/mmcblk1p6  of=/media/usb0/mmcblk1p6
dd if=/dev/mmcblk1p7  of=/media/usb0/mmcblk1p7
dd if=/dev/mmcblk1p8  of=/media/usb0/mmcblk1p8
dd if=/dev/mmcblk1p9  of=/media/usb0/mmcblk1p9
dd if=/dev/mmcblk1p10  of=/media/usb0/mmcblk1p10
dd if=/dev/mmcblk1p11  of=/media/usb0/mmcblk1p11

 

 

第二步,准备MiniLoaderAll.bin和parameter.txt

我通过解包同型号芯片的固件得到了MiniLoaderAll.bin 文件,这个文件应该是同型号ARM芯片通用的文件,运行在存储芯片旁边做第一步引导用。解包同时得到了parameter.txt分区表文件,这个分区表不能直接使用,因为每个固件的分区特色是不一样的,但是它可以作为模板使用,直接修改里面的分区数据即可。关于分区数据的提取,可以通过fdisk -l  命令,lsblk命令,ls -al /dev/block 等命令获取,parameter.txt 内的分区参数都是扇区数(通过16进制描述的),需要注意字节数和扇区数的换算,每个扇区(sector)的字节数可以通过以上命令获取,我的是512,那么扇区数就应该是 字节数 除 512 ,然后再换算成16进制。这个字节转换可以搜到相应的文章,嵌入式系统存储系统都是用扇区数描述的。

这一步我用的解包软件是AndroidTool_v2.58  ,是从这个网站下载到的刷机包和解包软件 https://www.t-firefly.com/doc/download/67.html

它的升级版本RKDevTool_Release_v2.96_zh也可以的。软件的打包,解包,请搜索,有详细的文章。

我是直接冒险了一下,给正常的机器刷入了一个引导可以中断的uboot,用uboot下的命令获取到了详细的分区数据。经过修改我的parameter.txt文件是这样的:

 

FIRMWARE_VER: 8.1
MACHINE_MODEL: PX30
MACHINE_ID: 007
MANUFACTURER: PX30
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: px30
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot0),0x00002000@0x00006000(uboot1),0x00002000@0x00008000(trust0),0x00002000@0x0000a000(trust1),0x00002000@0x0000c000(env),0x00002000@0x0000e000(oem),0x0000a000@0x00010000(boot0),0x0000a000@0x0001a000(boot1),0x00200000@0x00124000(system0),0x00200000@0x00324000(system1),-@0x524000(data:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

 

文件内容很多,都是这个芯片的默认值,我们只按实际分区情况更改@符号前后的数值就可以,@前的是分区的大小,@符号后的是分区起始点,得到分区信息后,我将上一部的备份镜像按顺序进行了改名。

 

 

第三步,按照打包教程进行打包,把几个分区镜像文件和MiniLoaderAll.bin   ,parameter.txt 拷贝到 AndroidTool_v2.58\rockdev\image内,同时按文件清单修改AndroidTool_v2.58\rockdev\内的package-file文件,我的文件修改后是下面这样的,最后一个分区的data.img镜像应该是客户数据,太大了,应该可以不用打包进来,我直接给注销掉了。

# NAME		Relative path
#
#HWDEF		HWDEF
package-file	package-file
bootloader	Image/MiniLoaderAll.bin
parameter	Image/parameter.txt
uboot0		image/uboot0.img
uboot1		Image/uboot1.img
trust0		image/trust0.img
trust1		image/trust1.img
env		Image/env.img
oem		Image/oem.img
boot0		Image/boot0.img
boot1		Image/boot1.img
system0		Image/system0.img
system1		Image/system1.img

#data:grow	Image/userdata.img
# 要写入backup分区的文件就是自身(update.img)
# SELF 是关键字,表示升级文件(update.img)自身
# 在生成升级文件时,不加入SELF文件的内容,但在头部信息中有记录
# 在解包升级文件时,不解包SELF文件的内容。
backup		RESERVED
#update-script	update-script
#recover-script	recover-script

 

修改好上面文件后,就可以运行里面的批处理脚本了,运行完成后打包就成功了,我的电脑打包运行了有10分钟后才完成的。

 

这个批处理脚本下载软件里面自带的,开始有一行报错,提示必须-RK开头,我修改成了-RKPX30后正常了,批处理内容是这样的:

mklink /J Image ..\..\..\..\rockdev
Afptool -pack ./ Image\update2.img

RKImageMaker.exe -RKPX30 Image\MiniLoaderAll.bin  Image\update2.img update2.img -os_type:androidos

rem update.img is new format, Image\update.img is old format, so delete older format
del  Image\update2.img

pause

 

我们可以看到脚本里调用了Afptool.exe  和 RKImageMaker.exe  ,这二个文件一定要在AndroidTool_v2.58\rockdev\内,如果没有请更换你的AndroidTool_v2.58

 

 

打包成功后,直接用AndroidTool或RKDevTool刷机,

https://wiki.t-firefly.com/en/Core-PX30-JD4/programming_firmware.html

我的路由器是开机引导时,ttl窗口内按住ctrl+b不放,就会提示进入maskrom刷机状态。这个时候,用电脑USB口链接路由器的USB口,即可提示发现硬件,关于瑞芯微刷机驱动的安装,请另外搜索。  

刷机直接选第二页的固件刷机即可,软件第一页是刷分区。

 

我通过实操得到的关键知识,有的是按分区刷机的,和上面介绍的固件刷机无关:

1. maskrom刷机状态下也可以刷分区,但是必须要和MiniLoaderAll.bin 一起刷,起始点必须要输入正确。

2. 如果按单个分区刷机,可以i最后加载parameter.txt 文件,它会对分区起始点按自己的数据进行统一矫正。

3.uboot就是我们在系统里看见的第一个分区,但是它的起始位置是有偏移的,这个路由器是4000,

4 .  MiniLoaderAll.bin 和parameter.txt 的刷分区起始点都是0,   4000偏移量以前的数据应该保持的是MiniLoaderAll.bin

5.有的机器是在开机时按ctrl+c 可以打断uboot,在uboot内可以查看分区信息等,也可以通过download 命令进入loader刷机状态。