UBI文件系统简介

来源:互联网 发布:淘宝的图片怎么做 编辑:程序博客网 时间:2024/06/14 04:23

UBI文件系统简介

作者:刘洪涛,华清远见嵌入式学院金牌讲师。

linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfsjffs2yaffs2等文件系统。它们也都是基于文件系统+mtd+flash设备的架构。linux-2.6.27后,内核加入了一种新型的flash文件系统UBI(Unsorted Block Images)。这里简单介绍下UBI文件系统加入的原因,及使用方法。我也是刚接触到这个文件系统,可能有理解不对的地方,也请指正。

一、产生的背景

FLASH具有的先擦除再写入、坏块、有限的读写次数等特性,目前管理FLASH的方法主要有:

1、采用MTD+FTLNFTLflash转换层/nand flash转换层)+传统文件系统,如:FAText2等。FTLNFTL的使用就是针对FLASH的特有属性,通过软件的方式来实现日志管理、坏块管理、损益均衡等技术。但实践证明,由于知识产权、效率等各方面因素导致本方案有一定的局限性。

2、采用硬件翻译层+传统文件系统的方案。这种方法被很多存储卡产品采用,如:SD卡、U盘等。这种方案对于一些产品来说,成本较高。

3、采用MTD+ FLASH专用文件系统,如JFFS12YAFFS1/2等。它们大大提高了FLASH的管理能力,并被广泛应用。

JFFS2YAFFS2等专用文件系统也存在着一些技术瓶颈,如:内存消耗大,对FLASH容量、文件系统大小、内容、访问模式等的线性依赖,损益均衡能力差或过渡损益等。在此背景下内核加入了UBI文件系统的支持。

二、用法

环境:omap3530处理器、 (128MByte 16NAND Flash)linnux-2.6.28内核

1、配置内核支持UBIFS

   Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Unsorted block images  --->Enable UBI
       
配置mtd支持UBI接口
       File systems  --->Miscellaneous filesystems  --->UBIFS file system support
       
配置内核支持UBIFS文件系统

2、将一个MTD分区4挂载为UBIFS格式

   ● flash_eraseall /dev/mtd4 //擦除mtd4
       ● ubiattach /dev/ubi_ctrl -m 4 //
mtd4关联
       ● ubimkvol /dev/ubi0 -N rootfs -s 100MiB //
设定volume大小(不是固定值,可以用工具改变)及名称
       ● mount -t ubifs ubi0_0 /mnt/ubi
mount -t ubifs ubi0:rootfs /mnt/ubi

3、制作UBIFS文件系统

在制作UBI镜像时,需要首先确定以下几个参数:

   MTD partition size; //对应的FLASH分区大小
       flash physical eraseblock size; // FLASH
物理擦除块大小
       minimum flash input/output unit size; //
最小的FLASH输入输出单元大小
       for NAND flashes - sub-page size; //
对于nand flash来说,子页大小
       logical eraseblock size.//
逻辑擦除块大小

参数可以由几种方式得到

1)如果使用的是2.6.30以后的内核,这些信息可以通过工具从内核获得,如:mtdinfo –u

2)之前的内核可以通过以下方法:

   ● MTD partition size:从内核的分区表或cat /proc/mtd获得
       ● flash physical eraseblock size
:从flash芯片手册中可以得到FLASH物理擦除块大小,或cat /proc/mtd
       ● minimum flash input/output unit size

           1
nor flash:通常是1个字节
           2
nand falsh:一个页面
       ● sub-page size
:通过flash手册获得
       ● logical eraseblock size
:对于有子页的NAND FLASH来说,等于物理擦除块大小-1页的大小

3)也可以通过ubimtd连接时的产生的信息获取,如:

#modprobe ubi mtd=4 //ubi作为模块加载

#ubiattach /dev/ubi_ctrl -m 4 //通过ubiattach关联MTD
    UBI: attaching mtd4 to ubi0
    UBI: physical eraseblock size: 131072 bytes (128 KiB)
    UBI: logical eraseblock size: 129024 bytes
    UBI: smallest flash I/O unit: 2048
    UBI: sub-page size: 512
    UBI: VID header offset: 512 (aligned 512)
    UBI: data offset: 2048
    UBI: attached mtd4 to ubi0

更详细的解释参见http://www.linux-mtd.infradead.org/doc/ubi.html#L_overhead

#mkfs.ubifs -r rootfs -m 2048 -e 129024 -c 812 -o ubifs.img
    #ubinize -o ubi.img -m 2048 -p 128KiB -s 512 /home/lht/omap3530/tools/ubinize.cfg

-r:制定文件内容的位置
    -m
:页面大小
    -e
:逻辑擦除块大小
    -p
:物理擦除块大小
    -c
:最大的逻辑擦除块数量
    
对我们这种情况,文件系统最多可以访问卷上的129024*812=100M空间
    -s
:最小的硬件输入输出页面大小,如:k9f1208256(上下半页访问)

其中,ubinize.cfg的内容为:

[ubifs]
    mode=ubi
    image=ubifs.img
    vol_id=0
    vol_size=100MiB
    vol_type=dynamic
    vol_name=rootfs
    vol_flags=autoresize

4、利用uboot烧写、启动UBIFS镜像

1)烧写UBIFS镜像

OMAP3 DevKit8000 # mmcinit
    OMAP3 DevKit8000 # fatload mmc 0:1 81000000 ubi.img
    reading ubi.img
    12845056 bytes read
    OMAP3 DevKit8000 # nand unlock
    device 0 whole chip
    nand_unlock: start: 00000000, length: 268435456!
    NAND flash successfully unlocked
    OMAP3 DevKit8000 # nand ecc sw
    OMAP3 DevKit8000 # nand erase 680000 7980000
    NAND erase: device 0 offset 0x680000, size 0x7980000
    Erasing at 0x7fe0000 -- 100% complete.
    OK
    OMAP3 DevKit8000 # nand write.i 81000000 680000 $(filesize)
    NAND write: device 0 offset 0x680000, size 0xc40000
    Writing data at 0x12bf800 -- 100% complete.
    12845056 bytes written: OK

烧写过程和烧写内核镜像的过程一致,所以UBI文件系统应该不像yaffs文件系统那样用到了nandOOB区域。

2)设置UBIFS文件系统作为根文件系统启动的参数

OMAP3 DevKit8000 # setenv bootargs console=ttyS2,115200n8 ubi.mtd=4 root=ubi0:rootfs
    rootfstype=ubifs video=omapfb:mode:4.3inch_LCD
    OMAP3 DevKit8000 # setenv bootcmd nand read.i 80300000 280000 200000\;bootm 80300000

根文件系统的位置在MTD4

系统启动时会打印出如下和UBI相关的信息:

Creating 5 MTD partitions on "omap2-nand":
    0x00000000-0x00080000 : "X-Loader"
    0x00080000-0x00260000 : "U-Boot"
    0x00260000-0x00280000 : "U-Boot Env"
    0x00280000-0x00680000 : "Kernel"
    0x00680000-0x08000000 : "File System"
    UBI: attaching mtd4 to ubi0
    UBI: physical eraseblock size: 131072 bytes (128 KiB)
    UBI: logical eraseblock size: 129024 bytes
    UBI: smallest flash I/O unit: 2048
    UBI: sub-page size: 512
    UBI: VID header offset: 512 (aligned 512)
    UBI: data offset: 2048
    UBI: attached mtd4 to ubi0
    UBI: MTD device name: "File System"
    UBI: MTD device size: 121 MiB
    UBI: number of good PEBs: 970
    UBI: number of bad PEBs: 2
    UBI: max. allowed volumes: 128
    UBI: wear-leveling threshold: 4096
    UBI: number of internal volumes: 1
    UBI: number of user volumes: 1
    UBI: available PEBs: 0
    UBI: total number of reserved PEBs: 970
    UBI: number of PEBs reserved for bad PEB handling: 9
    UBI: max/mean erase counter: 2/0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

imx515 uboot UBIFS移植及android UBIFS文件系统烧写

分类:BootLoad2010-09-13 17:202963人阅读评论(1)收藏 举报

作者longfeey

1.1       Uboot UBI的移植

关于ubootUBI的移植几乎没有说明介绍,移植首先要保证你的flash驱动能够跑起来,我是在nand flash 上跑的UBI。刚开始的时候我也没有什么头绪,只能够从ubootreadme开始查找一些蛛丝马迹。

- MTD Support (mtdparts command, UBI support)

              CONFIG_MTD_DEVICE

              Adds the MTD device infrastructure from the Linux kernel.

              Needed for mtdparts command support.

              CONFIG_MTD_PARTITIONS

              Adds the MTD partitioning infrastructure from the Linux

              kernel. Needed for UBI support.

因此UBI支持首先得要MTD支持,因此在配置文件中要添加以上两项的定义。

要移植UBI还要添加

#define CONFIG_CMD_UBIFS           

#define CONFIG_CMD_UBI         

总的关于UBI的部分是以下几个宏

#define CONFIG_CMD_UBI

#define CONFIG_CMD_UBIFS

#define CONFIG_CMD_MTDPARTS

#define CONFIG_MTD_DEVICE

#define CONFIG_MTD_PARTITIONS

#define CONFIG_RBTREE

#define CONFIG_LZO 

同时要给NAND建立个默认的分区方便以后操作。分区如下:

#define MTDIDS_DEFAULT "nand0=nand0"

#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootfs),-(reserved)"

#define MTD_ACTIVE_PART "nand0,2"

以上的配置都在uboot_imx/include/configs/mx51_vdphone.h文件中进行配置。

需要注意的是增加UBI的支持之后uboot会增大到300KB,在NAND中启动,需要修改以下文件uboot-imx/cpu/arm_cortexa8/mx51/mxc_nand_load.S 

     add r6, r0, #0x1E00

     ldr r5, =_end        /* Try get right image size */

     add r5, r2, #0x00060000 /* Fixme to get actual image size */ 

这里使用0x60000384K)大小,已经足够,如果实际有变化,可以进行相应调节。如果uboot传给Copy_Good_Blk 拷贝uboot大小小于uboot的长度的话,uboot跑不起来,移植的时候被这个问题必须注意

这个时候就可以make 了,执行以下命令:

make clean

make mx51_vdphone_config

make all

如果正常的话会编译出u-boot.bin在根目录下。

1.2      u-boot ubi的使用

1.2.1       配置u-boot nand分区

通过mtdpart命令配置u-boot下的nand分区,本项目已经在配置头文件里面设置了默认nand分区,

#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootfs),-(reserved)"

如果需要修改,可以通过修改默认分区列表,也可以通过命令mtdpart进行重新分区。这里使用默认分区,通过以下命令使默认分区生效:

      mtdpart default       //设置默认分区

      saveevn             //保存分区信息

 

 

1.2.2       nand u-boot 烧写

通过以上的配置编译,如果成功生成u-boot.bin,那就可以通过SD卡启动,直接烧写u-boot.binnand flash了。操作步骤如下:

1)        下载u-boot.bin到内存

tftp 0x90800000 /tftpboot/mx51/u-boot.bin

2)        擦除u-boot分区

nand erase u-boot

3)        烧写u-bootnand flash分区

nand write 0x90800000 u-boot 0x60000

1.2.3       内核的烧写

 内核的烧写和平常烧写方式一样,只需用nand命令写入nand即可,操作步骤如下:

1)      擦除kernel分区

nand erase kernel

2)      下载kernel到内存

tftp 0x90800000 /tftpboot/mx51/uImage  将内核通过tftp下载到内存中

3)      烧写kernelnand kernel分区

nand write 0x90800000 kernel 0x300000 

1.2.4       UBI文件系统的烧写

本项目使用的文件系统将根文件系统和system文件系统整合在一起。所以,只需要烧写整合后的文件系统即可。如果要使用ubifs文件系统作为根文件系统,在烧写之前必须通过mkfs.ubifs工具将做好的文件系统制作镜像文件。mkfs.ubifs工具是通过编译mtd-utils工具下的mkfs.ubifs目录即可生成的PCUBIFS文件系统镜像制作工具。操作步骤如下:

1)      制作根文件系统

mkfs.ubifs -r root/ -m 2048 -e 129024 -c 2364 -o root-fs.img

root目录为整合android rootsystem文件系统后的目录,应当能够通过NFS系统的

2)      擦除root分区

 nand erase root

3)      激活root分区为UBI格式

 ubi part root

 

             4)    创建root分区

ubi create root

 

5)      将文件系统下载到内存

 tftp 0x90800000 root-fs.img

6)      将文件系统烧写到rootfs 

ubi write 0x90800000 rootfs 0x339600//0x339600tftp下载到的root-fs.img镜像大小,

1.2.5        设置启动参数

设置bootargs

setenv bootargs ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttymxc0,115200 wvga calibration init=/init rw

启动拨码开关5,8位置设置为ON,上电重新启动,即可从Nand flash 启动。

 

               1.3       android FLASH UBI文件系统的制作和烧写

android编译为UBI文件系统格式,生成的system.img,userdata.img,recover.img就可以直接在u-boot中通过ubi write 命令烧写,前提条件是uboot已经支持或完成ubiUBIFS的移植工作,并且linux kernel也要支持UBIFS文件系统。

              1.3.1  设置mtdpart分区

             1)    U-Boot中配置默认分区参数,路径如下:

 

#板级相关的配置文件include/configs/mx51/xxxx.h 

mtdparts: mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x100000@0x420000(ramdisk),0x4B00000@0x520000(system),0x1E00000@0x5020000(userdata),0xD00000@0x6E20000(cache),-(reserved)

 

            2)    第一次烧写完boot后,设置mtdpart分区:

BBG U-Boot > mtdparts default #加载默认分区配置

BBG U-Boot > save #保存配置

BBG U-Boot > mtdpart #查看分区配置

device nand0 <nand0>, # parts = 7

 #: name                size            offset          mask_flags

 0: u-boot              0x00100000      0x00000000      0

 1: kernel              0x00300000      0x00120000      0

 2: ramdisk             0x00100000      0x00420000      0

 3: system              0x04b00000      0x00520000      0

 4: userdata            0x01e00000      0x05020000      0

 5: cache               0x00d00000      0x06e20000      0

 6: reserved            0x004e0000      0x07b20000      0

active partition: nand0,0 - (u-boot) 0x00100000 @ 0x00000000

defaults:

mtdids  : nand0=nand0

 

               3)    烧写U-BootFLASH

BBG U-Boot > tftp 0x90800000 u-boot.bin #获取U-Boot到内存

BBG U-Boot > nand erase u-boot #格式化u-boot分区

BBG U-Boot > nand write 0x90800000 u-boot 0x100000 #烧写u-boot到对应分区

              4)    烧写Linux内核到FLASH

BBG U-Boot > tftp 0x90800000 uImage #获取内核到内存

BBG U-Boot > nand erase kernel #格式化内存分区

BBG U-Boot > nand write 0x90800000 kernel 0x300000 #烧写内核到对应分区

              5)    烧写RamdiskFLASH

BBG U-Boot > tftp 0x90800000 uramdisk.img #获取uramdisk到内存

BBG U-Boot > nand erase ramdisk #格式化uramdisk分区

BBG U-Boot > nand write 0x90800000 ramdisk 0x100000 #烧写uramdisk到对应分区          

              6)    烧写SystemFLASH

BBG U-Boot > nand erase system #擦除system分区

BBG U-Boot > tftp 0x90800000 system.img #获取system到内存

BBG U-Boot > ubi part system #激活system分区为ubi格式

Creating 1 MTD partitions on "nand0":

0x000097855f98-0x000000520000 : "<NULL>"

UBI: attaching mtd1 to ubi0

UBI: physical eraseblock size:   131072 bytes (128 KiB)

UBI: logical eraseblock size:    129024 bytes

UBI: smallest flash I/O unit:    2048

UBI: sub-page size:              512

UBI: VID header offset:          512 (aligned 512)

UBI: data offset:                2048

UBI: attached mtd1 to ubi0

UBI: MTD device name:            "mtd=3"

UBI: MTD device size:            78643200 MiB

UBI: number of good PEBs:        600

UBI: number of bad PEBs:         0

UBI: max. allowed volumes:       128

UBI: wear-leveling threshold:    4096

UBI: number of internal volumes: 1

UBI: number of user volumes:     0

UBI: available PEBs:             590

UBI: total number of reserved PEBs: 10

UBI: number of PEBs reserved for bad PEB handling: 6

UBI: max/mean erase counter: 1/1

BBG U-Boot > ubi create system #创建system分区

Creating dynamic volume system of size 76124160

 

#烧写sytem分区,大小为tftp下载完成后提示的大小

BBG U-Boot > ubi write 0x90800000 system 0x3ca9800

Volume "system" found at volume id 0

 

               7)    烧写userdataFLASH

BBG U-Boot > nand erase userdata #擦除userdata分区

BBG U-Boot > ubi part userdata #激活userdata分区为ubi格式

UBI: mtd1 is detached from ubi0

Creating 1 MTD partitions on "nand0":

0x000097855f98-0x000005020000 : "<NULL>"

UBI: attaching mtd1 to ubi0

UBI: physical eraseblock size:   131072 bytes (128 KiB)

UBI: logical eraseblock size:    129024 bytes

UBI: smallest flash I/O unit:    2048

UBI: sub-page size:              512

UBI: VID header offset:          512 (aligned 512)

UBI: data offset:                2048

UBI: empty MTD device detected

UBI: create volume table (copy #1)

UBI: create volume table (copy #2)

UBI: attached mtd1 to ubi0

UBI: MTD device name:            "mtd=4"

UBI: MTD device size:            31457280 MiB

UBI: number of good PEBs:        240

UBI: number of bad PEBs:         0

UBI: max. allowed volumes:       128

UBI: wear-leveling threshold:    4096

UBI: number of internal volumes: 1

UBI: number of user volumes:     0

UBI: available PEBs:             234

UBI: total number of reserved PEBs: 6

UBI: number of PEBs reserved for bad PEB handling: 2

UBI: max/mean erase counter: 0/0

BBG U-Boot > ubi create userdata #创建userdata分区

Creating dynamic volume userdata of size 30191616

BBG U-Boot > tftp 0x90800000 userdata.img #获取userdata到内存

 

#烧写userdata分区,大小为tftp下载完成后提示的大小

BBG U-Boot > ubi write 0x90800000 userdata 0x979800

Volume "userdata" found at volume id 0

 

              8)    初始化Cache分区

BBG U-Boot > ubi part cache #激活cache分区为ubi格式

UBI: mtd1 is detached from ubi0

Creating 1 MTD partitions on "nand0":

0x000097855f98-0x000006e20000 : "<NULL>"

UBI: attaching mtd1 to ubi0

UBI: physical eraseblock size:   131072 bytes (128 KiB)

UBI: logical eraseblock size:    129024 bytes

UBI: smallest flash I/O unit:    2048

UBI: sub-page size:              512

UBI: VID header offset:          512 (aligned 512)

UBI: data offset:                2048

UBI: empty MTD device detected

UBI: create volume table (copy #1)

UBI: create volume table (copy #2)

UBI: attached mtd1 to ubi0

UBI: MTD device name:            "mtd=5"

UBI: MTD device size:            13631488 MiB

UBI: number of good PEBs:        104

UBI: number of bad PEBs:         0

UBI: max. allowed volumes:       128

UBI: wear-leveling threshold:    4096

UBI: number of internal volumes: 1

UBI: number of user volumes:     0

UBI: available PEBs:             98

UBI: total number of reserved PEBs: 6

UBI: number of PEBs reserved for bad PEB handling: 2

UBI: max/mean erase counter: 0/0

BBG U-Boot > ubi create cache   #创建cache分区

 

 

                9)     FLASHAndroid的加载与启动

设置启动参数

setenv bootcmd_nand 'run bootargs_nand;nand read ${loadaddr} kernel; nand read ${rd_loadaddr} ramdisk; bootm ${loadaddr} ${rd_loadaddr}'

setenv bootargs_nand 'setenv bootargs ubi.mtd=3 ubi.mtd=4 ubi.mtd=5 console=ttymxc0,115200 androidboot.console=ttymxc0 wvga calibration init=/init rw'

setenv bootcmd 'run bootcmd_nand'

saveenv

重启即可从nand flash启动烧写的ubi文件系统

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Uboot UBI的移植

分类:BootLoad2010-09-15 21:562235人阅读评论(2)收藏 举报

作者longfeey

1.1        Uboot UBI的移植

关于 uboot UBI的移植几乎没有说明介绍,移植首先要保证你的 flash驱动能够跑起来,我是在 nand flash 上跑的 UBI。刚开始的时候我也没有什么头绪,只能够从 uboot readme开始查找一些蛛丝马迹。

- MTD Support (mtdparts command, UBI support)

              CONFIG_MTD_DEVICE

              Adds the MTD device infrastructure from the Linux kernel.

              Needed for mtdparts command support.

              CONFIG_MTD_PARTITIONS

              Adds the MTD partitioning infrastructure from the Linux

              kernel. Needed for UBI support.

因此 UBI支持首先得要 MTD支持,因此在配置文件中要添加以上两项的定义。

要移植 UBI还要添加

#define CONFIG_CMD_UBIFS           

#define CONFIG_CMD_UBI         

总的关于 UBI的部分是以下几个宏

#define CONFIG_CMD_UBI

#define CONFIG_CMD_UBIFS

#define CONFIG_CMD_MTDPARTS

#define CONFIG_MTD_DEVICE

#define CONFIG_MTD_PARTITIONS

#define CONFIG_RBTREE

#define CONFIG_LZO 

同时要给 NAND建立个默认的分区方便以后操作。分区如下:

#define MTDIDS_DEFAULT "nand0=nand0"

#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootfs),-(reserved)"

#define MTD_ACTIVE_PART "nand0,2"

以上的配置都在uboot_imx/include/configs/mx51_vdphone.h文件中进行配置。

需要注意的是增加 UBI的支持之后 uboot会增大到 300 KB,在 NAND中启动,需要修改以下文件uboot-imx/cpu/arm_cortexa8/mx51/mxc_nand_load.S 

     add r6, r0, #0x1E00

     ldr r5, =_end        /* Try get right image size */

     add r5, r2, #0x00060000 /* Fixme to get actual image size */ 

这里使用0x60000384K)大小,已经足够,如果实际有变化,可以进行相应调节。如果 uboot 传给 Copy_Good_Blk 拷贝 uboot大小小于 uboot的长度的话, uboot跑不起来,移植的时候被这个问题必须注意

这个时候就可以 make 了,执行以下命令:

make clean

make mx51_vdphone_config

make all

如果正常的话会编译出 u-boot.bin在根目录下。

1.2        u-boot 下 ubi 的使用

1.2.1         配置 u-boot nand 分区

通过mtdpart命令配置u-boot下的nand分区,本项目已经在配置头文件里面设置了默认nand分区,

#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootfs),-(reserved)"

如果需要修改,可以通过修改默认分区列表,也可以通过命令mtdpart进行重新分区。这里使用默认分区,通过以下命令使默认分区生效:

      mtdpart default       //设置默认分区

      saveevn             //保存分区信息

 

 

1.2.2       nand u-boot 烧写

通过以上的配置编译,如果成功生成 u-boot.bin,那就可以通过 SD卡启动,直接烧写 u-boot.bin nand flash了。操作步骤如下:

1)        下载 u-boot.bin到内存

tftp 0x90800000 /tftpboot/mx51/u-boot.bin

2)        擦除 u-boot分区

nand erase u-boot

3)        烧写 u-boot nand flash分区

nand write 0x90800000 u-boot 0x60000

1.2.3       内核的烧写

 内核的烧写和平常烧写方式一样,只需用nand命令写入nand即可,操作步骤如下:

1)      擦除kernel分区

nand erase kernel

2)      下载kernel到内存

tftp 0x90800000 /tftpboot/mx51/uImage  将内核通过tftp下载到内存中

3)      烧写kernelnand kernel分区

nand write 0x90800000 kernel 0x300000 

1.2.4       UBI文件系统的烧写

本项目使用的文件系统将根文件系统和 system文件系统整合在一起。所以,只需要烧写整合后的文件系统即可。如果要使用 ubifs文件系统作为根文件系统,在烧写之前必须通过 mkfs.ubifs工具将做好的文件系统制作镜像文件。 mkfs.ubifs工具是通过编译 mtd-utils工具下的 mkfs.ubifs目录即可生成的 PC UBIFS文件系统镜像制作工具。操作步骤如下:

1)      制作根文件系统

mkfs.ubifs -r root/ -m 2048 -e 129024 -c 2364 -o root-fs.img

root目录为整合android rootsystem文件系统后的目录,应当能够通过NFS系统的

2)      擦除root分区

 nand erase root

3)      root分区进行ubi格式化

 ubi part root

4)      将文件系统下载到内存

 tftp 0x90800000 ubifs.img

5)      将文件系统烧写到rootfs 

ubi write 0x90800000 rootfs 0x339600

1.2.5        设置启动参数

设置 bootargs

setenv bootargs ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttymxc0,115200 wvga calibration init=/init rw

启动拨码开关 5,8位置设置为 ON,上电重新启动,即可从 Nand flash启动。

 

 

“5) 将文件系统烧写到 rootfs

ubi write 0x90800000 rootfs 0x339600”
这步不行,ubi 文件系统不能使用 nand write烧写吧!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MTD设备及JFFS2, UBIFS文件系统的使用简介

分类:Linux使用技巧以及软件开发2011-09-07 12:101100人阅读评论(0)收藏 举报

声明:转载请注明原文链接!http://blog.csdn.net/leisure512/article/details/6756300

MTD设备

MTD (Memory Technology Devices)更多的代表Flash设备,它提供了统一接口来处理各种裸Flash设备,例如NAND NOR OneNAND等。对于使用FTL技术模拟成块设备的Flash,并不属于MTD设备。例如MMC, eMMC, SD等。
/dev/mtdN, MTD
字符设备,代表MTD设备,可以进行各种ioctl操作
/proc/mtd,
过时的proc接口
sysfs
接口是正在使用的接口,包括/sys/devices,/sys/class,/sys/module接口
mtdram, mtdblock
mtdram模拟NOR flash设备,而mtdblockNOR flash模拟成块设备,但是它并不高级,远没有提供FTL的功能,例如写均衡,坏块管理等,它只是一个简单的模拟块设备的接口。通过对象的/dev/mtdblockN可以以访问块设备的方式访问NOR flash

mtdram
用内存模拟NOR Flash
block2mtd
用块设备模拟
NOR Flash
nandsim
用内存会文件模拟
NAND Flash
1.
首先要编译内核支持MTD相关选项,不管是内置还是编译为模块。

2.
安装mtd-utils工具
3.1. mtdram, mtdblock
#modinfo mtdram
可以看出mtdram有两个参数,total_size, erase_size,都以KiB为单位,下面创建一个32MiBMTD设备,擦除块大小为128KiB
#modprobe mtdram total_size=$((32*1024)) erase_size=128
#cat
/proc/mtd //
查看当前的mtd设备,另外,还可以通过/sys/devices/virtual/mtd/目录来查看MTD设备
#ls -l /dev/mtd* //
自动创建了/dev/mtd0,/dev/mtd0ro设备节点
#modprobe mtdblock
#ls -l
/dev/mtd* //
自动创建了和/dev/mtd0对应的块设备节点/dev/mtdblock0
3.2. block2mtd
block2mtd
顾名思义使用块设备模拟MTD设备,这里的块设备既可以是真正的块设备,也可以是使用losetup模拟的块设备。
#dd if=/dev/zero of=block.img bs=4K count=8096 //
创建一个32M大小的文件
#losetup /dev/loop0 block.img //
模拟块设备文件,可以使用 losetup -f block.img, losetup -a,如果/dev/loop0已经被占用。
#modinfo block2mtd
可以看出block2mtd模块有一个参数block2mtd,设置块设备文件和擦除块大小
#modprobe block2mtd block2mtd=/dev/loop0,128KiB
#cat
/proc/mtd
#ls -l /dev/mtd*
3.3. nandsim
nandsim
模拟NAND flash设备,前两种都是模拟NOR flash设备,也可以使用mtdinfo <device>来查看,可以看出,通过mtdramblock2mtd模拟的flash设备最小输入输出单位是字节。
#modinfo nandsim
nandsim
有一堆参数,其中first_id_byte, second_id_byte分别指明设备制造商ID和芯片ID,如果不指明,会创建一个默认128M大小的flash设备
#modprobe nandsim first_id_byte=0x20 second_id_byte=0x33
#cat
/proc/mtd
#ls -l /dev/mtd*
#mtdinfo
/dev/mtdN //
查看MTD的信息,例如这里创建的NAND flash信息为
Name: NAND simulator partition 0
Type: nand
Eraseblock size: 16384 bytes, 16.0 KiB
Amount of eraseblocks: 1024 (16777216 bytes, 16.0 MiB)
Minimum input/output unit size: 512 bytes
Sub-page size: 256 bytes
OOB size: 16 bytes
Character device major/minor: 90:4
Bad blocks are allowed: true
Device is writable: true
4. Flash
文件系统
现在,有了MTD设备,还没有合适的文件系统,JFFS2UBIFS是两个比较流行的flash文件系统。
4.1. JFFS2
JFFS2
文件系统用户空间工具为mtd-utils,提供创建jffs2的工具mkfs.jffs2jffs2dump。创建jffs2文件系统映像后可以用nand工具烧写到flash上。
#mkfs.jffs2 --root=jffs2.dir --pagesize=4KiB --eraseblock=128KiB --pad=$((32*1024))KiB --output=jffs2.img
上面命令以目录jffs2.dir为根创建了一个jffs2.img文件系统映像,--pad表示使用0xFF填充剩余的空间,如果没有参数表示填充到最后一块即止。这里填充到32MiB大小。
Linux上,可以通过mtdram/mtdblock来查看修改jffs2.img。但是不能直接通过loop back来挂载,因为它工作在MTD之上,而不是块设备之上。
#modprobe mtdram total_size=$((1024*32)) erase_size=128
#modprobe mtdblock
#dd if=jffs2.img of=/dev/mtdblock0
#mount -t jffs2
/dev/mtdblock0 /mnt
或者使用nandsim模拟,然后使用nandwritejffs2.img写入MTD设备
#modprobe nandsim //
默认模拟一个128MiBnand flash
#nandwrite -j
/dev/mtd1 jffs2.img
#mount -t jffs2
/dev/mtdblock1 /mnt

UBIFS
UBIFS
工作在UBI层之上,UBI是对MTD设备的又一层抽象。首先,要将MTD设备加入UBI池,然后再在UBI之上创建UBIFS,有点类似LVM的概念。
#modprobe nandsim //
创建一个nand flash设备,128MiB
#mtdinfo
/dev/mtd0 // flash
的物理擦除块大小为16KiB
#modprobe ubi mtd=0 //
/dev/mtd0加入ubi设备池

或者
#modprobe ubi
#ubiattach
/dev/ubi_ctrl -m 0 //
现在将会生成/dev/ubi0设备
#ubinfo /dev/ubi0 // ubi
设备的逻辑擦除块大小为15.5KiB, 15872B,这是因为创建ubi设备时需要在每个物理擦除块写入头。
#ubimkvol /dev/ubi0 -N ubi-vol0 -s 32MiB //
创建一个32MiBvolume,/dev/ubi0_0
#ubinfo /dev/ubi0_0
#mount -t ubifs ubi0:ubi-vol0 /mnt
#echo "hello ubifs" >
/mnt/hello.txt
#mkfs.ubifs -r /mnt -m 512 -e 15782 -c 2115 -o ubifs.img
上面命令中的最小IO单位512字节,逻辑擦除块大小,以及文件系统最大可扩展至2115个逻辑块,这些信息可以使用如下命令获得
#ubinfo /dev/ubi0 //
获得最小IO单位,逻辑擦除块大小
#ubinfo /dev/ubi0_0 //
文件系统包含的逻辑块数
#cat ubinize.cfg
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=32MiB
vol_type=dynamic
vol_name=ubi-vol0
vol_flags=autoresize
#ubinize -o ubi.img -m 512 -s 256 -p 16KiB ubinize.cfg
这里和mkfs.ubifs的参数不同,-p的参数为物理擦除块大小,也就是ubi工作在MTD层之上,所以需要MTD的参数,即物理参数,而ubifs工作在ubi之上,所以需要ubi的参数,即逻辑参数。
现在,ubi设备映像已经被保存在了ubi.img中,不仅包含ubifs信息,还包含ubi信息,所以可以直接烧写到MTD设备上即可。
#modprobe nandsim
#dd if=ubi.img
/dev/mtd0
#modprobe ubi mtd=0
#mount -t ubifs ubi0_0 /mnt
#ls /mnt

hello.txt

 注意:如果出现ubiattach错误,很可能是使用了block2mtd模拟MTD设备,因为这时设备是没有格式化的,所以会出现ubi_read_volume_table: the layout volume was not found,通过dmesg查看。那么,首先需要格式化MTD设备
#ubiformat /dev/mtd0
#ubiattach /dev/ubi_ctrl -m 0

 

 

 

 

 

 

 

 

 

使用QEMU模拟搭建ARM开发平台(二)——加入busybox支持

2011-08-31 13:38339人阅读评论(0)收藏 举报

转载请注明原文链接!http://blog.csdn.net/leisure512/article/details/6735578

在上一篇文章中,搭建的arm平台只有一个最小化的initramfs,只是可以验证可以启动,但没有实用性,busybox是嵌入式环境中的杀手级应用,将busybox集成进initramfs变得非常实用。

0.
首先要安装qemu, arm toolchain,还要下载busybox源码。我下载的是busybox-1.18.5.tar.bz2
1.
编译安装
busybox
$tar xjf busybox-1.18.5.tar.bz2
$cd busy box-1.18.5
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
选择将busybox编译成静态文件
, "Busybox Settings --> Build Options"
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
编译安装完成后,会在当前目录下生成_install目录,此为默认的安装目录,也可以在Busybox Settings中设置为别的目录。现在制作initramfs

$cd _install
$find . | cpio -o -H newc | gzip $HOME/versatile-busybox
现在用qemu模拟。
$cd $HOME
$qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/bin/sh"
这里如果不加rdinit=/bin/sh,那么/linuxrc将会试图挂载根文件系统,并且运行新根文件系统中的init,由于我们没有另外的真正的根文件系统,所以使用rdinit=/bin/sh,启动到sh中,敲入回车,将会出现shell命令提示符。在当前root中,没有/proc,/sys存在,所以例如mount等这些以来/proc, /sys的命令不能正常工作。在虚拟机中执行
#mkdir /proc /sys
#mount -t proc proc /proc
#mount -t sysfs sysfs /sys
也可以将其加入到启动脚本中,关闭虚拟机,然后修改versatile-busybox
$cd busybox-1.18.5/_install
$mkdir -p etc/init.d
$cd etc/init.d
$cat > rcS <<EOF
#!/bin/sh
>mkdir /proc /sys
>mount -t proc proc /proc
>mount -t sysfs sysfs /sys
>mdev -s
EOF
$chmod +x rcS
$cd busybox-1.18.5/_install
$find . | cpio -o -H newc | gzip > $HOME/versatile-busybox
现在用qemu模拟

qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/sbin/init"
注意这里的rdinit=/sbin/init,前面之所以是rdinit=/bin/sh,是因为/sbin/init会执行/etc/init.d/rcS,而前面并没有创建这个文件,所以会打印很多错误!特别是由于没有启动mdev

详细请参考http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

移植ubifs文件系统

整理:廖振球

时间:2012.02.07

1.开发环境:

CPUDM365

Nandflash:

内核版本:2.6.34

2.内核支持:
1)Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Unsorted block images  --->Enable UBI
2)File systems  --->Miscellaneous filesystems  --->UBIFS file system support
这样我们的内核就支持UBIFS文件系统了

3.编译UBIFS工具

mtd-utils工具中提供了对UBIFS的支持,

下载mtd-utilswget http://debian.mirror.inra.fr/deb ... 0080508.orig.tar.gz

编译mtd-utils
 tar xzvf mtd-utils_20080508.orig.tar.gz
 cd mtd-utils-20080508
/ubi-utils

修MakefileCC := arm_v5t_le-gcc
make
mtd-utils-20080508
/ubi-utils目录下生成我们需要的ubifs工具,将这些工具拷贝到文件系统/bin

4.使用UBIFS
我的分区信息:

# more /proc/partitions 

major minor  #blocks  name

  31        0       3840 mtdblock0

  31        1        256 mtdblock1

  31        2       8192 mtdblock2

  31        3     131072 mtdblock3

  31        4     524288 mtdblock4

# flash_eraseall /dev/mtd4 (格式化nandflash分区4

# ubiattach /dev/ubi_ctrl -m 4 4表示分区数)

# ubimkvol /dev/ubi0 -N more -s 510552KiB -s表示分区大小,单位为KiB-N表示卷标)

# mount -t ubifs ubi0_0 /more (也可以是 mount -t ubifs ubi0:nore /more)

 

 

 

 

 

 

 

 

原创粉丝点击