trx和dd-wrt的firmware制作
早年写的笔记,压箱底了,翻出来晒晒
目 录
step2制作squashfsroot file system..2
dd-wrt的firmware制作步骤
在DD WRT中firmware的制作命令是:
../tools/trx -odd-wrt.v24_2.trx ./loader-0.02/loader.gz ../src/router/mipsel-uclibc/vmlinuztarget.squashfs
从上面的命令可以得知,需要先制作好3个文件:loader.gz,vmlinuz和target.squashfs. loader.gz是系统自带的。
step1 制作vmlinuz
vmlinux是linux编译出来的初次结果。
后期处理如下:
cp /home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggymipsel-uclibc/vmlinux
../../opt/loader-0.02/lzma e -lc2 -lp2 -pb2-d21 mipsel-uclibc/vmlinux mipsel-uclibc/vmlinuz
这样就得到vmlinuz。
另外一种方式得到vmlinuz,不过后面并没有使用。
./loader-0.02/lzma e ../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggyvmlinuz
./loader-0.02/lzma e../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggy vmlinuzmicro
step2制作squashfs root file system
install_mini.v24_2.sh找到下面一句:
../src/linux/brcm/linux.v24_2/scripts/squashfs/mksquashfs-lzma../src/router/mipsel-uclibc/target target.squashfs -noappend -root-owned –le
mksquashfs-lzma的命令语法
SYNTAX:./mksquashfs-lzma source1 source2... dest [options] [-e list of exclude
dirs/files]
这个说明target.squashfs是用mksquashfs-lzma对/src/router/mipsel-uclibc/target目录下的文件压缩而成的。
step3制作trx
../tools/trx -o dd-wrt.v24_2.trx./loader-0.02/loader.gz ../src/router/mipsel-uclibc/vmlinuz target.squashfs
cp dd-wrt.v24_2.trx/GruppenLW/dd-wrt.v24_mini_generic.bin。
所以bin和trx就是同一个东西。
trx的用法
# ./trx
Error [0] : noinput files
usage: trx[options] [-b offset] [file] [-b offset] [-x start] [file] ...
options:
-h, --help This message
-o, --output Output stream (default stdout)
-f, --flag Flags (noheader)
-b, --offset Offset of file within output stream or
0 for immediately afterthe previous file
-x, --start Start of binary (used by USB RDLcode)
完整的制作脚本
如果是烧录到belkin8230上,还需要在文件头前面加上32bytes的pattern。需要使用addpattern命令。
addpattern命令执行后的打印信息是:
# ./addpattern-i dd-wrt.v24_2.trx -o 8230_pt.bin -p W54U
---------- addcode pattern --------
input file is[dd-wrt.v24_2.trx]
output file is[8230_pt.bin]
code pattern is[W54U]
Makedate==>Year:2009,Month:9,Day:20,Hour:21,Min:31,Sec:42
Firmware version=>v4.20.7
利用addpattern生成的bin文件头和以前看到的别的有所不同,但是都是W54U,是可以正常升级的。不同如下图:
利用下面的脚本可以生成8230能用的bin文件8230_pt.bin
./mksquashfs-lzma./squashfs-root target.squashfs -noappend -root-owned -le
./trx -odd-wrt.v24_2.trx loader.gz vmlinuz target.squashfs
./addpattern -idd-wrt.v24_2.trx -o 8230_pt.bin -p W54U
target.squashfs的操作
上面已经讲到target.squashfs制作,下面讲讲target.squashfs的解压。有了这两个操作方法,就可以随意修改root filesystem。
虽然同样是squash-lzma格式,openwrt的mksquashfs-lzma和unsquashfs-lzma和DDWRT的并不一样。所以无法使用openwrt中已经编译好的unsquashfs-lzma来进行解压target.squashfs。DDWRT当中
打开squashfs-tools/makefile
将all:mksquashfs-lzma unsquashfs 修改为
all: mksquashfs-lzma unsquashfs unsquashfs-lzma
另外加上
unsquashfs-lzma: unsquashfs.o
$(CXX)unsquashfs.o -L$(LZMAPATH) –llzma -lpthread -o $@
这样编译完了就好了。编译好的unsquashfs-lzma可以解压ddwrt的target.squashfs。
TRX问题
trx的操作是将几个文件合成,并且加上文件头。在本例中的命令如下:
./trx -o dd-wrt.v24_2.trx loader.gz vmlinuztarget.squashfs
比较dd-wrt.v24_2.trx和loader.gz
前面有一些文件头的差别。
在从0x1c到0x9a5处loader.gz就结束了。一共2442bytes
0x1c=280x9a5=2469 2469-28+1=2442
loader.gz大小也是2442bytes
对比后面和vmlinuz对比。
从0x9a8到0x9fe69为vmlinuz完全相同的内容。vmlinuz大小为652,482bytes
0x9a8= 2472 0x9fe69=654953
654953 – 2472 +1=652,482
vmlinuz和loader.gz空出了2byte的0x0
再对比target.squashfs
从0x9fe6c到0x2c96ec为target.squashfs完全相同的内容。target.squashfs大小为2,269,184bytes
0x2c96ec- 0x9fe6c +1=0x229881 = 2267264
这个好像不对。
在dd-wrt.v24_2.trx中0x 2c96c9是最后一个非0数字,计算看看。
2c96c9- 9fe6c + 1=0x22985e = 2267230
在suqashfs当中,0x 22985d是最后一个非0数字这么算起来,suqashfs的有效长度为0x 0x22985d + 1 = 0x2267230.
从写操作可以看出,trx先加入了一个28bytes的文件头,然后在相连的两个文件当中插入两个byte的0x0.
疑问:
1. 系统如何识别组合文件
2. 连续两个0x00是否就是文件分割符?其他地方有没有连续的两个0x0.
发现loader.gz有连续的4个0出现。
那么系统是根据什么来切分文件的?除了文件头以外,组合文件没有任何其他独立的内容。
0x1c在文件头中发现,,这个是第2个文件的开始
0x9a8也在文件头中发现,这个是第2个文件的开始
9fe6c在文件头中发现,这个是第3个文件的开始
如果把4bytes作为一个地址来读的话就比较清楚了。
用find命令在整个dd-wrt文件夹搜索trx。
找到asustrx.c,定义的结构体如下
struct trx_header {
uint32_tmagic; /*"HDR0" */
uint32_tlen; /* Length of fileincluding header */
uint32_tcrc32; /* 32-bit CRCfrom flag_version to end of file */
uint32_tflag_version; /* 0:15 flags, 16:31version */
uint32_toffsets[3]; /* Offsets of partitionsfrom start of header */
};
#define TRX_MAGIC 0x30524448 /*"HDR0" */
#define TRX_VERSION 1
#define TRX_MAX_LEN 0x3A0000
#define TRX_NO_HEADER 1 /*Do not write TRX header */
第一个是magic。第二个是整个文件的长度,是0x2ca0。第三个是CRC。