FL2440 嵌入式Linux根文件系统制作

时间:2022-02-16 23:56:31

一、根文件系统简介

    根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的第一个文件系统,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如inittab、rcS)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

    根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包括了Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载配置文件等,根文件系统中还包括了应用程序(如ls、mkdir、rm、ifconfig等命令)和 GNU C 库(glibc、eglibc或uclibc)等。任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。

    在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂载时,要提供文件系统类型、文件系统和一个挂载点。根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录,文件。

    Linux操作系统可以支持多种多样不同的文件系统,如windows下的FAT32、NTFS,Linux服务器使用的ext2、ext3、ext4、btrfs、xfs、reiser4、ufs、hfs(苹果系统),Linux操作系统自身使用的伪文件系统如swap、proc、sysfs、tmpfs等,也有一些设备的文件系统如iso9660(光盘)、nfs(网络文件系统)等,当然还包括我们嵌入式设备上用的不同的文件系统如:initramfs(在内存中运行的文件系统)、jffs2(一种基于Norflash的文件系统,也支持小页的nandflash)、ubifs(目前Android手机上的Nandflash普遍使用的文件系统)、yaffs2(早期专门用来支持大页Nandflash的文件系统,具备可移植性可在单片机裸机情况下使用)、cramfs(一种基于内存的只读的文件系统)、squashfs(在openwrt路由器上广泛使用的俄文件系统)、romfs(一种只读、支持片上执行XIP的文件系统,在uClinux中广泛使用)等。下面是几种常用的嵌入式根文件系统的对比:

(1) initramfs 该文件系统直接将根文件系统直接打包进Linux内核里(只有这种文件系统具有该功能),这样内核和根文件系统绑定在一块成为一个单独的文件,他在Linux系统启动后加载到内存中运行,所以速度快,但浪费内存,系统升级的时候内核和根文件系统一起升级比较方便。但因为他是基于内存的文件系统,所以系统掉电后针对根文件系统下所有文件的修改掉电都会丢失,如果要升级根文件系统只有重新编译、烧录Linux内核;

(2)jffs2 专门针对Norflash设计的文件系统,小页的Nandflash也可以使用,只是效率不高;因为根文件系统存放在Flash上,所以根文件系统路径下的文件修改后掉电仍然存在;

(3)yaffs2 早期专门针对大页Nandflash设计的文件系统,他的源码独立于Linux内核维护着,所以可以在单片机等裸机环境下使用(只有该文件系统可以),linux内核想用它必须要打上补丁;在分区较大时,nandflash的挂载时间较长,现在逐渐被ubifs广泛替代;

(4)ubifs 专门针对Nandflash设计的一种文件系统,他在内核的MTD一层上面又建立了UBI一层,挂载速度、磨损均衡、读写速度非常快,目前nandflash上应用得最广的一种根文件系统;

    Linux操作系统之所以能够支持这么多种不同的文件系统,主要是通过叫做VFS的中间层对这些文件系统提供了完美的支持。对于用户来说,这些文件系统几乎是透明的,在大部分情况下,用户通过libc和kernel的VFS交互,不需要关心底层文件系统的具体实现,但是有时应用程序也需要考虑底层文件系统限制(比如fat vfat不支持链接,比如各个文件系统支持最大文件限制不同)。VFS主要有以下特性:

1. 向上,对应用层提供一个标准的文件操作接口,如open()、read()、write()、ioct()、close()等;
2. 对下,对所有文件系统提供一个统一的标准接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

4. 此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。

下图是Linux内核里文件系统的分层结构图:

FL2440 嵌入式Linux根文件系统制作

二、mtd-utils工具源码编译

    Linux内核MTD对同一Flash分区提供了两种设备文件给用户层使用,一种是/dev/mtdblockX块设备,该设备用来建立文件系统并挂载起来使用;另外一种相对应的/dev/mtdX字符设备,其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。而mtd-util就是以这些ioctl为基础而实现的工具,实现一些关于Flash的操作,如flash_erase、flash_eraseall、flashcp、nandwrite等命令,此外在PC上制作根文件系统所需要的一些工具也在里面,如制作JFFS2根文件系统用的mkfs.jffs2、制作UBIFS根文件系统工具mkfs.ubifs以及开发板上操作UBI文件系统的命令。

    这里我们只介绍PC端的源码编译来获取mkfs.jffs2和mkfs.ubifs工具,如果相应的工具需要放在ARM开发板上运行则需要使用交叉编译器编译。mtd_utils需要lzo、zlib和e2fsprogs这三个库,所以在编译mtd_utils之前先需要编译这三个库。Linux下使用源码安装工具时,如果有Makefile则直接用make命令编译,如果没有Makefile文件,则一般有个configure的脚本,该源码结构的编译三步曲:./configure、make、make install

2.1 创建mtd-utils的工作路径

[zusi@centos6_master ~]$ cd gitee/fl2440/

[zusi@centos6_master fl2440]$ mkdir -p x86_tools/mtd_utils

mtd-utils编译依赖lzo、zlib和libuuu这几个库,所以我们在编译它之前先要编译这些库。另外,为了在运行mkfs.jffs2和mkfs.ubifs这些命令时不依赖这些动态库,我们采用静态编译、然后静态链接生成这两个命令。

2.2 编译lzo库

[zusi@centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
[zusi@centos6_master mtd_utils]$ wget
http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
下载lzo库
[zusi@centos6_master mtd_utils]$ tar -xzf lzo-2.10.tar.gz
[zusi@centos6_master mtd_utils]$ cd lzo-2.10
[zusi@centos6_master lzo-2.10]$ ./configure --help 查看configure帮助信息,可
以看出他支持哪些参数

[zusi@centos6_master lzo-2.10]$ ./configure --prefix=`pwd`/../install --enable- static --disable-shared --prefix指定安装路径 --enable-static指定生产静态库 --disable- shared 指定不要生成动态库

[zusi@centos6_master lzo-2.10]$ make && make install

2.3 编译zlib库

[zusi@centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
[zusi@centos6_master mtd_utils]$ wget
https://github.com/madler/zlib/archive/v1.2.10.tar.gz -O zlib-1.2.10.tar.gz
[zusi@centos6_master mtd_utils]$ tar -xzf zlib-1.2.10.tar.gz
[zusi@centos6_master mtd_utils]$ cd zlib-1.2.10
[zusi@centos6_master zlib-1.2.10]$ ./configure --prefix=`pwd`/../install --static

[zusi@centos6_master zlib-1.2.10]$ make && make install

2.4 编译e2fsprogs库(libuuid)

[zusi@centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
[zusi@centos6_master mtd_utils]$ wget
https://github.com/tytso/e2fsprogs/archive/v1.43.7.tar.gz -O e2fsprogs-1.43.7.tar.gz
[zusi@centos6_master mtd_utils]$ tar -xzf e2fsprogs-1.43.7.tar.gz
[zusi@centos6_master mtd_utils]$ cd e2fsprogs-1.43.7/
[zusi@centos6_master e2fsprogs-1.43.7]$ ./configure --prefix=`pwd`/../install -- enable-elf-shlibs --enable-libuuid

[zusi@centos6_master e2fsprogs-1.43.7]$ make ; make install-libs

2.5 编译mtd-utils并安装mkfs.jffs2和mkfs.ubifs

[zusi@centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
[zusi@centos6_master mtd_utils]$ wget ftp://ftp.infradead.org/pub/mtd- utils/mtd-utils-1.5.2.tar.bz2
[zusi@centos6_master mtd_utils]$ tar -xjf mtd-utils-1.5.2.tar.bz2
[zusi@centos6_master mtd_utils]$
[zusi@centos6_master mtd-utils-1.5.2]$ export CFLAGS+=" -I../install/include/ "
[zusi@centos6_master mtd-utils-1.5.2]$ export CFLAGS+=" -I../install/include/ "
[zusi@centos6_master mtd-utils-1.5.2]$ export LDFLAGS+=" -L../install/lib/ - static "

[zusi@centos6_master mtd-utils-1.5.2]$ make WITHOUT_XATTR=1

安装接下来制作根文件系统所需的两个工具到系统中:

[zusi@centos6_master mtd-utils-1.5.2]$ sudo cp mkfs.jffs2 /bin/
[zusi@centos6_master mtd-utils-1.5.2]$ sudo cp mkfs.ubifs/mkfs.ubifs /bin/

[zusi@centos6_master mtd-utils-1.5.2]$ sudo cp ubi-utils/ubinize /bin/

三、内核调整Nandflash分区表

    FL2440上使用K9F2G08这个256MB的Nandflash,就像PC上的硬盘一样,我们也需要对整个Nandflash进行分区。只不过这个分区的过程是通过在Linux的源码修改来调整,接下来我们按照下面这个分区表来调整Linux系统的分区表。

FL2440 嵌入式Linux根文件系统制作

[zusi@centos6_master ~]$ cd gitee/fl2440/linux/linux-3.0

[zusi@centos6_master linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作

重新编译Linux内核并启动,这时我们就会发现内核启动时打印出新的分区信息

FL2440 嵌入式Linux根文件系统制作

登录开发板Linux后,我们也可以使用 cat /proc/mtd 命令查看分区信息

~ >: cat /proc/mtd

FL2440 嵌入式Linux根文件系统制作

开发板Linux系统的路径下会产生相应的分区文件,其中mtdX(X为0,1,2,3....)为可读写字符设备, mtdXro为只读的字符设备, mtdblockX为mount命令挂载使用的块设备。

~ >: ls -l /dev/mtd*

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作

四、jffs2根文件系统制作

4.1 jffs2文件系统简介

    JFFS2全名是 Journalling Flash File System Version2,是Redhat公司开发的Flash的文件系统,其前身是JFFS, 最早只支援Norflash, 自2.6版以后开始支援NAND Flash,其功能就是管理在MTD设备上实现的日志型文件系统,极适合使用于嵌入式系统。与其他的存储设备存储方案相比,JFFS2并不准备提供让传统文件系统也可以使用此类设备的转换层。它只会直接在MTD设备上实现日志结构的文件系统。JFFS2会在安装的时候,扫描MTD设备的日志内容,并在RAM中重新建立文件系统结构本身。除了提供具有断电可靠性的日志结构文件系统,JFFS2还会在它管理的MTD设备上实现“损耗平衡”和“数据压缩”等特性。下面是JFFS2的不足之处:

(1)JFFS2 的挂载(mount)过程需要对Flash从头到尾的扫描,这个过程是很慢的,我们在测试中发现,挂载一个 16M 的闪存有时需要半分钟以上的时间
(2)JFFS2 在分区的空间使用率比较大后,数据的读写非常缓慢
(3)JFFS2 对磨损平衡是用概率的方法来解决的,这很难保证磨损平衡的确定性。在某些情况下,可能造成对擦写块不必要的擦写操作;在某些情况下,又会引起对磨损平衡调整的不及时。

(4)JFFS2没有write-back机制,不能将资料暂存于缓存(cache), 以致于flash I/O的动作频繁。

    JFFS2是针对早起的Norflash和小页(页大小<4K)的Nandflash设计的,并不适合大页的Nandflash。所以我们一般在Norflash上使用JFFS2文件系统,而现在普遍使用的大页Nandflash并不适用它。

4.2 根文件系统镜像文件制作

[zusi@centos6_master ~]$ cd gitee/fl2440/linux/
[zusi@centos6_master linux]$ du -sh rootfs
12M rootfs
[zusi@centos6_master linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o
rootfs-jffs2.bin
制作根文件系统时不进行填充
[zusi@centos6_master linux]$ du -sh rootfs-jffs2.bin
6.3M rootfs-jffs2.bin 不进行填充的文件系统大小为6.3M
[zusi@centos6_master linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o

rootfs-jffs2.bin --pad=0xa00000

4.3 内核配置和编译

[zusi@centos6_master linux-3.0]$ export TERM=vt100

[zusi@centos6_master linux-3.0]$ make menuconfig

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作

因为禁用了initramfs重新编译Linux内核,新编译的内核不包含根文件系统所以文件较小。

[zusi@centos6_master linux-3.0]$ du -sh linuxrom-s3c2440.bin

2.4M linuxrom-s3c2440.bin

4.4 u-boot系统烧录和环境变量配置

    因为使用jffs2根文件系统启动的Linux内核不包含根文件系统,所以u-boot烧录Linux系统时需要同时烧录linux内核镜像(linuxrom-s3c2440.bin)和根文件系统镜像(rootfs-jffs2.bin),此外还要通过bootargs环境变量告诉Linux内核根文件系统所在的位置。这里Linux内核、根文件系统的烧录地址、bootargs传参应该与Linux内核里的Nandflash分区表相一致.

烧录Linux内核命令

[fl2440@lingyun]# tftp 30008000 linuxrom-s3c2440.bin 先将Linux内核下载到内存地址30008000上去
[fl2440@lingyun]# nand erase 100000 F00000 将Nandflash上Linux内核分区(即1M开始总共15M的空间)全部擦除

[fl2440@lingyun]# nand write 30008000 100000 400000 将Linux内核写入到Nandflash上的Linux内核分区上去

烧录根文件系统命令

[fl2440@lingyun]# tftp 30008000 rootfs-jffs2.bin 先将根文件系统下载到内存地址30008000上去
[fl2440@lingyun]# nand erase 1000000 2800000 将Nandflash上根文件系统分区(即16M开始总共40M的空间)全部擦除
[fl2440@lingyun]# nand write 30008000 1000000 $filesize 将根文件系统写入到Nandflash
上的根文件系统分区上去

u-boot设置烧录快捷方式

调试阶段我们可能经常需要烧录linux内核和根文件系统镜像,所以我们可以设置两个u-boot脚本变量:
[fl2440@lingyun]# set blx 'tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000
F00000;nand write 30008000 100000 400000'
[fl2440@lingyun]# set bjffs2 'tftp 30008000 rootfs-jffs2.bin;nand erase 1000000
2800000;nand write 30008000 1000000 $filesize'
以后我们在u-boot里想烧录根文件系统和Linux内核时,可以直接使用run blx 或 run bjffs2 命令完
成。

设置bootcmd和bootargs参数:

 开发板上电或重启运行u-boot时,如果不按任意键u-boot将进入正常加载模式,这时他将读取环境变量bootcmd来启动引导Linux内核。Linux内核是被烧录到Nandflash的0x100000位置上,所以uboot启动系统需要从该位置读取内核文件到内存相应位置中去,并且读取字节数应该不小于烧录的Linux镜像文件大小,否则系统将启动失败。根文件系统则通过bootargs参数告诉Linux内核,Linux内核在启动后根据该参数挂载相应的根文件系统,如果bootargs参数出错也将导致系统启动失败。

[fl2440@lingyun]# set bootcmd 'nand read 30008000 100000 400000; bootm 30008000'
[fl2440@lingyun]# set bootargs 'console=tty0 console=ttyS0,115200
root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd loglevel=7'

[fl2440@lingyun]# save

烧录过程

[fl2440@lingyun]# run blx 烧录Linux内核镜像

[fl2440@lingyun]# run bjffs2 烧录jffs2根文件系统镜像

4.5 启动和登录测试:

[fl2440@lingyun]# boot 直接使用boot命令启动,或重启开发板将自动启动

登录测试:

~ >: mount

FL2440 嵌入式Linux根文件系统制作

4.6 普通分区jffs2挂载

    jffs2除了可以制作成根文件系统使用以外,我们也可以在系统成功启动后,将其他分区以jffs2文件系统类型挂载使用。

~ >: dmesg | grep mtdblock  通过dmesg命令查看内核的分区情况

~ >: cat /proc/partitions  查看Linux内核分区表

~ >: ls -l /dev/mtdblock*  查看分区对应的块设备

这里我们以 mtdblock5 为例将其以jffs2文件系统格式挂载到 /info 挂载点上:

~ >: flash_eraseall /dev/mtd5  将mtdblock5分区全部擦除

~ >: mount -t jffs2 /dev/mtdblock5 /info/ 

~ >: mount mount    命令查看所有的文件系统挂载情况

~ >: touch /info/haha  在/info下创建文件haha 

~ >: ls /info/

haha 

~ >: reboot

系统重启后,并不会自动挂载/dev/mtdblock5到/info路径下,这时我们还是需要用命令手动挂载才能看到/info路径下的haha文件存在。

4.7 制作JFFS2根文件系统镜像的Shell脚本

[zusi@centos6_master linux]$ vim build_jffs2.sh

#! /bin/bash

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作

五、ubifs根文件系统制作

5.1 ubifs文件系统简介

    UBIFS(Unsorted Block Image File System,无排序区块图像文件系统)是用于固态存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。由于Nand Flash容量的暴涨,JFFS2、Yaffs2等皆无法操控大的Nand Flash空间,IBM、Nokia工程师Thomas Gleixner、Artem Bityutskiy等人2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈。真正开始开发于2007年,并于2008年10月第一次加入稳定版本于Linux核心2.6.27版,在设计与性能上均较优于YAFFS2、JFFS2,更实用于MLC NAND FLASH。因为UBIFS是直接工作在Raw Flash设备上(如Nandflash),所以他不能工作在SD卡、U盘这些常用的存储设备上,目前的安卓手机上绝大部分都是使用的UBIFS文件系统。关于UBIFS的更多信息请参考: http://www.linux-mtd.infradead.org/doc/ubifs.html
    传统的flash文件系统如Jffs2、yaffs2等是工作在MTD设备层之上,而UBIFS则建立在UBI卷层之上,
UBI卷层工作在MTD设备层之上。也可以说,UBIFS涉及三个子系统:

1. MTD 子系统,提供对flash芯片Raw的访问接口。 MTD子系统提供了MTD device的概念,比如/dev/mtdx(字符设备)和/dev/mtdblockX(块设备);
2. UBI Subsystem,它工作在MTD设备之上,提供了UBI逻辑卷(类似于Linux服务器上的LVM概念),对上层屏蔽了一些直接使用MTD设备需要处理的问题,如wear-leveling(磨损平衡算法)和volume management(坏块管理)功能等;

3. UBIFS文件系统,工作于UBI之上。它提供文件的open、read、write等操作;

5.2 根文件系统镜像文件制作

    我们可以使用mtd-utils源码编译出来的mkfs.jffs2工具,将根文件系统树目录制作成jffs2根文件系统镜像。在开始制作镜像之前,我们先看看mkfs.jffs2的使用说明:

[zusi@centos6_master ~]$ cd ~/gitee/fl2440/linux/

[zusi@centos6_master linux]$ mkfs.ubifs -h

[zusi@centos6_master linux]$ mkfs.ubifs -x lzo -m 2048 -e 129024 -c 300 -r  ./rootfs -o rootfs-ubifs.img

UBIFS是建立在UBI之上的文件系统,因此使用mkfs.ubifs制作的根文件系统镜像不能直接使用u-boot的nand write命令烧录,而需要在u-boot下使用ubi命令在根文件系统所在分区建立ubi卷之后才能烧录。但这种烧录方式比较麻烦,这时我们可以使用另外ubinize命令对rootfs-ubifs.img文件进行处理后就可以在u-boot上直接用nand write命令写入到根文件系统分区了。

首先我们需要创建ubinize的配置文件,然后再使用ubinize命令对image进行处理:

[zusi@centos6_master linux]$ vim ubinize.ini

[ubifs-volume]
mode=ubi
image=rootfs-ubifs.img
vol_id=0
vol_size=38707200
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize

vol_alignment=1

[zusi@centos6_master linux]$ ubinize -o rootfs-ubifs.bin -m 2048 -p 131072 -s 512 -O 512  ubinize.ini 

[zusi@centos6_master linux]$ du -h rootfs-ubifs.bin

8.3M rootfs-ubifs.bin

经过 ubinize 命令处理过后的根文件系统镜像文件rootfs-ubifs.bin 就可以直接在u-boot下使用nand write命令烧录到相应的根文件系统分区上去了。

5.3 内核配置和编译

    Linux内核需要重新make menuconfig配置做如下修改,编译并生成的Linux内核镜像文件才能支持UBIFS文件系统。

[zusi@centos6_master ~]$ cd ~/gitee/fl2440/linux/linux-3.0
[zusi@centos6_master linux-3.0]$ export TERM=vt100

[zusi@centos6_master linux-3.0]$ make menuconfig

FL2440 嵌入式Linux根文件系统制作

重新编译生成Linux内核uImage镜像文件:

[zusi@centos6_master linux-3.0]$ make
[zusi@centos6_master linux-3.0]$ mkimage -A arm -O linux -T kernel -C none -a
30008000 -e 30008040 -n "Linux Kernel" -d arch/arm/boot/zImage linuxrom- s3c2440.bin
[zusi@centos6_master linux-3.0]$ du -sh linuxrom-s3c2440.bin

2.5M linuxrom-s3c2440.bin

5.4 u-boot系统烧录和环境变量配置

    因为使用UBIFS根文件系统启动的Linux内核不包含根文件系统,所以u-boot烧录Linux系统时需要同时烧录linux内核镜像(linuxrom-s3c2440.bin)和根文件系统镜像(rootfs-ubifs.bin),此外还要通过bootargs环境变量告诉Linux内核根文件系统所在的位置。这里Linux内核、根文件系统的烧录地址、bootargs传参应该与Linux内核里的Nandflash分区表相一致.

[fl2440@lingyun]# set bootcmd 'nand read 30008000 100000 400000; bootm 30008000'
[fl2440@lingyun]# set blx 'tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000
F00000;nand write 30008000 100000 400000'
[fl2440@lingyun]# set bubifs 'tftp 30008000 rootfs-ubifs.bin;nand erase 1000000
2800000;nand write 30008000 1000000 $filesize'
[fl2440@lingyun]# set bootargs 'console=tty0 console=ttyS0,115200 ubi.mtd=2
root=ubi0:rootfs rootfstype=ubifs mem=64M noinitrd rw loglevel=7'

[fl2440@lingyun]# save

[fl2440@lingyun]# run blx 烧录Linux内核镜像

[fl2440@lingyun]# run bubifs 烧录根文件系统镜像

5.5 启动和登录测试

[fl2440@lingyun]# boot  直接使用boot命令启动,或重启开发板将自动启动

~ >: mount

FL2440 嵌入式Linux根文件系统制作

    因为UBIFS是建立在Nandflash上的根文件系统,在该文件系统路径下所有的文件修改掉电后都不会丢失。所以我们在根路径下创建haha文件后,把开发板重启发现该文件还存在。

~ >: pwd

/

~ >: touch haha 

~ >: reboot

5.6 普通分区ubifs挂载

    UBIFS除了可以制作成根文件系统使用以外,我们也可以在系统成功启动后,将其他分区以jffs2文件系统类型挂载使用。

~ >: cat /proc/mtd              查看MTD设备的分区情况

~ >: cat /proc/partitions     查看Linux内核分区表

~ >: ls -l /dev/mtdblock*    查看分区对应的块设备

5.6.2 在MTD上建立UBI卷

这里我们以 mtdblock3 为例将其以ubifs文件系统格式挂载到 /apps 挂载点上:

~ >: flash_eraseall /dev/mtd3                  使用flash_eraseall命令将mtd3所在分区全部擦除

~ >: ls /dev/ubi*                                       列出当前存在的ubi设备

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

~ >: ubiattach                                           查看ubiattach的使用方法

~ >: ubiattach -m 3 -d 3 /dev/ubi_ctrl     在mtd3上关联ubi3

~ >: ls /dev/ubi*                                       再查看ubi设备信息,将会多一个ubi3

/dev/ubi0 /dev/ubi0_0 /dev/ubi3 /dev/ubi_ctrl

~ >: ubimkvol                                           查看ubimkvol的帮助信息

~ >: ubimkvol -m -n 0 -N apps /dev/ubi3          在ubi3上建立UBI卷
~ >: ls /dev/ubi*                                                  再查看ubi设备信息,将会多一个ubi3_0

/dev/ubi0 /dev/ubi0_0 /dev/ubi3 /dev/ubi3_0 /dev/ubi_ctrl

5.6.3 UBIFS文件系统挂载

~ >: mount -t ubifs -o sync,noatime,rw ubi3:apps /apps/    挂载ubi3(即mtdblock3)到/apps挂载点上

~ >: mount                                                          查看当前所有的文件系统挂载信息

5.6.4 UBIFS文件系统卸载及重新挂载测试

~ >: umount /apps/                          卸载ubifs

UBIFS: un-mount UBI device 3, volume 0 

~ >: ubidetach -d 3 /dev/ubi_ctrl     解除ubi和mtd之间的关联

UBI: mtd3 is detached from ubi3 

~ >: ls /dev/ubi*                                查看UBI设备,现在ubi3相关的设备都消除

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

    我们再次关联ubi3到mtd3下的时候,因为之前已经在该分区上建立过UBI卷,所以再次建立UBI卷的话将会出错。这也意味着,如果之前已经用ubimkvol建立UBI卷的分区再次挂载时不需要在执行该命令,也即ubimkvol针对一个分区只能做一次,除非使用flash_eraseall重新格式化。

~ >: ubiattach -m 3 -d 3 /dev/ubi_ctrl 之前已经建立了卷,现在ubiattach之后就会存在ubi卷设备ubi3_0。
~ >: ls /dev/ubi*

/dev/ubi0 /dev/ubi0_0 /dev/ubi3 /dev/ubi3_0 /dev/ubi_ctrl 

~ >: ubimkvol -m -n 0 -N apps /dev/ubi3

ubimkvol: UBI_IOCMKVOL: Invalid argument

5.7 制作UBIFS根文件系统镜像的Shell脚本

[zusi@centos6_master linux]$ vim build_ubifs.sh

#! /bin/sh

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作

FL2440 嵌入式Linux根文件系统制作