热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JFFS2根文件系统制作

一.根文件系统简介 根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(

一.根文件系统简介

  根文件系统首先是内核启动时所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内核里文件系统的分层结构图:

根文件系统的制作主要流程:1、制作根文件系统目录树,里面包括启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件、2、交叉编译器的动态库以及链接,因为应用程序运行是需要链接交叉编译器的动态库才能运行3、安装编译busybox获取Linux系统相关命令4、init进程启动时的配置文件以及linux系统启动时执行的脚本(前面部分都属于根文件系统目录树的制作,我在最小系统移植的时候,制作了initramfs根文件系统时就已经做过,下面主要介绍JFFS2根文件系统的制作)5、调整Nandflash分区6、根文件系统的制作与烧录(当然每次制作根文件系统还需要修改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]$ wgetftp://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]# setblx'tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000
F00000;nand write 30008000 100000 400000'
[fl2440@lingyun]# setbjffs2'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=64Mu-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路径下

 


版权声明:本文为caijiwyj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/caijiwyj/article/details/89741025
推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
拍友2602937077
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有