1. 程式人生 > >解包HIT archive data格式system.img,解決ubiattach: error!: cannot attach mtd0 error 22問題

解包HIT archive data格式system.img,解決ubiattach: error!: cannot attach mtd0 error 22問題

最近搞到了一些最新的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  name
mtd0: 10000000 00020000 "NAND simulator partition 0"
# ls -la /dev/mtd*
crw-rw---- 1 root root 90, 0 2013-08-17 20:02 /dev/mtd0
crw-rw---- 1 root root 90, 1 2013-08-17 20:02 /dev/mtd0ro
brw-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 512
UBI error: validate_ec_hdr: bad EC header
UBI 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/
以上內容借鑑於

此處於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環境中