制作ubifs文件系统

来源:互联网 发布:pr淘宝视频 编辑:程序博客网 时间:2024/05/22 01:32

本文所有内容均来源于网上,如有侵权请告知,马上删除。

Ubifs 文件系统的制作和启动

UBI 文件系统是 JFFS2 的下一代文件系统,更适合 NAND FLASH。看到一些用户在应用 UBIFS 时遇到些问题,现在做个简要介绍。

 

1. 在 U-boot 和 kernel 中使能对 UBIFS 的支持

1.1 U-boot \include\configs\am335x_evm.h 中加入如下宏的定义:

 

#define CONFIG_CMD_NAND

#define CONFIG_CMD_UBI

#define CONFIG_CMD_UBIFS

#define CONFIG_RBTREE

#define CONFIG_MTD_DEVICE

#define CONFIG_MTD_PARTITIONS

#define CONFIG_CMD_MTDPARTS

#define CONFIG_LZO

 

1.2 Kernel 中的 menuconfig:

 

  Enabling UBI support on MTD devices.

Device Drivers --->

Memory Technology Device (MTD) support --->

Enable UBI - Unsorted block images --->

 

  Enabling UBIFS file-system support.

File systems --->

Miscellaneous filesystems --->

UBIFS file system support

 

2. 下载和编译 MTD Utilites

2.1 下载 MTD Utilites

通过 git://git.infradead.org/mtd-utils.git 下载最新的 MTD-Utils 源代码。

下载 个编译所需的依赖库

Zlib: http://zlib.net/

Lzo:http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gze2fsprogs: 

e2fsprogs :https://www.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.42.12/

 

 

 

在制作 ubifs 文件系统的过程中需要如下:

为方便操作,把下面将要安装的数据包的解压文件到存放在:/home/user/mtd

mkdir install,下面将要运行的数据包生成的文件将会存放在:/home/user/mtd/install 

 

1),正确安装数据包:

     zlib-1.2.5lzo-2.06e2fsprogs-1.42mtd-utils-1.5.0

     这些数据包的版本最好如上所述,否则可能会导致无法生成所需的文件或生成的文件不正确

 

     这是制作 ubifs 过程中将要用到的所有的软件包的连接:ubifs

 

    1zlib

    host$ tar xvf zlib-1.2.5.tar.gz

    host$ cd zlib-1.2.5/

    host$ ./configure --prefix=/home/user/mtd/install      

打开其根目录下的 Makefile,替换   gcc, ldshared, cpp, ar , ranlib 为如下:

    host$ gedit Makefile

           CC=arm-arago-linux-gnueabi-gcc

           LDSHARED=arm-arago-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map

           CPP=arm-arago-linux-gnueabi-gcc -E

           AR=arm-arago-linux-gnueabi-ar rc

           RANLIB=arm-arago-linux-gnueabi-ranlib

保存,退出

    host$ make

    host$ make install

    host$ cd ..

 

生成的 zlib.a 存放在 /home/user/mtd/install/lib 中;

生成的 zlib 的头文件存放在 /home/user/mtd/install/include中。

zlib安装完成!

 

     2lzo

    host$ tar xvf lzo-2.06.tar.gz

    host$ cd lzo-2.06/

    host$ ./configure --build=i686-pc-linux --prefix=/home/user/mtd/install --host=arm-arago-linux-gnueabi

    host$ make

    host$ make install

    host$ cd ..

 

生成的 liblzo2.a 存放在 /home/user/mtd/install/lib 中;

生成的 lzo 的头文件 存放在 /home/user/mtd/install/include/lzo

lzo安装完成!

 

     3e2fsprogs

    host$ tar xvf e2fsprogs-1.42.tar.gz

    host$ cd e2fsprogs-1.42/

    host$ ./configure --build=i686-pc-linux --prefix=/home/user/mtd/install --host=arm-arago-linux-gnueabi

    host$ make

    host$ make install

    host$ cd lib/uuid/

    host$ make install

    host$ cd ../../../

 

生成的 libuuid.a 存放在 /home/user/mtd/install/lib 中;

生成的 uuid 的头文件 存放在 /home/user/mtd/install/include/uuid 中。

e2fsprogs安装完成!

 

     4mtd-utils

    host$ tar xvf mtd-utils-1.5.0.tar.gz

    host$ cd mtd-utils-1.5.0/

 

打开其根目录下的Makefile,加入如下语句

    host$ gedit Makefile

           PREFIX = /home/user/mtd/install

           ZLIBCPPFLAGS = -I$(PREFIX)/include

           LZOCPPFLAGS = -I$(PREFIX)/include

           ZLIBLDFLAGS = -L$(PREFIX)/lib

           LZOLDFLAGS = -L$(PREFIX)/lib

           LDFLAGS += $(ZLIBLDFLAGS) $(LZOLDFLAGS)

           CFLAGS ?= -O2 -g $(ZLIBCPPFLAGS) $(LZOCPPFLAGS)

           CROSS=arm-arago-linux-gnueabi-

 

保存,关闭,再打开 common.mk 文件,注释 PREFIX=/usr 语句:

    host$ gedit common.mk

           # PREFIX=/usr

保存,关闭。

 

    host$ make WITHOUT_XATTR=1 

    host$ make install  DESTDIR=/home/user/mtd/install

    host$ cd ..

 

交叉环境编译的MTD通用工具就存放在 /home/user/mtd/install/sbin/中。

mkfs.ubifs,ubinize 的工具(可执行文件)

至此,安装数据包应该算是完成了。可先跳转到   2),生成镜像文件,

 

5,安装 mtd-utils 的疑难杂症及其解决方法

如果在使用生成的 mkfs.ubifs 和 ubinize 可执行文件的过程中发生了如下错误,再回过头来看这部分的内容

如:1mkfs.ubifs 和 ubinize 这两个文件无法执行;

       2mkfs.ubifs 无法使用 命令参数 -F

发生这些问题的原因是 mtd-ubifs 数据包没有安装正确,安装的 mtd-ubifs 版本过低。

           解决方法:下载数据包 :mtd-utils_1.5.0-1_i386.deb

                             host$sudo dpkg -i   mtd-utils_1.5.0-1_i386.deb

 

      3acl 库版本过低,如 需要libacl1 的版本要大于 2.2.51,可当前的为:libacl1_2.2.49

            解决方法:下载数据包:libacl1_2.2.51-8_i386.deb

                             host$sudo dpkg -i   libacl1_2.2.51-8_i386.deb

 

      4attr 库版本过低,如 需要libattr1 的版本要大于 2.4.46,可当前的为:libacl1_2.1.11

            解决方法:下载数据包:libattr1_2.4.46-8_i386.deb

                             host$sudo dpkg -i   libattr1_2.4.46-8_i386.deb

 

      5uuid 库版本过低,如 需要libacl1 的版本要大于 2.19.1,可当前的为:libacl1_2.12.1

            解决方法:下载数据包:uuid-dev_2.19.1-2ubuntu3_i386.deb

                             host$sudo dpkg -i   uuid-dev_2.19.1-2ubuntu3_i386.deb

 

对 dpkg命令有兴趣的请看:ubuntu下用命令行运行deb安装包

 

执行完更新库版本的命令后,重新操作:1),正确安装数据包:->  4mtd-utils

 

PS:Ubifs 的制作需要以下两个命令

mkfs.ubifs: 制作 UBIFS image

ubinize:   根据 UBIFS image 制作 ubi.img,这个 ubi.img 是通过 u-boot 直接烧写在 nand flash 分区上的。

 

2),生成镜像文件

    1,在使用 mkfs.ubifs 生成 ubifs.img 前,需要如下:

       1,把可执行文件 mkfs.ubifs , ubinize 这两个文件放在某个目录下。

          并在在目录下:   host$mkdir filesystem

 

     2,把用于生产 ubifs.img 映像文件的 sbinetc 等文件夹等复制到 filesystem 目录下

        如:本人将要用到的是:ti-sdk-am335x-evm/filesystem/base-rootfs-am335x-evm.tar.gz

        把以下文件或文件夹放于 filesystem目录下:bin/boot/dev/etc/home/lib/

     media/mnt /proc/sbin/srv/sys/tmp/usr/var/, linuxrc

        其中 linuxrc是一个可执行文件,其余的都是文件夹

 

        !!!注意:linuxrc 这个可执行文件是用以引导内核加载文件系统的。

        这个文件名在uboot设置环境变量中使用到。

 

 

U-Boot#setenv bootargs 'console=ttyO0,115200n8 noinitrd ip=off mem=256M rootwait=1 rw ubi.mtd=7,2048 rootfstype=ubifs root=ubi0:rootfs init=/linuxrc'

 

如果 init=*** 设置不正确的话,将会导致下面的错误:

      Kernel panic - not syncing: No init found.  Try passing init= option to kernel.

 

 

      3,执行以下命令生成 ubifs.img 映像文件

         开发板类型为am335x的需要添加 -F 命令参数,否则在加载 ubi.img 时内核可能会崩溃。

        host$mkfs.ubifs -r filesystem/ -F -o ubifs.img -m 2048 -e 126976 -c 1580

 

参数简介:

-F:使能"white-space-fixup",如果是通过 u-boot 烧写需要使能此功能。

-r:待制作的文件系统目录

-m: NAND FLASH 的最小读写单元,一般为 page size

-e: LEB size,对于 AM335x 的 NAND driver,为 block size-2x(page size)

-c:文件系统所占用的最大 block 数,一般小于等于 block count -1

-o:输出的 ubifs.img 文件

 

      4,生成ubi.img 映像文件。

           1,创建以下文件:

              host$ gedit   ubinize.cfg

              在该文件写入如下内容:

                    [ubifs]               

                    mode=ubi             

                    image=ubifs.img      

                    vol_id=0             

                    vol_size=192MiB      

                    vol_type=dynamic      

                    vol_name=rootfs     

                    vol_flags=autoresize

 

             2,执行如下命令,生成 ubi.img 映像文件

                    host$ ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg

 

参数简介:

-p: block size

-m: NAND FLASH 的最小读写单元,一般为 page size

-o:输出的 ubi.img 文件

 

当使用这些命令的过程中,如果遇到了问题请转到:1),正确安装数据包:->  5,安装 mtd-utils 的疑难杂症及其解决方法。

 

至此,生成的 ubi.img 映像文件应该是正确的。

 

 

5.UBIFS文件系统镜像的烧写

以下主要说以下将UBIFS镜像烧写到NAND FLASH中的三种方法。

5.1 u-boot下通过nand write命令烧写

使用ubinize命令制作的带有卷标的UBIFS文件系统镜像可以直接使用nand flash的烧 写命令烧写到NAND FLASH上,具体命令为:

tftp 0xc1180000 ubi.img

nand erase 0x400000 0x7c00000

nand write.e 0xc1180000 0x400000 0x3660000

关于tftpnand 等命令使用格式请参见u-boothelp

 

5.2 u-boot下通过ubi write命令烧写

使用mkfs.ubifs命令制作的UBIFS文件系统镜像可以使用命令ubi write烧写到NAND  FLASH上,具体命令为:

1. 设置FLASH的分区,此处以128M NAND FLASH为例,分为5个区:

setenv mtdids nand0=nand0

setenv mtdparts mtdparts=nand0:0x20000(u-boot env),0x20000(UBL),0x1c0000(u-boot),0x200000(kernel),0x7c00000(filesystem)

 

设置完后,使用mtdparts命令可以看到分区信息:

device nand0 <nand0>, # parts = 5

#: name size offset mask_flags

 0: u-boot env 0x00020000 0x00000000 0

1: UBL 0x00020000 0x00020000 0

2: u-boot 0x001c0000 0x00040000 0

3: kernel 0x00200000 0x00200000 0

4: filesystem 0x07c00000 0x00400000 0

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

 

2. 烧写文件系统:

nand erase 0x400000 0x7c00000

tftp 0xc1180000 ubifs.img

ubi create rootfs

ubi part nand filesystem

ubi write 0xc1180000 rootfs 0x1d1000

通过以上命令,可以将文件系统烧写到第4个分区上,UBIFS文件系统卷标为rootfs

 

3. 设置内核启动参数:

setenv bootargs 'console=ttyS2,115200n8 ubi.mtd=4,2048 root=ubi0:rootfs rootwait rootfstype=ubifs rw ip=off'

这样就可以将烧写的UBIFS文件系统用作根分区了。

4. 要在u-boot下使用ubi,mtd等命令,需要配置一下u-boot,具体可参见: http://blog.csdn.net/longfeey/article/details/5881433

 

5.3 linux系统下烧写

linux系统下,可以使用ubiformat工具烧写使用ubinize工具制作的UBIFS文件系统映像,此处以烧写到NAND FLASH5个分区上为例,具体命令为:

1. 查看FLASH的当前分区:

# cat /proc/mtd

dev: size erasesize name

mtd0: 00020000 00020000 "u-boot env"

mtd1: 00020000 00020000 "UBL"

mtd2: 00080000 00020000 "u-boot"

mtd3: 00200000 00020000 "kernel"

mtd4: 07c00000 00020000 "filesystem"

 

2. 擦除要烧写的分区:

flash_eraseall /dev/mtd/mtd4

 

3. 烧写UBIFS文件系统:

 ubiformat /dev/mtd/mtd4 -f /ubi.img

 

4. 挂载烧写好的文件系统:

ubiattach /dev/ubi_ctrl -m 4 -O 2048

mount -t ubifs ubi0:rootfs /mnt/

 

5.linux下创建UBIFS分区  

flash_eraseall /dev/mtd/mtd4

ubiattach /dev/ubi_ctrl -m 4 -O 2048

ubimkvol /dev/ubi0 -N rootfs -s 100MiB

mount -t ubifs ubi0:rootfs /mnt/

 

5.4 从主机linux烧写ubi文件系统

<1>启动开发板,通过nfs根文件系统启动开发板

<2>flash_eraseall /dev/mtd3

<3>ubiattach /dev/ubi_ctrl -m 3

<4>ubimkvol /dev/ubi0 -s 193MiB -N rootfs

<5>mount -t ubifs ubi0_0 /mnt

<6>cp -a /arago/* /mnt //arago/arago为要烧写的文件系统,放在了nfs根文件系统之中。

    <7>umount /mnt

<8>bootargs参数设置

ubisetenv bootargs 'mem=364M@0x80000000 mem=320M@0x9FC00000 console=ttyO0,115200n8 noinitrd ip=off rootwait=1 rw ubi.mtd=3 rootfstype=ubifs root=ubi0:rootfs init=/init vmalloc=500M notifyk.vpssm3_sva=0xBF900000';saveenv

 

nfs: setenv bootargs mem=364M@0x80000000 mem=320M@0x9FC00000 console=ttyO0,115200n8 root=/dev/nfs rw nfsroot=192.168.2.104:/home/yxz1295324/targetfs,nolock ip=192.168.2.85:192.168.2.104:192.168.2.1:255.255.255.0::eth0:on vmalloc=500M notifyk.vpssm3_sva=0xBF900000

 

官方指导:

http://processors.wiki.ti.com/index.php/UBIFS_Support




 

参考网址:

 http://processors.wiki.ti.com/index.php/UBIFS_Support#Flashing_UBIFS_image_to_a_NAND_partition

 

http://blog.sina.com.cn/s/blog_afeaebf00101figp.html

 

http://www.360doc.com/content/14/1015/18/18578054_417224516.shtml

 

http://www.360doc.com/content/15/1201/15/27345215_517173625.shtml

 

http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/59921.aspx

 

0 0