JFFS2根文件系统制作

一.根文件系统简介

  根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如inittab、rcS)和服务加载到内存中去运行。

文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上却没有烧录文件系统,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。例如Linux启动时都需要有init目录下的相关文件,linux挂载分区时所依赖的信息存放于根文件系统/etc/fstab这个文件中;根文件系统中还包括了应用程序(如ls、mkdir、rm、ifconfig等命令)和 GNU C 库(glibc、eglibc或uclibc)等。

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中广泛使用)等。下面是几种常用的嵌入式根文件系统的对比:

initramfs是Linus开发的一种基于内存的根文件系统,在编译Linux内核的时候,它会直接把根文件系统树打包进内核的镜像文件中(zImage),这也意味着该镜像文件同时包含Linux内核根文件系统他在Linux系统启动后加载到内存中运行,所以速度快,但浪费内存,系统升级的时候内核和根文件系统一起升级比较方便。但因为initramfs是基于内存的根文件系统,所以在开发板上对根文件系统里的任何文件的操作,包括创建、删除、修改在重启后都会丢失如果要升级根文件系统只有重新编译、烧录Linux内核;

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

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

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

Linux所支持的文件系统高达十几个,之所以能够支持这么多种不同的文件系统,主要是通过叫做VFS的中间层对这些文件系统提供了完美的支持。所谓VFS就是Virtual File System虚拟文件系统。

VFS主要有以下特性:

1. 向上,对应用层提供一个标准的文件操作接口,如open()、read()、write()、ioct()、close()等;

2. 对下,对所有文件系统提供一个统一的标准接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

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

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

二.mtd-utils工具

mtd-utils工具使用户与交互的MTD在内核对flash设备进行操作。最常用的实用程序是:

flash_erase - 擦除flash块

flash_eraseall - 擦除整个flash设备

flashcp - 将数据复制到NOR闪存中

flash_info - 显示有关Flash设备的信息

flash_lock - 锁定flash以防止写入

flash_unlock - 解锁flash以允许写入

mkfs.jffs2 - 从现有文件系统创建JFFS2文件系统映像

mkfs.ubifs - 在PC上制作UBIFS根文件系统映像

nandwrite - 将文件(JFFS2或YAFFS2映像)写入nandflash设备

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

[wuyujun@wuyujunlocalhost ~]$ cd fl2440/

[wuyujun@wuyujunlocalhost fl2440]$ mkdir -p x86_tools/mtd_utils

[wuyujun@wuyujunlocalhost fl2440]$ cd x86_tools/mtd_utils/

编译lzo库:

[wuyujun@wuyujunlocalhost mtd_utils]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz

[wuyujun@wuyujunlocalhost mtd_utils]$ tar -xzf lzo-2.10.tar.gz

[wuyujun@wuyujunlocalhost mtd_utils]$ cd lzo-2.10/

[wuyujun@wuyujunlocalhost lzo-2.10]$ ./configure --help         查看configure帮助信息,可以看出他支持哪些参数

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

为了在运行mkfs.jffs2和mkfs.ubifs这些命令时不依赖这些动态库,我们采用静态编译、然后静态链接生成这两个命令

[wuyujun@wuyujunlocalhost lzo-2.10]$ make && make install

 

编译zlib库

[wuyujun@wuyujunlocalhost lzo-2.10]$ cd ~/fl2440/x86_tools/mtd_utils/      

[wuyujun@wuyujunlocalhost mtd_utils]$ wget https://github.com/madler/zlib/archive/v1.2.10.tar.gz -O zlib-1.2.10.tar.gz

[wuyujun@wuyujunlocalhost mtd_utils]$ tar -xzf zlib-1.2.10.tar.gz

[wuyujun@wuyujunlocalhost mtd_utils]$ cd zlib-1.2.10/

[wuyujun@wuyujunlocalhost zlib-1.2.10]$ ./configure --prefix=`pwd`/../install --static

[wuyujun@wuyujunlocalhost zlib-1.2.10]$ make && make install

 

编译e2fsprogs库(libuuid):

[wuyujun@wuyujunlocalhost zlib-1.2.10]$ cd ~/fl2440/x86_tools/mtd_utils/      

[wuyujun@wuyujunlocalhost mtd_utils]$ wget https://github.com/tytso/e2fsprogs/archive/v1.43.7.tar.gz -O e2fsprogs-1.43.7.tar.gz

[wuyujun@wuyujunlocalhost mtd_utils]$ tar -xzf e2fsprogs-1.43.7.tar.gz

[wuyujun@wuyujunlocalhost mtd_utils]$ cd e2fsprogs-1.43.7/

[wuyujun@wuyujunlocalhost e2fsprogs-1.43.7]$ ./configure --prefix=`pwd`/../install --enable-elf-shlibs --enable-libuuid

[wuyujun@wuyujunlocalhost e2fsprogs-1.43.7]$ make ; make install-libs

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

[wuyujun@wuyujunlocalhost mtd_utils]$ wget ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.5.2.tar.bz2

[wuyujun@wuyujunlocalhost mtd_utils]$ tar -xjf mtd-utils-1.5.2.tar.bz2

[wuyujun@wuyujunlocalhost mtd_utils]$ cd mtd-utils-1.5.2

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ export CFLAGS+=" -I../install/include/ "

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ export LDFLAGS+=" -L../install/lib/ -static "

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ make WITHOUT_XATTR=1

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

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ ls mkfs.jffs2

mkfs.jffs2 

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ ls mkfs.ubifs/mkfs.ubifs

mkfs.ubifs/mkfs.ubifs

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ sudo cp mkfs.jffs2 /bin/

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ sudo cp mkfs.ubifs/mkfs.ubifs /bin/

[wuyujun@wuyujunlocalhost mtd-utils-1.5.2]$ sudo cp ubi-utils/ubinize /bin/

三.内核调整Nandflash分区表

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

调整分区前先做个备份

[wuyujun@wuyujunlocalhost linux-3.0]$ cp arch/arm/plat-s3c24xx/common-smdk.c arch/arm/plat-s3c24xx/common-smdk_backup.c

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

/* NAND parititon from 2.4.18-swl5 */

static struct mtd_partition smdk_default_nand_part[] =

        {

                [0] = {

                        .name = "mtdblock0 u-boot 1MB",

                        .offset = 0,

                        .size = SZ_1M*1, /* 0x0000000 ~ 0x0100000 */

                },

                [1] = {

                        .name = "mtdblock1 kernel 15MB",

                        .offset = MTDPART_OFS_NXTBLK,

                        .size = SZ_1M*15, /* 0x0100000 ~ 0X1000000 */

                },

                [2] = {

                        .name = "mtdblock2 rootfs 40MB",

                        .offset = MTDPART_OFS_NXTBLK,

                        .size = SZ_1M*40,

                },

                [3] = {

                        .name = "mtdblock3 apps 80MB",

                        .offset = MTDPART_OFS_NXTBLK,

                        .size = SZ_1M*80,

                },

                [4] = {

                        .name = "mtdblock4 data 80MB",

                        .offset = MTDPART_OFS_NXTBLK,

                        .size = SZ_1M*80,

                },

                [5] = {

                        .name = "mtdblock5 backup 40MB",

                        .offset = MTDPART_OFS_NXTBLK,

                        .size = SZ_1M*40,

                }

        };

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

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

jffs2根文件系统介绍

JFFS2的全名为JournallingFlashFileSystemVersion2(闪存日志型文件系统第2版),其功能就是管理在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并不适用它。

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

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

mkfs.jffs2: error!: Usage: mkfs.jffs2 [OPTIONS]

Make a JFFS2 file system image from an existing directory tree

Options:

-p, --pad[=SIZE] Pad output to SIZE bytes with 0xFF. If SIZE is 指

定jffs2文件系统镜像的填充大小

not specified, the output is padded to the end of the final erase block

-r, -d, --root=DIR Build file system from directory DIR (default: cwd) 指定根文件系统目录树的路径

-s, --pagesize=SIZE Use page size (max data node size) SIZE. 指定Nandflash的页大小

Set according to target system's memory management page size (default: 4KiB)

-e, --eraseblock=SIZE Use erase block size SIZE (default: 64KiB) 指定Nandflash的块大小

-c, --cleanmarker=SIZE Size of cleanmarker (default 12)

-m, --compr-mode=MODE Select compression mode (default: priority)

-x, --disable-compressor=COMPRESSOR_NAME Disable a compressor

-X, --enable-compressor=COMPRESSOR_NAME Enable a compressor

-y, --compressor-priority=PRIORITY:COMPRESSOR_NAME Set the priority of a compressor

-L, --list-compressors Show the list of the available compressors

-t, --test-compression Call decompress and compare with the original (fortest)

-n, --no-cleanmarkers Don't add a cleanmarker to every eraseblock 指定不添加清除标记

-o, --output=FILE Output to FILE (default: stdout)指定制作出来的根文件系统镜像文件名

-l, --little-endian Create a little-endian filesystem

-b, --big-endian Create a big-endian filesystem

-D, --devtable=FILE Use the named FILE as a device table file

-f, --faketime Change all file times to '0' for regression testing

-q, --squash Squash permissions and owners making all files be owned by root

-U, --squash-uids Squash owners making all files be owned by root

-P, --squash-perms Squash permissions on all files

--with-xattr stuff all xattr entries into image

--with-selinux stuff only SELinux Labels into jffs2 image

--with-posix-acl stuff only POSIX ACL entries into jffs2 image

-h, --help Display this help text

-v, --verbose Verbose operation

-V, --version Display version information

-i, --incremental=FILE Parse FILE and generate appendage output for it

 

[wuyujun@wuyujunlocalhost linux]$ cd ~/fl2440/linux/    

[wuyujun@wuyujunlocalhost linux]$ du -sh rootfs

12M     rootfs     根文件系统目录树的大小12M

[wuyujun@wuyujunlocalhost linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin   制作根文件系统时不进行填充 

[wuyujun@wuyujunlocalhost linux]$ du -sh rootfs-jffs2.bin

6.3M    rootfs-jffs2.bin   不进行填充的文件系统大小为6.3M

[wuyujun@wuyujunlocalhost linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin --pad=0xa00000    

[wuyujun@wuyujunlocalhost linux]$ du -sh rootfs-jffs2.bin

10M     rootfs-jffs2.bin

-n 指明不添加清除标记(nand flash 有自己的校检块,存放相关的信息),如果挂载后会出现下面类似警告信息,则加上-n 就会消失:

CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0

-s 指定Nandflash的页大小为2KB

-e 指定Nandflash的擦除块大小为128KB

-d 指定根文件系统目录树的路径 为./rootfs

-o 指定制作生成的根文件系统镜像文件名为 rootfs-jffs.bin,该文件需要u-boot烧录到Nandflash的相应分区

--pad=0xa00000 将制作的根文件系统镜像(rootfs-jffs2.bin)文件大小用0xFF填充为--pad指定的值如果在制作根文件系统的不填充的话,Linux挂载启动根文件系统时将会出现下面警告信息

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x006430dc: 0x5555

instead

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x006430e0: 0x5555

Instead

之前的Linux内核Nandflash分区修改里将rootfs分区大小设置为40M,所以这里的--pad值应该为0x280000(40M)。但如果使用0x2800000,则根文件系统镜像的大小就为40M,这样u-boot下载烧录的时间较长,另外如果在Nandflash上烧录该镜像文件的分区存在坏块的话,则在u-boot里用nandwrite烧录时会跳过坏块溢出到下一个分区空间中去,从而占用了下一个空间的使用,系统就会出错。这里我们将填充大小值设置为10M是也可以解决上面jffs2_scan_eraseblock抛出的警告信息,之所以将填充大小设置为10M是因为不进行填充时制作的根文件系统镜像大小为6.3M,这个值的大小根据分区大小和根文件系统目录树的实际大小进行调整,填充的值要比不填充时的大但是也不能太大

内核配置和编译

General setup --->

[ ] Automatically append version information to the version string 取消这选项减少内核大小  

[ ] Support for paging of anonymous memory (swap)          Nandflash不需要swap分区,如果是PC上的硬盘则需要swap分区

 <*> Kernel .config support

[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support    Initial RAM filesystem and RAM disk (initramfs/initrd) support 一定要取消initramfs的支持,否则内核找到initramfs则直接使用initramfs启动 

  -*- Configure standard kernel features (expert users)  --->                                      

[*] Embedded system   添加这个选项

File systems  --->          

< > Second extended fs support          取消PC端用的ext2文件系统支持,减内核大小                                                             

< > Ext3 journalling file system support        取消PC端用的ext3文件系统支持,减内核大小                                                  

< > The Extended 4 (ext4) filesystem    取消PC端用的ext4文件系统支持,减内核大小

  < > Kernel automounter version 4 support (also supports v3)   取消这个选项减内核大小                                     

< > FUSE (Filesystem in Userspace) support    取消这个选项减少内核大小

CD-ROM/DVD Filesystems  --->     

< > ISO 9660 CDROM file system support      取消这个光驱光盘选项,减少核大小                                                      

   < > UDF file system support                取消这个光驱光盘选项,减少内核大小

DOS/FAT/NT Filesystems  --->     

<*> MSDOS fs support                                                                              

  <*> VFAT (Windows-95) fs support            添加Windows的FAT文件系统持,U盘或SD卡中会使用                                                      

(437) Default codepage for FAT                                                                     

(iso8859-1) Default iocharset for FAT                                                              

<*> NTFS file system support         添加Windows的NTFS文件系统支持,U盘或SD卡中会使用                                                    

[ ]   NTFS debugging support                                                                    

[*]   NTFS write support       

Pseudo filesystems  --->

 <*> Userspace-driven configuration filesystem  添加sysfs伪文件系统支持

[*] Miscellaneous filesystems  --->

<*>   Journalling Flash File System v2 (JFFS2) support 添加JFFS2文件系统支持                                                                 

    (0)     JFFS2 debugging verbosity (0 = quiet, 2 = noisy)                                                      

[*]     JFFS2 write-buffering support                                                                             

   [ ]       Verify JFFS2 write-buffer reads

[*]     JFFS2 summary support (EXPERIMENTAL)                                                         

  [ ]     JFFS2 XATTR support (EXPERIMENTAL)                           

[ ]     Advanced compression options for JFFS2     其他文件系统如果不要的话都不要选                  

< >   LogFS file system (EXPERIMENTAL)           

< >   Compressed ROM file system support (cramfs)   如果不用的话,取消cramfs文件系统的支持                                               

< >   SquashFS 4.0 - Squashed file system support   如果不用的话,取消SquashFS文件系统的支持    

[*] Network File Systems  --->

 --- Network File Systems                                                                                          

   <*>   NFS client support                                                                                        

[*]     NFS client support for NFS version 3      

[*]       NFS client support for the NFSv3 ACL protocol extension                                 

[ ]     NFS client support for NFS version 4   

[*]   Root file system on NFS   将其他不需要的网络文件系统都不要选                                                               

< >   NFS server support                                                                          

< >   Ceph distributed file system (EXPERIMENTAL)        

< >   CIFS support (advanced network filesystem, SMBFS successor)                  

< >   NCP file system support (to mount NetWare volumes)             

< >   Coda file system support (advanced network fs)                                              

< >   Andrew File System support (AFS) (EXPERIMENTAL)

Partition Types  --->       

[ ]   PC BIOS (MSDOS partition tables) support  取消这个选项减少内核大小

-*- Native language support  ---> U盘的挂载可能需要下面这些语言编码的支持,譬如简体中文的CP936和GB2312等

(iso8859-1) Default NLS Option                                                                                            

<*>   Codepage 437 (United States, Canada)

<*>   Simplified Chinese charset (CP936, GB2312)                                                                 

<*>   Traditional Chinese charset (Big5)   

<*>   ASCII (United States)                                                                                        

<*>   NLS ISO 8859-1  (Latin 1; Western European Languages)       

<*>   NLS UTF-8      

 

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

[wuyujun@wuyujunlocalhost linux-3.0]$ du -sh linuxrom-s3c2440.bin

2.4M    linuxrom-s3c2440.bin

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

u-boot的烧录地址应该是 0,大小不超过1M。该分区对应Linux内核分区表的/dev/mtdblock0;Linux内核的烧录地址应该是0x100000(1M的偏移量处),大小不超过15M。该分区对应Linux内核分区表的/dev/mtdblock1;根文件系统镜像的烧录地址应该是0x1000000(16M的偏移量处),大小不超过40M。该分对应Linux内核分区表的/dev/mtdblock2

[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 命令完成 

[fl2440@lingyun]# set bootcmd 'nand read 30008000 100000 400000; bootm 30008000'      设置bootcmd参数,启动时执行的命令

[fl2440@lingyun]# set bootargs 'console=tty0 console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd loglevel=7'

bootargs的参数解析如下:
console=tty0 指定内核控制终端为LCD,内核启动信息输出到LCD上;console=ttyS0,115200 指定内核控制终端也为第一个串口,使用波特率115200,这样内核启动信息也打印到第一个串口上;
root=/dev/mtdblock2 指定根文件系统存放在mtdblock2上,该值应该与u-boot烧录位置、Linux内核分区保持一致;如果错误则Linux内核会因找不到根文件系统而启动失败;
rootfstype=jffs2 指定根文件系统类型为jffs2,如果该参数错误则内核启动失败;
init=/linuxrc 指定init进程执行/linuxrc这个程序,他会解析并执行/etc/inittab下的命令;mem=64M u-boot告诉Linux内核有64M的内存;rw 根文件系统以读写的形式挂载;noinitrd 没有使用initrd;loglevel=7 定义内核printk的打印级别为7,即所有信息都通过console打印出来; 

[fl2440@lingyun]# boot

 

普通分区jffs2挂载   

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

~ >: dmesg | grep mtdblock

Kernel command line: console=tty0 console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd loglevel=7

0x000000000000-0x000000100000 : "mtdblock0 u-boot 1MB"

0x000000100000-0x000001000000 : "mtdblock1 kernel 15MB"

0x000001000000-0x000003800000 : "mtdblock2 rootfs 40MB"

0x000003800000-0x000008800000 : "mtdblock3 apps 80MB"

0x000008800000-0x00000d800000 : "mtdblock4 data 80MB"

0x00000d800000-0x000010000000 : "mtdblock5 backup 40MB"      

~ >: cat /proc/partitions

major minor  #blocks  name

 

  31        0       1024 mtdblock0

  31        1      15360 mtdblock1

  31        2      40960 mtdblock2

  31        3      81920 mtdblock3

  31        4      81920 mtdblock4

  31        5      40960 mtdblock5   

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

~ >: mount -t jffs2 /dev/mtdblock5 /info/      挂载mtdblock5分区到/info/目录下 

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

 

设置让系统启动时自动将/dev/mtdblock5以jffs2文件系统格式挂载到/info路径下

[wuyujun@wuyujunlocalhost ~]$ cd fl2440/linux/rootfs/etc/init.d/     

[wuyujun@wuyujunlocalhost init.d]$ vim S55_mount_info   

#!/bin/sh

        mount -t jffs2 /dev/mtdblock5 /info/  

[wuyujun@wuyujunlocalhost init.d]$ cd ~/fl2440/linux/

[wuyujun@wuyujunlocalhost linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin --pad=0xa00000

烧录到开发板        

[fl2440@lingyun]#run bjffs2

可以发现开机就/dev/mtdblock5以jffs2文件系统格式挂载到/info路径下

猜你喜欢

转载自blog.csdn.net/caijiwyj/article/details/89741025