解包HIT archive data格式system.img,解决ubiattach: error!: cannot attach mtd0 error 22问题

来源:互联网 发布:vscode js插件 编辑:程序博客网 时间:2024/06/08 10:25

最近搞到了一些最新的mtk 刷机包,需要解包system.img ,最新的包格式采用的是HIT archive data,与以往的完全不一样

这里就不罗嗦,直接上解法:

我的测试环境ubuntu10.04 ,bt5;

1,创建一个需要被挂在的目录

# mkdir /mnt/system

2,载入mtd模块

# modprobe mtdblock

3,载入ubi模块(前提你的linux环境以支持ubi模块)

# modprobe ubi
4,载入nandsim来模拟nand设备

# modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15
5,检查加入模块的环境

# cat /proc/mtd
dev:    size   erasesize  namemtd0: 10000000 00020000 "NAND simulator partition 0"

# ls -la /dev/mtd*
crw-rw---- 1 root root 90, 0 2013-08-17 20:02 /dev/mtd0crw-rw---- 1 root root 90, 1 2013-08-17 20:02 /dev/mtd0robrw-rw---- 1 root disk 31, 0 2013-08-17 20:03 /dev/mtdblock0

6,把system.img直接载到mtd的块设备

dd if=system.img of=/dev/mtdblock0 bs=2048
以上步骤一般都可以顺利进行下去

7,在这里 需要安装mtd-utils工具箱(ubuntu下 直接apt-get install mtd-utils),这一步是将ubi模块与已载入了system.img的mtd模块关联

# ubiattach /dev/ubi_ctrl -m 0
在这里 很多Linux环境会不成功,提示

ubiattach: error!: cannot attach mtd0           error 22 (Invalid argument)

此时 可以通过查看dmesg,可以看到

UBI error: validate_ec_hdr: bad VID header offset 2048, expected 512UBI error: validate_ec_hdr: bad EC headerUBI error: ubi_io_read_ec_hdr: validation failed for PEB 0
预期512开始的header,实际是2048

我们修改 为

# ubiattach /dev/ubi_ctrl -m 0 -O 2048

到这里,模块载入成功

UBI device number 0, total 2048 LEBs (264241152 bytes, 252.0 MiB), available 0 LEBs (0 bytes), LEB size 129024 bytes (126.0 KiB)
8,挂载该模块到指定目录就OK
# mount -t ubifs ubi0_0 /mnt/system/
以上内容借鉴于
http://wiki.network-crawler.de/index.php/Mount_ubifs
http://www.linux-mtd.infradead.org/faq/ubi.html

此处于2013-11-6 更新

最近有朋友在模块载入时出现载入不成功的情况,查看问题

UBI error: validate_ec_hdr: bad data offset 8192, expected 6144
UBI error: validate_ec_hdr: bad EC header

先说说原因:因为初始化nandsim 大小和块大小(即上面的modprobe nandsim)时 定义的块大小使用了默认的 2048,所以 当我们的system.img 所需的块大小为4096时

无论怎么载入 都无法载入成功!

此时我们可以修改modprobe nandsim 为

modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x16
此时的nandsim 块大小为4096

这样的话 ubiattach 载入不成功的问题就能解决掉了

注: Linux 内核在2.6.32及以下版本 nandsim块大小最大支持不超过2048 所以 要解这种4096的system.img 必须在内核高于2.6.32的Linux环境中