ILD

在ubuntu上使用nandsim来分析ubi镜像
作者:Yuan Jianpeng 邮箱:yuanjianpeng@xiaomi.com
发布时间:2022-4-19 站点:Inside Linux Development

1 安装nandsim

首先安装nandsim模块,通过模块参数可以指定要模拟的nand型号参数,这些参数决定了nand大小,page size, oob size等。


安装128MiB, 2048 bytes page的nand:

# modprobe nandsim first_id_byte=0xec second_id_byte=0xa1 third_id_byte=0x00 fourth_id_byte=0x15


安装后可以看到mtd出现了一个分区:

$ cat /proc/mtd

dev:    size   erasesize  name

mtd0: 08000000 00020000 "NAND simulator partition 0"


mtd的名字好像是不能更改。可以指定多个分区。具体可以使用 modinfo nandsim 来查看nandsim的信息。


2 写入ubi image到mtd


2.1 先擦除mtd

# flash_eraseall /dev/mtd0

flash_eraseall has been replaced by `flash_erase <mtddev> 0 0`; please use it

Erasing 128 Kibyte @ 7fe0000 -- 100 % complete


2.2 写入image

# flashcp firmware_ubi_release_6.0.47.bin /dev/mtd0


3 安装ubi ubifs 模块支持

ubi命令需要安装ubi模块。ubifs文件系统需要安装ubifs模块。

# modprobe ubi

# modprobe ubifs

# modprobe mtdblock


可以使用lsmod查看安装情况。


4 ubi attach

attach就是从mtd分区加载ubi。


# ubiattach -O 2048 -p /dev/mtd0

UBI device number 0, total 1024 LEBs (130023424 bytes, 124.0 MiB), available 998 LEBs (126722048 bytes, 120.8 MiB), LEB size 126976 bytes (124.0 KiB)


注意需要根据ubi image和nand flash的参数设置-O选项,该选项默认为512。


加载后,可以看到

# ls /sys/class/ubi/ubi0 -1

avail_eraseblocks

bad_peb_count

bgt_enabled

dev

eraseblock_size

max_ec

max_vol_count

min_io_size

mtd_num

power

reserved_for_bad

ro_mode

subsystem

total_eraseblocks

uevent

volumes_count


注意需要先安装好ubi模块,否则系统不支持ubi。attach将失败

# ubiattach -O 2048 -p /dev/mtd0

ubiattach: error!: UBI is not present in the system


attach之后,可以deattach:

# ubidetach -d 0


如果第2步写入的镜像包含ubi分区。那么attach的时候,分区也会被解析:

# ls /sys/class/ubi/

ubi0  ubi0_0  ubi0_1  version


如上ubi0有2个分区:ubi0_0/ubi0_1,可以读取分区的名字:

# cat /sys/class/ubi/ubi0_0/name

kernel


可以使用ubinfo查看ubi的信息:

# ubinfo -a /dev/ubi0

ubi0

Volumes count:                           2

Logical eraseblock size:                 126976 bytes, 124.0 KiB

Total amount of logical eraseblocks:     1024 (130023424 bytes, 124.0 MiB)

Amount of available logical eraseblocks: 849 (107802624 bytes, 102.8 MiB)

Maximum count of volumes                 128

Count of bad physical eraseblocks:       0

Count of reserved physical eraseblocks:  20

Current maximum erase counter value:     1

Minimum input/output unit size:          2048 bytes

Character device major/minor:            239:0

Present volumes:                         0, 1


Volume ID:   0 (on ubi0)

Type:        dynamic

Alignment:   1

Size:        22 LEBs (2793472 bytes, 2.6 MiB)

State:       OK

Name:        kernel

Character device major/minor: 239:1

-----------------------------------

Volume ID:   1 (on ubi0)

Type:        dynamic

Alignment:   1

Size:        127 LEBs (16125952 bytes, 15.3 MiB)

State:       OK

Name:        rootfs

Character device major/minor: 239:2


5 创建block device

ubi attach之后,ubi和ubi分区将在/dev/下创建对应的char dev

# ls /dev/ubi*

/dev/ubi0  /dev/ubi0_0  /dev/ubi0_1  /dev/ubi_ctrl


但是有些文件系统,如squashfs需要块设备。使用ubiblock可以创建块设备

# ubiblock -c /dev/ubi0_1


6 mount分区

如上分区2是一个squashfs分区,第5步创建块设备后,使用mount可以

# mount -t squashfs /dev/ubiblock0_1 rootfs/

mount: /work/test/mtkax3000flash/xiange/rootfs: WARNING: device write-protected, mounted read-only.


此时可以查看rootfs的内容:

# ls rootfs/

bin  data  data_ignor_reset  dev  etc  lib  lib64  mnt  overlay  proc  readonly  rom  root  sbin  sys  tmp  userdisk  usr  var  www


如果是ubifs。则不用第5步。直接mount,但是需要安装ubifs模块。

# mount -t ubifs ubi0_1 rootfs


参考:

http://www.linux-mtd.infradead.org/faq/nand.html


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.