FLASH分区图及ROM固件提取、修改及打包
2017-11-29 08:41
295 查看
链接: http://www.iytc.net/wordpress/?p=1757
挂载信息:
root@K2:~# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,noatime)
sysfs on /sys type sysfs (rw,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
/dev/mtdblock6 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlayfs (rw,noatime,lowerdir=/,upperdir=/overlay)
tmpfs on /dev type tmpfs (rw,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
debugfs on /sys/kernel/debug type debugfs (rw,noatime)
/dev/mtdblock5 on /mnt/mtdblock5 type squashfs (ro,relatime)
挂载大小:
root@K2:~# df -h
Filesystem Size Used Available Use% Mounted on
rootfs 1.0M 936.0K 88.0K 91% /
/dev/root 5.5M 5.5M 0 100% /rom
tmpfs 29.9M 3.2M 26.7M 11% /tmp
/dev/mtdblock6 1.0M 936.0K 88.0K 91% /overlay
overlayfs:/overlay 1.0M 936.0K 88.0K 91% /
tmpfs 512.0K 0 512.0K 0% /dev
/dev/mtdblock5 5.5M 5.5M 0 100% /mnt/mtdblock5
root@K2:~#
分区信息:
root@K2:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 007b0000 00010000 "firmware"
mtd5: 0067bbd2 00010000 "rootfs"
mtd6: 00100000 00010000 "rootfs_data"
地址信息(22.4.5.42官方版本,各版本地址不一样):
root@K2:~# dmesg
...
[ 1.680000] Creating 5 MTD partitions on "raspi":
[ 1.692000] 0x000000000000-0x000000800000 : "ALL"
[ 1.700000] 0x000000000000-0x000000030000 : "Bootloader"
[ 1.712000] 0x000000030000-0x000000040000 : "Config"
[ 1.724000] 0x000000040000-0x000000050000 : "Factory"
[ 1.736000] 0x000000050000-0x000000800000 : "firmware"
[ 1.748000] 0x00000018442e-0x000000800000 : "rootfs"
[ 1.756000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 1.784000] mtd: partition "rootfs_data" created automatically, ofs=0x700000, len=0x100000
[ 1.800000] 0x000000700000-0x000000800000 : "rootfs_data"
分区图:
分区是嵌套(nested)的,我们把他分成几层来看:
第0层Layer0: 对应Flash芯片,8MiB大小, 焊接在PCB上, 通过SPI连接到CPU(SoC),分区给mtd0
第1层Layer1: 把总存储空间分为了4个区,分别为bootloader(u-boot)、config、factory、firmware
第2层Layer2: 把mtd4 (固件) 进一步分割为 kernel(内核) 和 mtd5 (rootfs)。在固件的一般处理流程中,Kernel二进制文件先由LZMA打包, 然后用gzip压缩之后文件被直接写入到raw flash中而不mount到任何文件系统上
第3层Layer3: 把rootfs更进一步分割成 mtd6(rootfs_data) 和剩下的未命名部分 ,未命名部分用来容纳SquashFS-ROM分区(5.5M大小),rootfs_data挂载为/overlay,即用户配置分区,总大小为1M
要提取厂家的ROM固件,执行如下语句
dd if=/dev/mtd5 of=/tmp/fm.bin
用winscp将fm.bin传到计算机,查看大小:
如果要生成一个固件,完整的过程如下:
1、提取厂家固件
dd if=/dev/mtd5 of=/tmp/k2.bin
2、在Ubuntu中的MTK SDK的目录(~/mtk/openwrt-3.10.14/staging_dir/host)建立如下脚本文件rom.sh:
脚本权限设置为可执行
3、将k2.bin文件拷贝到~/mtk/openwrt-3.10.14/staging_dir/host目录,并执行:
./rom.sh e k2.bin
会自动将ROM部分解压到./squashfs-root目录:
4、编辑固件内容:在squashfs-root目录点右键,“以管理员权限打开”进行编辑
5、修改完成后,在~/mtk/openwrt-3.10.14/staging_dir/host目录执行:
./rom.sh c k2_new.bin
k2_new.bin即为新固件
重新生成的固件(firmware)有可能大于或小于官方固件,没有关系,rootfs_data的起始位置是根据固件大小来自动调整的,firmware大了,用户的可写空间就小了
注意:固件大小不能超出mtd4的大小( 7872KiB)
挂载信息:
root@K2:~# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,noatime)
sysfs on /sys type sysfs (rw,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
/dev/mtdblock6 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlayfs (rw,noatime,lowerdir=/,upperdir=/overlay)
tmpfs on /dev type tmpfs (rw,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
debugfs on /sys/kernel/debug type debugfs (rw,noatime)
/dev/mtdblock5 on /mnt/mtdblock5 type squashfs (ro,relatime)
挂载大小:
root@K2:~# df -h
Filesystem Size Used Available Use% Mounted on
rootfs 1.0M 936.0K 88.0K 91% /
/dev/root 5.5M 5.5M 0 100% /rom
tmpfs 29.9M 3.2M 26.7M 11% /tmp
/dev/mtdblock6 1.0M 936.0K 88.0K 91% /overlay
overlayfs:/overlay 1.0M 936.0K 88.0K 91% /
tmpfs 512.0K 0 512.0K 0% /dev
/dev/mtdblock5 5.5M 5.5M 0 100% /mnt/mtdblock5
root@K2:~#
分区信息:
root@K2:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 007b0000 00010000 "firmware"
mtd5: 0067bbd2 00010000 "rootfs"
mtd6: 00100000 00010000 "rootfs_data"
地址信息(22.4.5.42官方版本,各版本地址不一样):
root@K2:~# dmesg
...
[ 1.680000] Creating 5 MTD partitions on "raspi":
[ 1.692000] 0x000000000000-0x000000800000 : "ALL"
[ 1.700000] 0x000000000000-0x000000030000 : "Bootloader"
[ 1.712000] 0x000000030000-0x000000040000 : "Config"
[ 1.724000] 0x000000040000-0x000000050000 : "Factory"
[ 1.736000] 0x000000050000-0x000000800000 : "firmware"
[ 1.748000] 0x00000018442e-0x000000800000 : "rootfs"
[ 1.756000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 1.784000] mtd: partition "rootfs_data" created automatically, ofs=0x700000, len=0x100000
[ 1.800000] 0x000000700000-0x000000800000 : "rootfs_data"
分区图:
分区是嵌套(nested)的,我们把他分成几层来看:
第0层Layer0: 对应Flash芯片,8MiB大小, 焊接在PCB上, 通过SPI连接到CPU(SoC),分区给mtd0
第1层Layer1: 把总存储空间分为了4个区,分别为bootloader(u-boot)、config、factory、firmware
第2层Layer2: 把mtd4 (固件) 进一步分割为 kernel(内核) 和 mtd5 (rootfs)。在固件的一般处理流程中,Kernel二进制文件先由LZMA打包, 然后用gzip压缩之后文件被直接写入到raw flash中而不mount到任何文件系统上
第3层Layer3: 把rootfs更进一步分割成 mtd6(rootfs_data) 和剩下的未命名部分 ,未命名部分用来容纳SquashFS-ROM分区(5.5M大小),rootfs_data挂载为/overlay,即用户配置分区,总大小为1M
要提取厂家的ROM固件,执行如下语句
dd if=/dev/mtd5 of=/tmp/fm.bin
用winscp将fm.bin传到计算机,查看大小:
如果要生成一个固件,完整的过程如下:
1、提取厂家固件
dd if=/dev/mtd5 of=/tmp/k2.bin
2、在Ubuntu中的MTK SDK的目录(~/mtk/openwrt-3.10.14/staging_dir/host)建立如下脚本文件rom.sh:
#!/bin/sh sudo echo "Starting..." MKSQSHFS4='./bin/mksquashfs4' PADJFFS2='./bin/padjffs2' case "$1" in 'extract'|'e') offset1=`grep -oba hsqs $2 | grep -oP '[0-9]*(?=:hsqs)'` offset2=`wc -c $2 | grep -oP '[0-9]*(?= )'` size2=`expr $offset2 - $offset1` #echo $offset1 " " $offset2 " " $size2 dd if=$2 of=kernel.bin bs=1 ibs=1 count=$offset1 dd if=$2 of=secondchunk.bin bs=1 ibs=1 count=$size2 skip=$offset1 sudo rm -rf squashfs-root 2>&1 sudo unsquashfs -d squashfs-root secondchunk.bin rm secondchunk.bin ;; 'create'|'c') sudo $MKSQSHFS4 ./squashfs-root ./newsecondchunk.bin -nopad -noappend -root-owned -comp xz -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 -b 256k -processors 1 sudo chown $USER ./newsecondchunk.bin cat kernel.bin newsecondchunk.bin > $2 $PADJFFS2 $2 rm newsecondchunk.bin ;; *) echo 'run "modify-firmware.sh extract firmware.bin" You will find file "kernel.bin" and folder "squashfs-root". Modify "squashfs-root" as you like,after everything is done,run "modify-firmware.sh create newfirmware.bin" And you will get a modified firmware named newfirmware.bin. ' ;; esac
脚本权限设置为可执行
3、将k2.bin文件拷贝到~/mtk/openwrt-3.10.14/staging_dir/host目录,并执行:
./rom.sh e k2.bin
会自动将ROM部分解压到./squashfs-root目录:
4、编辑固件内容:在squashfs-root目录点右键,“以管理员权限打开”进行编辑
5、修改完成后,在~/mtk/openwrt-3.10.14/staging_dir/host目录执行:
./rom.sh c k2_new.bin
k2_new.bin即为新固件
重新生成的固件(firmware)有可能大于或小于官方固件,没有关系,rootfs_data的起始位置是根据固件大小来自动调整的,firmware大了,用户的可写空间就小了
注意:固件大小不能超出mtd4的大小( 7872KiB)
相关文章推荐
- S3c6410 linux内核移植(4)---修改flash分区
- FL2440 Flash分区修改,充分利用256M的nand flash
- 利用OpenWRT的Image Builder修改生成不同大小ROM固件 4MB改8MB 添加package自定义固件
- Desire rom - zip包提取及重新打包
- FL2440 Flash分区修改,充分利用256M的nand flash
- 记一次修改DiyBox的经历(openwrt固件解包与打包)
- A20怎么实现FLASH分区的私有数据在固件升级时不被清除
- OpenWRT的ROM固件内置软件包修改与定制
- 修改flash分区
- DB120修改适合16M Flash及分区分析
- 嵌入式 uboot修改spi-flash分区示例
- A20怎么实现FLASH分区的私有数据在固件升级时不被清除
- deb的提取,修改以及打包
- flash 提取修改工具【待学】
- OpenWRT的ROM固件内置软件包修改与定制
- 【ROM制作工具】小白如何进行ROM解包,精简,修改,授权,打包详细图文教程
- ROM的分解以及合成、BIN打包、PP修改超强rom工具osnbtool详解
- 【ROM制作工具】华为UPDATE.APP固件一键解包打包教程
- 修改高通IPQ4019/4018的flash的分区
- 设置/修改linux上的swap交换分区的方法