精华内容
下载资源
问答
  • 根文件系统制作

    千次阅读 2018-10-02 23:05:55
    根文件系统是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行 。 Linux启动时,第一个...

    Linux启动时,第一个必须挂载的是根文件系统;将基本的初始化脚本和服务等加载到内存中去运行

    若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。

    linux 下的根文件系统制作主要采用busybox来进行制作

    下载busybox: https://busybox.net/downloads/busybox-1.6.0.tar.bz2

    解压busybox
    # tar -xvf busybox-1.6.0.tar.bz2 .

    编译busybox: 怎么编译在INSTALL中有说明

    在进行编译时需要指定编译器和编译平台

    # vi Makefile

    # make menuconfig

    在 make  menuconfig  选择了静态编译,指令了安装路径

    具体项的配置说明可参考百度文库中的这个链接,大神写的很详细

    https://wenku.baidu.com/view/5d25420602020740be1e9b0b.html

    # make && make install 

    编译时出现了两个错误

    修改文件 applets/applets.c 第 21 行, 将 #error Aborting compilation. 注释

    这个是编译工具链 netfilter.h 中少头文件 添加头文件:#include <netinet/in.h>

    这样就解决了busybox的编译问题

    # make ARCH= arm CROSS_COMPILE=arm-linux-  这条命令中指定编译平台和编译器
    
    # make CONFIG_PREFIX=/home/book/workspace/rootfs install  指定安装路径,

    编译安装完成后在/home/book/workspace/rootfs会生成 bin, sbin linuxrc软连接文件(dev文件我后来创建的)

    创建成功后接下来还需做什么工作呢?(借鉴大神图http://blog.csdn.net/czg13548930186

    mdev作用是在系统启动和热插拔或动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的,mdev是通过init进程来启动的,在使用mdev构造/dev目录之前,init至少要用到设备文件/dev/console, dev/null,所以需要事先建立这两个设备文件

    1,创建设备节点dev/console,dev/null

    mkdir dev
    
    cd dev
    
    sudo mknod console c 5 1 
    
    sudo mknod null c 1 3 

    为什么主次设备号为5,1 和1,3 我们可以查看linux系统中的这两设备号

    2. 创建必要的文件目录

    # mkdir etc lib proc  sys root mnt tmp 

    3. 构造/etc/inittab

     添加文件(可以参照busybox中的example)

    vi  etc/inittab 
    #/etc/inittab 
    
    ::sysinit:/etc/init.d/rcS        /* 具体含义参考 http://blog.sina.com.cn/s/blog_aa9fb81a0102wbbe.html */
    
    ttySAC0::askfirst:-/bin/sh   /* /bin/sh是一个程序,会把标准输出、标准输入、标准错误定位到ttySAC0里面去,0号串号*/
    
    ::ctrlaltdel:/sbin/reboot
    
    ::shutdown:/bin/umount -a -r 

    4. 添加库文件(我们的库文件是基于编译器的,所以拷贝的是编译器的库文件)

    将编译器中此目录的库文件拷贝到lib中

    cp *.so*  ~/workspace/rootfs/lib -d   // -d含义是带软连接拷贝

    接下来就是来配置etc目录了:

    touch etc/inittab etc/fstab
    
    touch etc/init.d/rcS -p

    既然/etc/inittab 是第一个执行的文件 ,那么从此文件中我们看到有个sysinit ,所以我们需要在/etc 下创建一个rcS文件。

    这个文件里面我们可以添加想自动执行的文件,如配置电脑的ip,挂载/etc/fstab指定的文件系统等.

    #!/bin/sh
    
    ifconfig eth0 192.168.0.100
    
    mount -a   //mount 某一具体的文件系统也行这里是mount所有。
    
     mount -t tmpts mdev /dev      //使用内存文件系统,减少对flash的读写
    
     mkdir /dev/pts                     //用来支持外部网络链接的虚拟终端       
    
    mount -t devpts devpts    /dev/pts   
    
    mount -t sysfs sysfs /sys     //mdev通过sysfs文件系统获取设备信息
    
    echo    /sbin/mdev/    > /proc/sys/kernel/hotplug  //设置内核,当有设备插拔时调用/bin/mdev程序
    
    mdev    -s         //在/dev 目录下生成内核支持的所有设备的节点

    然后给文件添加执行权限

    # chmod +x  etc/init.d/rcS
    # chmod 777 profile inittab profile

    mount -a 到底mount是什么东西呢?

    它mount的是/etc/fstab中指定的文件系统 ,所以我们需要创建一个fstab

    #device      mount_point    type     options    dump    fsck    order
    
      proc         /proc         proc     defaults    0        0    
    
      tempfs       /tmp          tmpfs    default      0        0
    
      sysfs        /sys          sysfs      default     0        0
    
      tmpfs        /dev          tmpfs    default     0        0

     

    创建完这个个主要的目录文件后,我们还需要创建其他的文件,他们可以为空

    mkdir  proc mnt tmp sys root  

    这样一个简单的根文件系统就做好了,我们可以通过网络挂载的方式去使用这个文件系统,当然也可以将这个跟问价系统烧到我们的开发板中去使用,但是烧到开发板中使用,我们就得将这个文件打包成镜像文件,需要使用到的工具: mkyaffsimage,

    mkdyaffsimage rootfs rootfs.yaffs

    使用tftp烧写:

    tftp  0x30000000  rootfs.yaffs   
    
    nand erase  0xA0000000   0x36000000   //擦除指定地址的空间
    
    nand write.yaffs  0x30000000   0xA0000000  (镜像的大小)

    如果在开发板的文件系统中显示出现问题

    不是:

    而是:[\u@\h \W] \$这种形式的

    需要在menuconfig 中添加支持

     

     

     

     

     

    展开全文
  • 嵌入式根文件系统一般都是使用busybox 1.下载 https://busybox.net/ 我没安装git工具,我就直接下载源码了 我们就下载一个19.2的版本 放入linux系统中某个目录,解压 需改顶层Makefile nfs服务器搭建,...

    嵌入式根文件系统一般都是使用busybox

    1.下载

    https://busybox.net/

    我没安装git工具,我就直接下载源码了

    我们就下载一个19.2的版本

    放入linux系统中某个目录,解压

    需改顶层Makefile

    nfs服务器搭建,参考我的这篇文章

    https://blog.csdn.net/qq_16777851/article/details/81516978

     

    make menuconfig

    选择配置

    1.指定安装路径

    Settings  --->  
        --- Installation Options ("make install" behavior) 
        (/home/run/work/rootfs/) Destination path for 'make install'  

    2.去掉简要安装,我们调试驱动需要详细的

    Linux Module Utilities  --->   
        [ ] Simplified modutils                                                         
        [*] depmod (26 kb)                                                             
        [*] insmod (22 kb)                                                             
        [*] lsmod (4.3 kb)                                                                               
        [*]   Pretty output (NEW)                                                                             
        [*] modinfo (25 kb)                                                             
        [*] modprobe (29 kb)                                                          
        [*]   Blacklist support (NEW)                                                     
        [*] rmmod (3.6 kb)        

    3.静态库编译busybox

     Settings  ---> 
        [*] Build static binary (no shared libs)

    4.设置,命令行风格和网络配置

     Settings  ---> 
        --- Library Tuning   
            [*] Support /etc/networks     
            [*]   vi-style line editing commands   

    5.mdev配置

    Linux System Utilities  --->     
         [*] mdev (16 kb)                                                               
         [*]   Support /etc/mdev.conf                                                   
         [*]     Support subdirs/symlinks                                              
         [*]       Support regular expressions substitutions when renaming device        
         [*]     Support command execution at device addition/removal                    
         [*]   Support loading of firmware 

    上面的好多都是选中的,这里只是确认一下,宁可多选,不要少选。

    编译

    出现了一系列错误,找不到头文件

    后来换了一个编译器就可以了

    红框框起来的就是she生成的可执行文件

    make install

    会安装到我们前面指定的文件夹中

    可以看到已经有了

     

    把该目录导出到nfs服务器的目录下

    打开,添加,重启nfs服务器

     sudo vi /etc/exports
    
    /home/run/work/rootfs *(rw,sync,no_root_squash,no_subtree_check)
    
    sudo /etc/init.d/nfs-kernel-server restart

    这个是我重新搭建的一个虚拟机上做了所以ip地址有了小改变

    其中从机地址是192.168.0.103,nfs文件系统目录和上面添加的一致就可以。

    bootargs=root=/dev/nfs nfsroot=192.168.0.103:/home/run/work/rootfs \
    ip=192.168.0.20:192.168.0.103:192.168.0.1:255.255.255.0::eth0:off \
    init=/linuxrc console=ttySAC2,115200

     

    tfttp下载uImage ,bootm启动

    发现已经可以启动了,命令行也能敲,就是不听的打印open /dev/tty信息,主要是我们还没增加rcS文件

     

    1.在rootfs中添加常用的目录

    mkdir dev mnt proc var tmp sys root lib
    

    2.拷贝动态链接库

    从你的交叉编译工具链的lib目录下

    先通过find命令找到.so文件的目录

     cp /usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/libc/lib/ lib/ -a

    lib文件的大小5.2M

    去掉库文件的符号信息

     

    如果构建最简单的文件系统可以直接拷贝,busybox的如下目录

    examples/bootfloppy/etc

     

     

    我为了今后开发方便就多添加一些内容

    3.制作inittab文件

    inittab的规则和作用在busybox/example/inittab文件里面有详细说明

    #first:run the system script file
    ::sysinit:/etc/init.d/rcS
    ::askfirst:-/bin/sh
    ::ctrlaltdel:-/sbin/reboot
    #umount all filesystem
    ::shutdown:/bin/umount -a -r
    #restart init process
    ::restart:/sbin/init

    4.制作rcS文件

    先创建文件夹

    /rootfs/etc$ mkdir init.d
    

    在init.d文件夹下创建rcS文件

    #!/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    runlevel=S
    prevlevel=N
    
    umask 022
    
    export PATH runlevel prevlevel
    
    mount -a
    
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    
    /bin/hostname -F /etc/sysconfig/HOSTNAME
    
    ifconfig eth0 192.168.1.10
    

    5.添加fstab

     vi etc/fstab
    
    # /etc/fstab: static file system information.
    #
    # Use 'vol_id --uuid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    #
    # 	<file system> 	<mount point> 	<type> 	<options> 	<dump> 	<pass>
    	proc 			/proc 			proc 	defaults 	0 		0
    	sysfs 			/sys 			sysfs 	defaults 	0 		0
    	tmpfs 			/var 			tmpfs 	defaults 	0 		0
    	tmpfs 			/tmp 			tmpfs 	defaults 	0 		0
    	tmpfs 			/dev 			tmpfs 	defaults 	0 		0
    
    

    6.添加profile

    # Ash profile
    # vim: syntax=sh
    
    # No core files by default
    ulimit -S -c 0 > /dev/null 2>&1
    
    USER="`id -un`"
    LOGNAME=$USER
    PS1='[\u@\h \W]\# '
    PATH=$PATH
    `hostname run`
    HOSTNAME=`hostname`
    
    export USER LOGNAME PS1 PATH
    
    

     

    ok,重新启动linux

     

    ok已经可以运行了,唯一就是rcS我们在linux系统下是普通用户作的

    添加管理员权限给这个文件

    顺便给其它文件也添加权限

     

    重新启动,可看到,已经正常启动,无论是hosrname,还是网卡ip都ok

    同时查看sysfs文件系统和proc文件系统

     

     

    遇到的问题nfs启动时已经传过来了本机ip地址,所以rcS文件不再需要设置本机地址,否则会出现下面的情况

     

    在非nfs启动时可以加上,用来设置默认ip,我这里因为要nfs启动就注释掉了

    #!/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    runlevel=S
    prevlevel=N
    
    umask 022
    
    export PATH runlevel prevlevel
    
    mount -a
    
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    
    /bin/hostname -F /etc/sysconfig/HOSTNAME
    
    #ifconfig eth0 192.168.1.10
    
    

    查看sysfs文件系统和proc文件系统。如果有内容,就可以确信网络根文件系统制作好了。

     

    已经有内容的网络文件系统好了,制作各种格式的镜像格式就不再说了,大家可以百度,很多博客都有说的。

    展开全文
  • 嵌入式Linux根文件系统制作

    千次阅读 2018-01-21 20:36:49
    嵌入式Linux根文件系统制作 一、根文件系统简介  根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的第...
    嵌入式Linux根文件系统制作

    一、根文件系统简介
        根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(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中广泛使用)等。下面是几种常用的嵌入式根文件系统的对比:
              initramfs 该文件系统直接将根文件系统直接打包进Linux内核里(只有这种文件系统具有该功能),这样内核和根文件系统绑定在一块成为一个单独的文件,他在Linux系统启动后加载到内存中运行,所以速度快,但浪费内存,系统升级的时候内核和根文件系统一起升级比较方便。但因为他是基于内存的文件系统,所以系统掉电后针对根文件系统下所有文件的修改掉电都会丢失,如果要升级根文件系统只有重新编译、烧录Linux内核;
              jffs2 专门针对Norflash设计的文件系统,小页的Nandflash也可以使用,只是效率不高;因为根文件系统存放在Flash上,所以根文件系统路径下的文件修改后掉电仍然存在;
              yaffs2 早期专门针对大页Nandflash设计的文件系统,他的源码独立于Linux内核维护着,所以可以在单片机等裸机环境下使用(只有该文件系统可以),linux内核想用它必须要打上补丁;在分区较大时,nandflash的挂载时间较长,现在逐渐被ubifs广泛替代;
              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内核里文件系统的分层结构图:
    二、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的工作路径
    [wudongxu@centos6_master ~]$ cd gitee/fl2440/
    [wudongxu @centos6_master fl2440]$ mkdir -p x86_tools/mtd_utils
        mtd-utils编译依赖lzo、zlib和libuuu这几个库,所以我们在编译它之前先要编译这些库。另外,为了在运行mkfs.jffs2和mkfs.ubifs这些命令时不依赖这些动态库,我们采用静态编译、然后静态链接生成这两个命令。

    2.2 编译lzo库
    [wudongxu @centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
    [wudongxu @centos6_master mtd_utils]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz 下载lzo库
    [wudongxu @centos6_master mtd_utils]$ tar -xzf lzo-2.10.tar.gz
    [wudongxu @centos6_master mtd_utils]$ cd lzo-2.10
    [wudongxu @centos6_master lzo-2.10]$ ./configure --help 查看configure帮助信息,可以看出他支持哪些参数
    [wudongxu @centos6_master lzo-2.10]$ ./configure --prefix=`pwd`/../install --enable- static --disable-shared --prefix指定安装路径 --enable-static指定生产静态库 --disable- shared 指定不要生成动态库
    [wudongxu @centos6_master lzo-2.10]$ make && make install

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

    2.4 编译e2fsprogs库(libuuid)
    [wudongxu @centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
    [wudongxu @centos6_master mtd_utils]$ wget https://github.com/tytso/e2fsprogs/archive/v1.43.7.tar.gz -O e2fsprogs-1.43.7.tar.gz
    [wudongxu @centos6_master mtd_utils]$ tar -xzf e2fsprogs-1.43.7.tar.gz
    [wudongxu @centos6_master mtd_utils]$ cd e2fsprogs-1.43.7/
    [wudongxu @centos6_master e2fsprogs-1.43.7]$ ./configure --prefix=`pwd`/../install -- enable-elf-shlibs --enable-libuuid
    [wudongxu @centos6_master e2fsprogs-1.43.7]$ make ; make install-libs

    2.5 编译mtd-utils并安装mkfs.jffs2和mkfs.ubifs
    [wudongxu @centos6_master ~]$ cd ~/gitee/fl2440/x86_tools/mtd_utils/
    [wudongxu @centos6_master mtd_utils]$ wget ftp://ftp.infradead.org/pub/mtd- utils/mtd-utils-1.5.2.tar.bz2
    [wudongxu @centos6_master mtd_utils]$ tar -xjf mtd-utils-1.5.2.tar.bz2
    [wudongxu @centos6_master mtd_utils]$
    [wudongxu @centos6_master mtd-utils-1.5.2]$ export CFLAGS+=" -I../install/include/ "
    [wudongxu @centos6_master mtd-utils-1.5.2]$ export CFLAGS+=" -I../install/include/ "
    [wudongxu @centos6_master mtd-utils-1.5.2]$ export LDFLAGS+=" -L../install/lib/ - static "
    [wudongxu @centos6_master mtd-utils-1.5.2]$ make WITHOUT_XATTR=1

    安装接下来制作根文件系统所需的两个工具到系统中:
    [wudongxu @centos6_master mtd-utils-1.5.2]$ sudo cp mkfs.jffs2 /bin/
    [wudongxu @centos6_master mtd-utils-1.5.2]$ sudo cp mkfs.ubifs/mkfs.ubifs /bin/
    [wudongxu @centos6_master mtd-utils-1.5.2]$ sudo cp ubi-utils/ubinize /bin/

    三、内核调整Nandflash分区表
    FL2440上使用K9F2G08这个256MB的Nandflash,就像PC上的硬盘一样,我们也需要对整个Nandflash进行分区。只不过这个分区的过程是通过在Linux的源码修改来调整,接下来我们按照下面这个分区表来调整Linux系统的分区表。
    [wudongxu @centos6_master ~]$ cd gitee/fl2440/linux/linux-3.0
    [wudongxu @centos6_master linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c
    /* NAND pa
    rititon 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, }
    };
    static struct s3c2410_nand_set smdk_nand_sets[] = {
    重新编译Linux内核并启动,这时我们就会发现内核启动时打印出新的分区信息
    S3C24XX NAND Driver, (c) 2004 Simtec Electronics
    s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
    s3c24xx-nand s3c2440-nand: NAND soft ECC
    NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
    Scanning device for bad blocks
    Bad eraseblock 94 at 0x000000bc0000
    Bad eraseblock 418 at 0x000003440000
    Bad eraseblock 713 at 0x000005920000
    Bad eraseblock 1144 at 0x000008f00000
    Bad eraseblock 1940 at 0x00000f280000
    Bad eraseblock 2010 at 0x00000fb40000
    Creating 6 MTD partitions on "NAND":
    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" dm9000 Ethernet Driver, V1.31
    eth0: dm9000a at c4862300,c4864304 IRQ 51 MAC: 08:00:3e:26:0a:5b (chip)
    登录开发板Linux后,我们也可以使用 cat /proc/mtd 命令查看分区信息
    ~ >: cat /proc/mtd
    dev: size erasesize name
    mtd0: 00100000 00020000 "mtdblock0 u-boot 1MB"
    mtd1: 00f00000 00020000 "mtdblock1 kernel 15MB"
    mtd2: 02800000 00020000 "mtdblock2 rootfs 40MB"
    mtd3: 05000000 00020000 "mtdblock3 apps 80MB"
    mtd4: 05000000 00020000 "mtdblock4 data 80MB"
    mtd5: 02800000 00020000 "mtdblock5 backup 40MB" 开发板Linux系统的路径下会产生相应的分区文件,其中mtdX(X为0,1,2,3....)为可读写字符设备, mtdXro为只读的字符设备, mtdblockX为mount命令挂载使用的块设备。
    ~ >: ls -l /dev/mtd* crw-rw---- 1 root root 90, 0 Jan 1 00:00 /dev/mtd0
    crw-rw---- 1 root root 90, 1 Jan 1 00:00 /dev/mtd0ro
    crw-rw---- 1 root root 90, 2 Jan 1 00:00 /dev/mtd1
    crw-rw---- 1 root root 90, 3 Jan 1 00:00 /dev/mtd1ro
    crw-rw---- 1 root root 90, 4 Jan 1 00:00 /dev/mtd2
    crw-rw---- 1 root root 90, 5 Jan 1 00:00 /dev/mtd2ro
    crw-rw---- 1 root root 90, 6 Jan 1 00:00 /dev/mtd3
    crw-rw---- 1 root root 90, 7 Jan 1 00:00 /dev/mtd3ro
    crw-rw---- 1 root root 90, 8 Jan 1 00:00 /dev/mtd4
    crw-rw---- 1 root root 90, 9 Jan 1 00:00 /dev/mtd4ro
    crw-rw---- 1 root root 90, 10 Jan 1 00:00 /dev/mtd5
    crw-rw---- 1 root root 90, 11 Jan 1 00:00 /dev/mtd5ro
    brw-rw---- 1 root root 31, 0 Jan 1 00:00 /dev/mtdblock0
    brw-rw---- 1 root root 31, 1 Jan 1 00:00 /dev/mtdblock1
    brw-rw---- 1 root root 31, 2 Jan 1 00:00 /dev/mtdblock2
    brw-rw---- 1 root root 31, 3 Jan 1 00:00 /dev/mtdblock3
    brw-rw---- 1 root root 31, 4 Jan 1 00:00 /dev/mtdblock4
    brw-rw---- 1 root root 31, 5 Jan 1 00:00 /dev/mtdblock5
    四、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的不足之处:
    JFFS2 的挂载(mount)过程需要对Flash从头到尾的扫描,这个过程是很慢的,我们在测试中发
    现,挂载一个 16M 的闪存有时需要半分钟以上的时间
    JFFS2 在分区的空间使用率比较大后,数据的读写非常缓慢
    JFFS2 对磨损平衡是用概率的方法来解决的,这很难保证磨损平衡的确定性。在某些情况下,可
    能造成对擦写块不必要的擦写操作;在某些情况下,又会引起对磨损平衡调整的不及时。
    JFFS2没有write-back机制,不能将资料暂存于缓存(cache), 以致于flash I/O的动作频繁。
    JFFS2是针对早起的Norflash和小页(页大小<4K)的Nandflash设计的,并不适合大页的Nandflash。
    所以我们一般在Norflash上使用JFFS2文件系统,而现在普遍使用的大页Nandflash并不适用它。
    4.2 根文件系统镜像文件制作
    我们可以使用mtd-utils源码编译出来的mkfs.jffs2工具,将根文件系统树目录制作成jffs2根文件系统
    镜像。在开始制作镜像之前,我们先看看mkfs.jffs2的使用说明:
    [wudongxu @centos6_master linux]$ mkfs.jffs2 -h
    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 (for
    test)
    -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
    下载我们开始使用根文件系统树制作JFFS2根文件系统镜像:
    [wudongxu @centos6_master ~]$ cd gitee/fl2440/linux/
    [wudongxu @centos6_master linux]$ du -sh rootfs
    12M rootfs
    [wudongxu @centos6_master linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o
    rootfs-jffs2.bin 制作根文件系统时不进行填充
    [wudongxu @centos6_master linux]$ du -sh rootfs-jffs2.bin
    6.3M rootfs-jffs2.bin 不进行填充的文件系统大小为6.3M
    [wudongxu @centos6_master linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o
    rootfs-jffs2.bin --pad=0xa00000
    -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。但如果使用0x2800000,则根文件系统镜像的大小就为40M,这样u-boot下载烧
    录的时间较长,另外如果在Nandflash上烧录该镜像文件的分区存在坏块的话,则在u-boot里用nand
    write烧录时会跳过坏块溢出到下一个分区空间中去,从而占用了下一个空间的使用,系统就会出错。这
    里我们将填充大小值设置为10M是也可以解决上面jffs2_scan_eraseblock抛出的警告信息,之所以将
    填充大小设置为10M是因为不进行填充时制作的根文件系统镜像大小为6.3M,这个值的大小根据分区
    大小和根文件系统目录树的实际大小进行调整。
    4.3 内核配置和编译
    [wudongxu @centos6_master linux-3.0]$ export TERM=vt100
    [wudongxu @centos6_master linux-3.0]$ make menuconfig
    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 一定要
    取消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
    其他文件系统如果不需要的话都不要选
    < > Compressed ROM file system support (cramfs) 如果不用的
    话,取消cramfs文件系统的支持
    < > SquashFS 4.0 - Squashed file system support 如果不用的
    话,取消SquashFS文件系统的支持
    < > ROM file system support 如果不用的
    话,取消ROM文件系统的支持
    [*] 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内核,新编译的内核不包含根文件系统所以文件较小。
    [wudongxu @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分区表相一致:
    u-boot的烧录地址应该是 0,大小不超过1M。该分区对应Linux内核分区
    表的/dev/mtdblock0;
    Linux内核的烧录地址应该是0x100000(1M的偏移量处),大小不超过15M。该分区对应Linux
    内核分区表的/dev/mtdblock1;
    根文件系统镜像的烧录地址应该是0x1000000(16M的偏移量处),大小不超过40M。该分区对
    应Linux内核分区表的/dev/mtdblock2;
    烧录Linux内核命令
    [wudongxu ]# tftp 30008000 linuxrom-s3c2440.bin 先将Linux内核下载到内存地址
    30008000上去
    [wudongxu ]# 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
    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]# run blx 烧录Linux内核镜像
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:00:3e:26:0a:5b
    could not establish link
    Using dm9000 device
    TFTP from server 192.168.2.2; our IP address is 192.168.2.222
    Filename 'linuxrom-s3c2440.bin'.
    Load address: 0x30008000
    Loading: #################################################################
    #################################################################
    ####################################
    done
    Bytes transferred = 2432984 (251fd8 hex)
    NAND erase: device 0 offset 0x100000, size 0xf00000
    Skipping bad block at 0x00bc0000
    Erasing at 0xfe0000 -- 100% complete.
    OK
    NAND write: device 0 offset 0x100000, size 0x400000
    4194304 bytes written: OK
    [fl2440@lingyun]# run bjffs2 烧录jffs2根文件系统镜像
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:00:3e:26:0a:5b
    could not establish link
    Using dm9000 device
    TFTP from server 192.168.2.2; our IP address is 192.168.2.222
    Filename 'rootfs-jffs2.bin'.
    Load address: 0x30008000
    Loading: T #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    done
    Bytes transferred = 10485760 (a00000 hex)
    NAND erase: device 0 offset 0x1000000, size 0x2800000
    Skipping bad block at 0x03440000
    Erasing at 0x37e0000 -- 100% complete.
    OK
    NAND write: device 0 offset 0x1000000, size 0xa00000
    10485760 bytes written: OK
    4.5 启动和登录测试:
    [fl2440@lingyun]# boot 直接使用boot命令启动,或重启开发板将自动启动
    NAND read: device 0 offset 0x100000, size 0x400000
    4194304 bytes read: OK
    ## Booting kernel from Legacy Image at 30008000 ...
    Image Name: Linux Kernel
    Created: 2017-11-07 19:26:55 UTC
    Image Type: ARM Linux Kernel Image (uncompressed)
    Data Size: 2432920 Bytes = 2.3 MiB
    Load Address: 30008000
    Entry Point: 30008040
    Verifying Checksum ... OK
    XIP Kernel Image ... OK
    OK
    Starting kernel ...
    Uncompressing Linux... done, booting the kernel.
    Linux version 3.0.0 (guowenxue@centos6.localdomain) (gcc version 4.4.6
    (crosstool-NG 1.16.0) ) #10 Wed Nov 8 03:26:11 CST 2017
    CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
    ... ... ...
    S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz
    CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
    Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
    下面是u-boot的bootargs传的参数: Kernel command line: console=tty0 console=ttyS0,115200 root=/dev/mtdblock2
    rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd loglevel=7
    PID hash table entries: 256 (order: -2, 1024 bytes)
    ... ... ...
    S3C24XX NAND Driver, (c) 2004 Simtec Electronics
    s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
    s3c24xx-nand s3c2440-nand: NAND soft ECC
    NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-
    bit)
    Scanning device for bad blocks
    Bad eraseblock 94 at 0x000000bc0000
    Bad eraseblock 418 at 0x000003440000
    Bad eraseblock 713 at 0x000005920000
    Bad eraseblock 1144 at 0x000008f00000
    Bad eraseblock 1940 at 0x00000f280000
    Bad eraseblock 2010 at 0x00000fb40000
    Creating 6 MTD partitions on "NAND": 内核分区表
    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"
    dm9000 Ethernet Driver, V1.31
    eth0: dm9000a at c4856300,c4858304 IRQ 51 MAC: 08:00:3e:26:0a:5b (chip)
    usbmon: debugfs is not available
    ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
    ... ... ...
    drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
    usb 1-1: new full speed USB device number 2 using s3c2410-ohci
    usb 1-1: device descriptor read/64, error -62
    usb 1-1: device descriptor read/64, error -62
    usb 1-1: new full speed USB device number 3 using s3c2410-ohci
    usb 1-1: device descriptor read/64, error -62
    VFS: Mounted root (jffs2 filesystem) on device 31:2. Linux内核找到并以JFFS2格式挂
    载根文件系统,如果bootargs传参有误则Linux内核将死在这里。
    Freeing init memory: 108K
    usb 1-1: device descriptor read/64, error -62
    usb 1-1: new full speed USB device number 4 using s3c2410-ohci
    usb 1-1: device not accepting address 4, error -62
    usb 1-1: new full speed USB device number 5 using s3c2410-ohci
    usb 1-1: device not accepting address 5, error -62
    hub 1-0:1.0: unable to enumerate USB device on port 1
    dm9000 dm9000.0: eth0: link down
    Copyright (C) 2012 LingYun I.o.T Studio< iot-yun.com >
    Default Logon Username: root Password: 123456
    LingYunFL2440 login:
    登录测试: ~ >: mount
    rootfs on / type rootfs (rw)
    /dev/root on / type jffs2 (rw,relatime) 根路径(/)所挂载的文件系统即为根文件系统
    proc on /proc type proc (rw,relatime)
    usbfs on /proc/bus/usb type usbfs (rw,relatime)
    tmpfs on /dev type tmpfs (rw,relatime)
    ramfs on /tmp type ramfs (rw,relatime)
    sysfs on /sys type sysfs (rw,relatime)
    devpts on /dev/pts type devpts (rw,relatime,mode=600)
    因为JFFS2是建立在Nandflash上的根文件系统,在该文件系统路径下所有的文件修改掉电后都不会丢
    失。所以我们在根路径下创建haha文件后,把开发板重启发现该文件还存在。
    ~ >: pwd
    /~ >: touch haha ~ >: reboot
    4.6 普通分区jffs2挂载
    jffs2除了可以制作成根文件系统使用以外,我们也可以在系统成功启动后,将其他分区以jffs2文件系统
    类型挂载使用。
    ~ >: dmesg | grep mtdblock 通过dmesg命令查看内核的分区情况
    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 查看Linux内核分区表
    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 ~ >: ls -l /dev/mtdblock* 查看分区对应的块设备
    brw-rw---- 1 root root 31, 0 Jan 1 00:00 /dev/mtdblock0
    brw-rw---- 1 root root 31, 1 Jan 1 00:00 /dev/mtdblock1
    brw-rw---- 1 root root 31, 2 Jan 1 00:00 /dev/mtdblock2
    brw-rw---- 1 root root 31, 3 Jan 1 00:00 /dev/mtdblock3
    brw-rw---- 1 root root 31, 4 Jan 1 00:00 /dev/mtdblock4
    brw-rw---- 1 root root 31, 5 Jan 1 00:00 /dev/mtdblock
    这里我们以 mtdblock5 为例将其以jffs2文件系统格式挂载到 /info 挂载点上:
    ~ >: flash_eraseall /dev/mtd5 将mtdblock5分区全部擦除
    Erasing 128 Kibyte @ 1a60000 - 65% complete.
    Skipping bad block at 0x01a80000
    Erasing 128 Kibyte @ 2320000 - 87% complete.
    Skipping bad block at 0x02340000
    Erasing 128 Kibyte @ 2800000 - 100% complete. ~ >: mount -t jffs2 /dev/mtdblock5 /info/ ~ >: mount mount命令查看所有的文件系统挂载情况
    rootfs on / type rootfs (rw)
    /dev/root on / type jffs2 (rw,relatime)
    proc on /proc type proc (rw,relatime)
    usbfs on /proc/bus/usb type usbfs (rw,relatime)
    tmpfs on /dev type tmpfs (rw,relatime)
    ramfs on /tmp type ramfs (rw,relatime)
    sysfs on /sys type sysfs (rw,relatime)
    devpts on /dev/pts type devpts (rw,relatime,mode=600)
    /dev/mtdblock5 on /info type jffs2 (rw,relatime)
    ~ >: touch /info/haha 在/info下创建文件haha ~ >: ls /info/
    haha ~ >: reboot
    系统重启后,并不会自动挂载/dev/mtdblock5到/info路径下,这时我们还是需要用命令手动挂载才能
    看到/info路径下的haha文件存在。
    4.7 制作JFFS2根文件系统镜像的Shell脚本
    [guowenxue@centos6_master linux]$ vim build_jffs2.sh
    #!/bin/sh
    #+-------------------------------------------------------------------------------
    -------------
    #|Description: This shell script is used to generate a JFFS2 rootfs for K9F2G08
    nandflash
    #| Author: GuoWenxue <guowenxue@gmail.com> QQ: 281143292
    #| ChangeLog:
    #| 1, Initialize 1.0.0 on 2012.04.18
    #| Reference:
    #+-------------------------------------------------------------------------------
    ------------- # u-boot setup bootargs env :
    # set bjffs2 'tftp 30800000 rootfs-jffs2.bin;nand erase 1000000 2800000;nand write 30800000
    1000000 $filesize' # set bootargs 'console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc
    mem=64M rw noinitrd loglevel=7' VERSION=1.0.0
    ROOTFS_DIR=./rootfs
    IMAGE_NAME=rootfs-jffs2.bin
    INSTALL_PATH=/tftp
    #===========================================
    # Shell script body start here +
    #===========================================
    # k9f2g08 nand flash page size is 2KiB
    page_size=2048
    # k9f2g08 has 64pages per block, so erase block size is 64*2KiB=128KiB
    erase_size=128KiB
    # jffs2 root filesystem image padding by 0xFF size, if not padded system will
    throw some noisy warnnings as:
    # jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x006430dc: 0x5555 instead
    # jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x006430dc: 0x5555 instead
    # The generate root file system images (rootfs-jffs2.bin) without padding is about 6.3M, and root
    filesystem partition is about 40M, # we just padding 10M is enuf. pad_size=0xa00000
    if [ ! -d $ROOTFS_DIR ] ; then
    echo "decompress rootfs tree..."
    sudo tar -xjf $ROOTFS_DIR.tar.bz2
    fi
    echo ""
    echo "generating $IMAGE_NAME file by mkfs.jffs2..."
    echo "mkfs.jffs2 -n -s $page_size -e $erase_size -d $ROOTFS_DIR -o $IMAGE_NAME --
    pad=$pad_size"
    echo ""
    mkfs.jffs2 -n -s $page_size -e $erase_size -d $ROOTFS_DIR -o $IMAGE_NAME --
    pad=$pad_size
    sudo chmod a+x $IMAGE_NAME
    if [ -d $INSTALL_PATH ] ; then
    cp $IMAGE_NAME $INSTALL_PATH
    fi
    4.8 思考
    如何设置让系统启动时自动将/dev/mtdblock5以jffs2文件
    系统格式挂载到/info路径下?
    五、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的更多信息请参
    传统的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等操作;
    作为新一代文件系统新贵,他具有如下特性:
    可扩展性: UBIFS对Flash 尺寸有着很好的扩展性; 也就是说文件系统挂载时间,内存消耗以
    及I/O速度都不依赖于Flash的大小; UBIFS可以很好的运行在GB级的 flashe设备; 当然UBI本身
    还是有扩展性的问题,无论如何 UBI/UBIFS都比JFFS2的可扩展性好,如果UBI成为瓶颈,可以
    改进UBI而不需改变UBIFS本身;
    快速挂载:不像JFFS2,UBIFS在挂载阶段不需要扫描整个文件系统,UBIFS mount的时间只
    是毫秒级,时间不依赖于Flash的大小;然而UBI的初始化时间依赖Flash的大小,因此必须把这
    个时间考虑在内。
    write-back 支持:文件的改变并不是立刻提交到flash media上,而是cache这些修改,直到达
    到写入的条件,这减少了I/O的数目因此改善I/O性能和系统性能。回写本身也是文件系统的标准
    技术,由于数据没有立刻写入flash, 回写带来了突然掉电就会存在数据丢失的风险。相反, JFFS2
    不支持write-back, JFFS2文件系统的所有变化都是立刻同步到flash介质上。同JFFS2的writethrough(立即写入内存)相比可以显著的提高文件系统的吞吐量。
    容忍不清洁的重启:UBIFS是日志文件系统,所以容忍突然关闭和不清洁的重启。UBIFS会回
    放日志并从不切底的重启中恢复过来。这时挂载时间会有点慢。但由于只是需要重做日志,而不
    需要扫描储存介质,所以性能影响不大。
    快速I/O:即使回写功能被禁能(例如在挂载时加入“-o sync”的参数),UBIFS也表现良
    好,接近jffs2。在同步I/O方面UBIFS是极难与jffs2相抗争的。因为jffs2在flash维护数据索引结
    构,不需要额外的开销,而UBIFS需要。然而UBIFS依然是很快,因为它依靠日志。它不需要把
    数据物理地从一个地方移动到另一个地方,仅把有关信息加入文件系统的索引以及为新日志挑选
    一个擦除块。
    快速压缩:与jffs2相似,UBIFS支持数据压缩储存。对于单个文件的储存,UBIFS可以使能/禁
    能压缩功能。
    自恢复功能:有数据索引有损坏的情况下,UBIFS可以恢复过来。在UBIFS每一块信息有描述
    整个信息的数据头。在扫描介质的情况下这数据头信息可以重建。而在FAT文件系统,发生这样
    的事件是致命的。
    数据的完整性:UBIFS在每次写入数据时都会对数据进行核实,以确保数据的完整性。UBIFS
    不会容忍任何不可用的数据或元数据。然而为了加快数据的读写速度,用户可以关闭CRC检查。
    5.2 根文件系统镜像文件制作
    我们可以使用mtd-utils源码编译出来的mkfs.jffs2工具,将根文件系统树目录制作成jffs2根文件系统镜
    像。在开始制作镜像之前,我们先看看mkfs.jffs2的使用说明:
    [guowenxue@centos6_master ~]$ cd ~/gitee/fl2440/linux/
    [guowenxue@centos6_master linux]$ mkfs.ubifs -h
    Usage: mkfs.ubifs [OPTIONS] target
    Make a UBIFS file system image from an existing directory tree
    Examples:
    Build file system from directory /opt/img, writting the result in the ubifs.img
    file
    mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img ubifs.img
    The same, but writting directly to an UBI volume
    mkfs.ubifs -r /opt/img /dev/ubi0_0
    Creating an empty UBIFS filesystem on an UBI volume
    mkfs.ubifs /dev/ubi0_0
    Options:
    -r, -d, --root=DIR build file system from directory DIR, 指定根文件系统目录
    树的路径 -m, --min-io-size=SIZE minimum I/O unit size Nand Flash的最小读
    写单元,一般为page size。
    -e, --leb-size=SIZE logical erase block size 逻辑擦除块的大小 -c, --max-leb-cnt=COUNT maximum logical erase block count 逻辑擦除块的个数,
    与分区大小有关 -o, --output=FILE output to FILE 输出的根文件系统镜
    像文件 -j, --jrn-size=SIZE journal size
    -R, --reserved=SIZE how much space should be reserved for the super-user
    -x, --compr=TYPE compression type - "lzo", "favor_lzo", "zlib" or
    "none" (default: "lzo")
    -X, --favor-percent may only be used with favor LZO compression and defines
    how many percent better zlib should compress to make
    mkfs.ubifs use zlib instead of LZO (default 20%)
    -f, --fanout=NUM fanout NUM (default: 8)
    -F, --space-fixup file-system free space has to be fixed up on first mount
    (requires kernel version 3.0 or greater)
    -k, --keyhash=TYPE key hash type - "r5" or "test" (default: "r5")
    -p, --orph-lebs=COUNT count of erase blocks for orphans (default: 1)
    -D, --devtable=FILE use device table FILE
    -U, --squash-uids squash owners making all files owned by root
    -l, --log-lebs=COUNT count of erase blocks for the log (used only for
    debugging)
    -y, --yes assume the answer is "yes" for all questions
    -v, --verbose verbose operation
    -V, --version display version information
    -g, --debug=LEVEL display debug information (0 - none, 1 - statistics,
    2 - files, 3 - more details)
    -h, --help display this help text
    Note, SIZE is specified in bytes, but it may also be specified in Kilobytes,
    Megabytes, and Gigabytes if a KiB, MiB, or GiB suffix is used.
    If you specify "lzo" or "zlib" compressors, mkfs.ubifs will use this compressor
    for all data. The "none" disables any data compression. The "favor_lzo" is not
    really a separate compressor. It is just a method of combining "lzo" and "zlib"
    compressors. Namely, mkfs.ubifs tries to compress data with both "lzo" and "zlib"
    compressors, then it compares which compressor is better. If "zlib" compresses 20
    or more percent better than "lzo", mkfs.ubifs chooses "lzo", otherwise it chooses
    "zlib". The "--favor-percent" may specify arbitrary threshold instead of the
    default 20%.
    The -F parameter is used to set the "fix up free space" flag in the superblock,
    which forces UBIFS to "fixup" all the free space which it is going to use. This
    option is useful to work-around the problem of double free space programming: if
    the
    flasher program which flashes the UBI image is unable to skip NAND pages
    containing
    only 0xFF bytes, the effect is that some NAND pages are written to twice - first
    time
    when flashing the image and the second time when UBIFS is mounted and writes
    useful
    data there. A proper UBI-aware flasher should skip such NAND pages, though. Note,
    this
    flag may make the first mount very slow, because the "free space fixup" procedure
    takes time. This feature is supported by the Linux kernel starting from version
    3.0.
    [guowenxue@centos6_master linux]$ mkfs.ubifs -x lzo -m 2048 -e 129024 -c 300 -r
    ./rootfs -o rootfs-ubifs.img
    -x lzo 指定使用lzo压缩方法,默认是lzo,还支持zlib,zlib压缩率高些,但
    是lzo压缩解压速度快 。
    -m 2048 Nand Flash的最小读写单元,一般为page size,K9F2G08的页大小
    为2048字节。
    -r ./rootfs 指定根文件系统目录树的路径
    -o rootfs-ubifs.img 指定制作出的根文件系统镜像文件名
    -e 129024 指定LEB(Logical Erase Block,逻辑擦除块)大小。大家知道
    Nandflash读写单位为页,擦除单位为块,一个设备有多个块,一个块有多个页,K9F2G08
    Nandflash一个块是64个页,而一个页大小为2048字节。这样一个PEB(Physical Eraseblock
    Size,物理擦除块)大小就是2048*64=131072,-e的算法是物理擦除块大小-1*页大小,这里
    就是131072-1*2048=129024
    -c 300 指定该分区最大逻辑擦除块数量,该值随着根文件系统分区的大小和
    该分区的坏块数调整。该值很重要,不能大也不能小,太小也要大于image大小,太大mount有
    问题。计算起点是分区的物理块数量,比如40MiB的mtd分区,物理擦除块数量是
    40*1024*1024/2048/64 = 320个,需要减去2个volume table的块,1个wear-leveling块,1
    个atomic LEB change块,以及一些坏块处理的保留块。因为一个分区上有多少个坏块是随机
    的,一般做法是做一个坏块容忍数,比如16个,不要担心这个会浪费空间,ubinize的
    autoresize选项就是解决这个问题的。在这里我们最终的逻辑擦除块个数计算公式为: 320-
    2(volume table)-1(Wear-leveling)-1(atomic LEB change)-16(坏块容量数)=300
    UBIFS官方关于逻辑擦除块大小的说明
    UBIFS是建立在UBI之上的文件系统,因此使用mkfs.ubifs制作的根文件系统镜像不能直接使用u-boot
    的nand write命令烧录,而需要在u-boot下使用ubi命令在根文件系统所在分区建立ubi卷之后才能烧
    录。但这种烧录方式比较麻烦,这时我们可以使用另外ubinize命令对rootfs-ubifs.img文件进行处理后
    就可以在u-boot上直接用nand write命令写入到根文件系统分区了。该命令的使用方法如下:
    [guowenxue@centos6_master linux]$ ubinize -h
    ubinize version 1.4.9 - a tool to generate UBI images. An UBI image may contain
    one or more UBI volumes which have to be defined in the input configuration
    ini-file. The ini file defines all the UBI volumes - their characteristics and
    the and the contents, but it does not define the characteristics of the flash
    the UBI image is generated for. Instead, the flash characteristics are defined
    via the command-line options. Note, if not sure about some of the command-line
    parameters, do not specify them and let the utility to use default values.
    INI-file format.
    The input configuration ini-file describes all the volumes which have to
    be included to the output UBI image. Each volume is described in its own
    section which may be named arbitrarily. The section consists on
    "key=value" pairs, for example:
    [jffs2-volume]
    mode=ubi
    image=../jffs2.img
    vol_id=1
    vol_size=30MiB
    vol_type=dynamic
    vol_name=jffs2_volume
    vol_flags=autoresize
    vol_alignment=1
    This example configuration file tells the utility to create an UBI image
    with one volume with ID 1, volume size 30MiB, the volume is dynamic, has
    name "jffs2_volume", "autoresize" volume flag, and alignment 1. The
    "image=../jffs2.img" line tells the utility to take the contents of the
    volume from the "../jffs2.img" file. The size of the image file has to be
    less or equivalent to the volume size (30MiB). The "mode=ubi" line is
    mandatory and just tells that the section describes an UBI volume - other
    section modes may be added in the future.
    Notes:
    * size in vol_size might be specified kilobytes (KiB), megabytes (MiB),
    gigabytes (GiB) or bytes (no modifier);
    * if "vol_size" key is absent, the volume size is assumed to be
    equivalent to the size of the image file (defined by "image" key);
    * if the "image" is absent, the volume is assumed to be empty;
    * volume alignment must not be greater than the logical eraseblock size;
    * one ini file may contain arbitrary number of sections, the utility will
    put all the volumes which are described by these section to the output
    UBI image file.
    Usage: ubinize [-o filename] [-p <bytes>] [-m <bytes>] [-s <bytes>] [-O <num>] [-e
    <num>]
    [-x <num>] [-Q <num>] [-v] [-h] [-V] [--output=<filename>] [--
    peb-size=<bytes>]
    [--min-io-size=<bytes>] [--sub-page-size=<bytes>] [--vid-hdroffset=<num>]
    [--erase-counter=<num>] [--ubi-ver=<num>] [--image-seq=<num>] [--
    verbose] [--help]
    [--version] ini-file
    Example: ubinize -o ubi.img -p 16KiB -m 512 -s 256 cfg.ini - create UBI image
    'ubi.img' as described by configuration file 'cfg.ini'
    -o, --output=<file name> output file name 处理后输出的镜像文件名 -p, --peb-size=<bytes> size of the physical eraseblock of the flash 物理擦
    除块大小
    this UBI image is created for in bytes,
    kilobytes (KiB), or megabytes (MiB)
    (mandatory parameter)
    -m, --min-io-size=<bytes> minimum input/output unit size of the flash
    nandflash页大小
    in bytes
    -s, --sub-page-size=<bytes> minimum input/output unit used for UBI
    headers, e.g. sub-page size in case of NAND
    flash (equivalent to the minimum input/output
    unit size by default)
    -O, --vid-hdr-offset=<num> offset if the VID header from start of the
    physical eraseblock (default is the next
    minimum I/O unit or sub-page after the EC
    header)
    -e, --erase-counter=<num> the erase counter value to put to EC headers
    (default is 0)
    -x, --ubi-ver=<num> UBI version number to put to EC headers
    (default is 1)
    -Q, --image-seq=<num> 32-bit UBI image sequence number to use
    (by default a random number is picked)
    -v, --verbose be verbose
    -h, --help print help message
    -V, --version print program version
    首先我们需要创建ubinize的配置文件,然后再使用ubinize命令对image进行处理:
    [guowenxue@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
    配置文件说明:
    mode=ubi
    image=rootfs-ubifs.img 指定mkfs.ubifs制作生成的根文件系统镜像文件路径;
    vol_id=0 指定根文件系统树的卷标为0,u-boot的bootargs参数需要根据它来设置;
    vol_size=38707200 指定该UBI逻辑卷的大小,该值计算公式一般为 逻辑擦除块大小*逻辑擦除块个数
    =129024*300=38707200。该值一般不用写,默认值是image大小。写了这个作用是帮助检查image是否超过了
    分区限制,制作时候就提示,否则mount会出错。逻辑擦除块个数的值是经过计算的最大值了,不过autoresize
    参数会自适应大小,不会浪费空间的,后面Linux系统内核启动过程中可以看到这个现象。
    vol_type=dynamic
    vol_name=rootfs 指定UBI卷的名称,u-boot的bootargs参数需要根据它来设置;
    vol_flags=autoresize UBI Subsystem在系统启动时自动调整逻辑擦除块的个数
    vol_alignment=1
    [guowenxue@centos6_master linux]$ ubinize -o rootfs-ubifs.bin -m 2048 -p 131072 -s 512 -O 512
    ubinize.ini
    -o rootfs-ubifs.bin 指定ubinize处理后输出的image文件名,该文件可以由u-boot的nand write命令
    直接烧录
    -m 2048 指定minimum input/output unit大小,为nandflash的页大小。
    -p 131072 指定物理擦除块大小: 64 Page*2048 Byte/Page = 131072
    -s 512 指定sub-page-size大小,页大小为2048字节的nandflash对应值为512;对于其他的
    Nandflash可以在Linux内核跑起来后挂载ubifs后查看该值
    -O 512 指定vid-hdr-offset值,默认为sub-page-size的值,可以省略不用。
    [guowenxue@centos6_master linux]$ du -h rootfs-ubifs.bin
    8.3M rootfs-ubifs.bin
    经过 ubinize 命令处理过后的根文件系统镜像文件rootfs-ubifs.bin 就可以直接在u-boot下使用nand write
    命令烧录到相应的根文件系统分区上去了。
    关于Minim Flash input/output、sub-pages、UBI Header的说
    5.3 内核配置和编译
    Linux内核需要重新make menuconfig配置做如下修改,编译并生成的Linux内核镜像文件才能支持
    UBIFS文件系统。
    [guowenxue@centos6_master ~]$ cd ~/gitee/fl2440/linux/linux-3.0
    [guowenxue@centos6_master linux-3.0]$ export TERM=vt100
    [guowenxue@centos6_master linux-3.0]$ make menuconfig
    General setup --->
    [ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support 一定
    要取消initamfs,否则内核找到initramfs根文件系统的话就直接使用他启动了。 Device Drivers --->
    <*> Memory Technology Device (MTD) support --->
    < > RedBoot partition table parsing
    < > FTL (Flash Translation Layer) support
    < > NFTL (NAND Flash Translation Layer) support
    <*> Enable UBI - Unsorted block images ---> 因为UBIFS文
    件系统建立在UBI一层上,所以只有这里选择了UBI之后,下面的文件系统里才会有UBIFS的选项
    (4096) UBI wear-leveling threshold (NEW)
    (1) Percentage of reserved eraseblocks for bad
    eraseblocks handling (NEW)
    < > MTD devices emulation driver (gluebi) (NEW)
    [ ] UBI debugging (NEW)
    File systems --->
    [*] Miscellaneous filesystems --->
    <*> UBIFS file system support 选择支持UBIFS文件系
    [*] Extended attributes support
    [*] Advanced compression options
    [*] LZO compression support (NEW)
    [*] ZLIB compression support (NEW)
    [ ] Enable debugging support (NEW)
    重新编译生成Linux内核uImage镜像文件:
    [wudongxu @centos6_master linux-3.0]$ make
    [wudongxu @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
    [wudongxu @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分区表相一致:
    u-boot的烧录地址应该是 0,大小不超过1M。该分区对应Linux内核分区表
    的/dev/mtdblock0;
    Linux内核的烧录地址应该是0x100000(1M的偏移量处),大小不超过15M。该分区对应Linux
    内核分区表的/dev/mtdblock1;
    根文件系统镜像的烧录地址应该是0x1000000(16M的偏移量处),大小不超过40M。该分区对
    应Linux内核分区表的/dev/mtdblock2;
    开发板上电或重启运行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 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
    bootargs的参数解析如下:
    console=tty0 指定内核控制终端为LCD,内核启动信息输出到LCD上;
    console=ttyS0,115200 指定内核控制终端也为第一个串口,使用波特率115200,这样内核启动信
    息也打印到第一个串口上;
    ubi.mtd=2 指定UBI卷建立在mtd2上,该值应该与u-boot烧录位置、Linux内核分区保
    持一致;如果错误则Linux内核会因找不到根文件系统而启动失败;
    root=ubi0:rootfs 指定根文件系统所在位置:在制作UBIFS的过程中,我们通过ubinize命令对
    文件系统镜像进行处理时,其配置文件中的vol_id指定为0,vol_name指定为rootfs;
    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]# run blx 烧录Linux内核镜像
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:00:3e:26:0a:5b
    could not establish link
    Using dm9000 device
    TFTP from server 192.168.2.2; our IP address is 192.168.2.222
    Filename 'linuxrom-s3c2440.bin'.
    Load address: 0x30008000
    Loading: T #################################################################
    #################################################################
    ##############################################
    done
    Bytes transferred = 2574896 (274a30 hex)
    NAND erase: device 0 offset 0x100000, size 0xf00000
    Skipping bad block at 0x00bc0000
    Erasing at 0xfe0000 -- 100% complete.
    OK
    NAND write: device 0 offset 0x100000, size 0x400000
    4194304 bytes written: OK
    [fl2440@lingyun]# run bubifs 烧录根文件系统镜像
    dm9000 i/o: 0x20000300, id: 0x90000a46
    DM9000: running in 16 bit mode
    MAC: 08:00:3e:26:0a:5b
    could not establish link
    Using dm9000 device
    TFTP from server 192.168.2.2; our IP address is 192.168.2.222
    Filename 'rootfs-ubifs.bin'.
    Load address: 0x30008000
    Loading: T #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #################################################################
    #####
    done
    Bytes transferred = 8650752 (840000 hex)
    NAND erase: device 0 offset 0x1000000, size 0x2800000
    Skipping bad block at 0x03440000
    Erasing at 0x37e0000 -- 100% complete.
    OK
    NAND write: device 0 offset 0x1000000, size 0x840000
    8650752 bytes written: OK
    5.5 启动和登录测试
    [fl2440@lingyun]# boot 直接使用boot命令启动,或重启开发板将自动启动
    NAND read: device 0 offset 0x100000, size 0x400000
    4194304 bytes read: OK
    ## Booting kernel from Legacy Image at 30008000 ...
    Image Name: Linux Kernel
    Created: 2017-11-08 10:26:16 UTC
    Image Type: ARM Linux Kernel Image (uncompressed)
    Data Size: 2574832 Bytes = 2.5 MiB
    Load Address: 30008000
    Entry Point: 30008040
    Verifying Checksum ... OK
    XIP Kernel Image ... OK
    OK
    Starting kernel ...
    Uncompressing Linux... done, booting the kernel.
    Linux version 3.0.0 (guowenxue@centos6.localdomain) (gcc version 4.4.6
    (crosstool-NG 1.16.0) ) #13 Wed Nov 8 18:24:00 CST 2017
    CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: SMDK2440
    Memory policy: ECC disabled, Data cache writeback
    CPU S3C2440A (id 0x32440001)
    S3C24XX Clocks, Copyright 2004 Simtec Electronics
    S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz
    CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
    Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
    下面是u-boot传给Linux内核的bootargs参数
    Kernel command line: console=tty0 console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs
    rootfstype=ubifs mem=64M noinitrd rw loglevel=7
    PID hash table entries: 256 (order: -2, 1024 bytes)
    Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
    ... ... ...
    S3C24XX NAND Driver, (c) 2004 Simtec Electronics
    s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
    s3c24xx-nand s3c2440-nand: NAND soft ECC
    NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-
    bit)
    Scanning device for bad blocks
    Bad eraseblock 94 at 0x000000bc0000
    Bad eraseblock 418 at 0x000003440000
    Bad eraseblock 713 at 0x000005920000
    Bad eraseblock 1144 at 0x000008f00000
    Bad eraseblock 1940 at 0x00000f280000
    Bad eraseblock 2010 at 0x00000fb40000
    Creating 6 MTD partitions on "NAND":
    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"
    UBI: attaching mtd2 to ubi0 Linux内核里UBI Subsystem的初始化
    UBI: physical eraseblock size: 131072 bytes (128 KiB) PEB大小为: 64*2048=128KiB
    UBI: logical eraseblock size: 129024 bytes LEB大小为: (64-1) *2048 = 129024B
    UBI: smallest flash I/O unit: 2048 Nandflash页大小为2K
    UBI: sub-page size: 512
    UBI: VID header offset: 512 (aligned 512)
    UBI: data offset: 2048
    UBI: max. sequence number: 0
    UBI: volume 0 ("rootfs") re-sized from 300 to 312 LEBs 系统启动UBI初始化时根据Nandflash上的坏块情况动态
    调整为312个
    UBI: attached mtd2 to ubi0
    UBI: MTD device name: "mtdblock2 rootfs 40MB" UBI: MTD device size: 40 MiB
    UBI: number of good PEBs: 319
    UBI: number of bad PEBs: 1
    UBI: number of corrupted PEBs: 0
    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: 319
    UBI: number of PEBs reserved for bad PEB handling: 3
    UBI: max/mean erase counter: 1/0
    UBI: image sequence number: 1049518277
    UBI: background thread "ubi_bgt0d" started, PID 855
    dm9000 Ethernet Driver, V1.31
    eth0: dm9000a at c48a6300,c48a8304 IRQ 51 MAC: 08:00:3e:26:0a:5b (chip)
    ... ... ...
    NET: Registered protocol family 17
    drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
    UBIFS: mounted UBI device 0, volume 0, name "rootfs"
    UBIFS: file system size: 33288192 bytes (32508 KiB, 31 MiB, 258 LEBs)
    UBIFS: journal size: 4644864 bytes (4536 KiB, 4 MiB, 36 LEBs)
    UBIFS: media format: w4/r0 (latest is w4/r0)
    UBIFS: default compressor: lzo
    UBIFS: reserved for root: 0 bytes (0 KiB)
    VFS: Mounted root (ubifs filesystem) on device 0:12. Linux内核找到并以UBIFS格式
    挂载根文件系统,如果bootargs传参有误则Linux内核将死在这里。 Freeing init memory: 112K
    ... ... ...
    dm9000 dm9000.0: eth0: link down
    Copyright (C) 2012 LingYun I.o.T Studio< iot-yun.com >
    Default Logon Username: root Password: 123456
    LingYunFL2440 login: root
    Password: ~ >: mount
    rootfs on / type rootfs (rw)
    ubi0:rootfs on / type ubifs (rw,relatime) 根路径(/)所挂载的文件系统即为根文件系统
    proc on /proc type proc (rw,relatime)
    usbfs on /proc/bus/usb type usbfs (rw,relatime)
    tmpfs on /dev type tmpfs (rw,relatime)
    ramfs on /tmp type ramfs (rw,relatime)
    sysfs on /sys type sysfs (rw,relatime)
    devpts on /dev/pts type devpts (rw,relatime,mode=600)
    因为UBIFS是建立在Nandflash上的根文件系统,在该文件系统路径下所有的文件修改掉电后都不会丢
    失。所以我们在根路径下创建haha文件后,把开发板重启发现该文件还存在。
    ~ >: pwd
    /~ >: touch haha ~ >: reboot
    5.6 普通分区ubifs挂载
    UBIFS除了可以制作成根文件系统使用以外,我们也可以在系统成功启动后,将其他分区以jffs2文件系
    统类型挂载使用。
    5.6.1 查看Nandflash分区情况 ~ >: cat /proc/mtd 查看MTD设备的分区情况
    dev: size erasesize name
    mtd0: 00100000 00020000 "mtdblock0 u-boot 1MB"
    mtd1: 00f00000 00020000 "mtdblock1 kernel 15MB"
    mtd2: 02800000 00020000 "mtdblock2 rootfs 40MB"
    mtd3: 05000000 00020000 "mtdblock3 apps 80MB"
    mtd4: 05000000 00020000 "mtdblock4 data 80MB"
    mtd5: 02800000 00020000 "mtdblock5 backup 40MB" ~ >: cat /proc/partitions 查看Linux内核分区表
    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 ~ >: ls -l /dev/mtdblock* 查看分区对应的块设备
    brw-rw---- 1 root root 31, 0 Jan 1 00:00 /dev/mtdblock0
    brw-rw---- 1 root root 31, 1 Jan 1 00:00 /dev/mtdblock1
    brw-rw---- 1 root root 31, 2 Jan 1 00:00 /dev/mtdblock2
    brw-rw---- 1 root root 31, 3 Jan 1 00:00 /dev/mtdblock3
    brw-rw---- 1 root root 31, 4 Jan 1 00:00 /dev/mtdblock4
    brw-rw---- 1 root root 31, 5 Jan 1 00:00 /dev/mtdblock
    5.6.2 在MTD上建立UBI卷
    这里我们以 mtdblock3 为例将其以ubifs文件系统格式挂载到 /apps 挂载点上:
    ~ >: flash_eraseall /dev/mtd3 使用flash_eraseall命令将mtd3所在分区全部擦除
    Erasing 128 Kibyte @ 2100000 - 41% complete.
    Skipping bad block at 0x02120000
    Erasing 128 Kibyte @ 5000000 - 100% complete. ~ >: ls /dev/ubi* 列出当前存在的ubi设备
    /dev/ubi0 /dev/ubi0_0 /dev/ubi_ctrl ~ >: ubiattach 查看ubiattach的使用方法
    BusyBox v1.27.1 (2017-11-08 20:59:05 CST) multi-call binary.
    Usage: ubiattach -m MTD_NUM [-d UBI_NUM] [-O VID_HDR_OFF] UBI_CTRL_DEV
    Attach MTD device to UBI
    -m MTD_NUM MTD device number to attach
    -d UBI_NUM UBI device number to assign
    -O VID_HDR_OFF VID header offset ~ >: ubiattach -m 3 -d 3 /dev/ubi_ctrl 在mtd3上关联ubi3
    UBI: attaching mtd3 to ubi3
    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: max. sequence number: 0
    UBI: create volume table (copy #1)
    UBI: create volume table (copy #2)
    UBI: attached mtd3 to ubi3
    UBI: MTD device name: "mtdblock3 apps 80MB"
    UBI: MTD device size: 80 MiB
    UBI: number of good PEBs: 639
    UBI: number of bad PEBs: 1
    UBI: number of corrupted 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: 629
    UBI: total number of reserved PEBs: 10
    UBI: number of PEBs reserved for bad PEB handling: 6
    UBI: max/mean erase counter: 0/0
    UBI: image sequence number: -765632520
    UBI: background thread "ubi_bgt3d" started, PID 922 ~ >: ls /dev/ubi* 再查看ubi设备信息,将会多一个ubi3
    /dev/ubi0 /dev/ubi0_0 /dev/ubi3 /dev/ubi_ctrl ~ >: ubimkvol 查看ubimkvol的帮助信息
    BusyBox v1.27.1 (2017-11-08 20:59:05 CST) multi-call binary.
    Usage: ubimkvol -N NAME [-s SIZE | -m] UBI_DEVICE
    Create UBI volume
    -a ALIGNMENT Volume alignment (default 1)
    -m Set volume size to maximum available
    -n VOLID Volume ID. If not specified,
    assigned automatically
    -N NAME Volume name
    -s SIZE Size in bytes
    -t TYPE Volume type (static|dynamic) ~ >: 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挂载点上
    UBIFS: mounted UBI device 3, volume 0, name "apps"
    UBIFS: file system size: 79994880 bytes (78120 KiB, 76 MiB, 620 LEBs)
    UBIFS: journal size: 3999744 bytes (3906 KiB, 3 MiB, 31 LEBs)
    UBIFS: media format: w4/r0 (latest is w4/r0)
    UBIFS: default compressor: lzo
    UBIFS: reserved for root: 3778355 bytes (3689 KiB) ~ >: mount 查看当前所有的文件系统挂载信息
    rootfs on / type rootfs (rw)
    ubi0:rootfs on / type ubifs (rw,relatime)
    proc on /proc type proc (rw,relatime)
    usbfs on /proc/bus/usb type usbfs (rw,relatime)
    tmpfs on /dev type tmpfs (rw,relatime)
    ramfs on /tmp type ramfs (rw,relatime)
    sysfs on /sys type sysfs (rw,relatime)
    devpts on /dev/pts type devpts (rw,relatime,mode=600)
    ubi3:apps on /apps type ubifs (rw,sync,noatime)
    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脚本
    [guowenxue@centos6_master linux]$ vim build_ubifs.sh
    #!/bin/sh
    #+-------------------------------------------------------------------------------
    -------------
    #|Description: This shell script is used to generate a UBIFS rootfs for K9F2G08
    nandflash
    #| Author: GuoWenxue <guowenxue@gmail.com> QQ: 281143292
    #| ChangeLog:
    #| 1, Initialize 1.0.0 on 2012.04.18
    #| Reference:
    #+-------------------------------------------------------------------------------
    ------------- # u-boot setup bootargs env:
    # set bubifs 'tftp 30008000 rootfs-ubifs.bin;nand erase 1000000 2800000;nand write 30008000
    1000000 $filesize' # set bootargs 'console=tty0 console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs
    mem=64M noinitrd rw loglevel=7' VERSION=1.0.0
    ROOTFS_DIR=./rootfs
    INSTALL_PATH=/tftp
    IMAGE_NAME=rootfs-ubifs
    config_file=ubinize.ini
    #===========================================
    # Shell script body start here +
    #===========================================
    # rootfs partition size in MiB
    PART_SIZE=40
    # nandflash pages per block and size per page
    NAND_PAGES_BLK=64
    NAND_PAGE_SIZE=2048
    # physical eraseblock size: 131072
    PEB_SIZE=`expr $NAND_PAGES_BLK \* $NAND_PAGE_SIZE`
    # logical erase block size size: 129024
    LEB_SIZE=`expr $NAND_PAGES_BLK \* $NAND_PAGE_SIZE - $NAND_PAGE_SIZE`
    # PEB count should
    be: partition_size_bytes/(NAND_PAGES_BLK*NAND_PAGE_SIZE)=40*1024*1024/(2048*64)=320
    PEB_CNT=`expr $PART_SIZE \* 1024 \* 1024 / $NAND_PAGES_BLK / $NAND_PAGE_SIZE`
    # LEB count is PEB_CNT, but reserved some blocks for UBI used:
    # 2 PEBs for volume table
    # 1 PEBs for wear-leveling purposes
    # 1 PEBs for atomic LEB change operation
    # m PEBs for bad PEB handling, here set be 16. It will be dynamic adjust when
    UBI subsystem on linux boot, so no waste.
    BAD_PEBs=16
    LEB_CNT=`expr $PEB_CNT - 4 - $BAD_PEBs`
    # UBI logical volume size, it should be: $LEB_CNT*$LEB_SIZE=38707200
    VOL_SIZE=`expr $LEB_CNT \* $LEB_SIZE`
    # VID header offset value is sub-pages size, and fixed to be 512 for nandflash
    with 2KiB page size
    SUB_PAGE_SIZE=512
    VID_HDR_OFFSET=512
    if [ ! -d $ROOTFS_DIR ] ; then
    echo "decompress rootfs tree..."
    tar -xjf rootfs.tar.bz2
    fi
    echo ""
    echo "generate $IMAGE_NAME.img file by mkfs.ubifs..."
    echo "sudo mkfs.ubifs -x lzo -m $NAND_PAGE_SIZE -e $LEB_SIZE -c $LEB_CNT -r
    $ROOTFS_DIR -o $IMAGE_NAME.img"
    sudo mkfs.ubifs -x lzo -m $NAND_PAGE_SIZE -e $LEB_SIZE -c $LEB_CNT -r $ROOTFS_DIR
    -o $IMAGE_NAME.img
    echo ""
    echo "generate ubinize configure file..."
    echo "[ubifs-volume]" > $config_file
    echo "mode=ubi" >> $config_file
    echo "image=$IMAGE_NAME.img" >> $config_file
    echo "vol_id=0" >> $config_file
    echo "vol_size=$VOL_SIZE" >> $config_file
    echo "vol_type=dynamic" >> $config_file
    echo "vol_name=rootfs" >> $config_file
    echo "vol_flags=autoresize" >> $config_file
    echo "vol_alignment=1" >> $config_file
    echo ""
    echo "generate $IMAGE_NAME.bin file by ubinize..."
    echo "ubinize -o $IMAGE_NAME.bin -m $NAND_PAGE_SIZE -p $PEB_SIZE -s
    $SUB_PAGE_SIZE -O $VID_HDR_OFFSET $config_file"
    ubinize -o $IMAGE_NAME.bin -m $NAND_PAGE_SIZE -p $PEB_SIZE -s $SUB_PAGE_SIZE -O
    $VID_HDR_OFFSET $config_file
    chmod a+x $IMAGE_NAME.bin
    echo ""
    echo "install and remove temporary files..."
    echo ""
    if [ -d $INSTALL_PATH ] ; then
    cp $IMAGE_NAME.bin $INSTALL_PATH
    fi
    rm -f $IMAGE_NAME.img $config_file
    5.8 思考
    如何设置让系统启动时自动将/dev/mtdblock3以ubifs文件系统
    格式挂载到/apps路径下?

    展开全文
  • 嵌入式Linux根文件系统制作和挂载

    万次阅读 多人点赞 2016-05-02 20:33:53
    嵌入式Linux系统由三部分组成: uboot、...下面贴张图看看整个根文件系统制作的步骤: 第一步创建目录,这里是在我自己的一个目录下建立一个名为rootfs的目录: 第二步 :创建设备文件(比如操作串口,其

    嵌入式Linux系统由三部分组成: uboot、kernel、根文件系统, 还是这张老图


    这里的根文件系统可以说是包含两个部分: 一个是根,一个是文件系统

    那么什么是根呢?哈哈 其实根表示的就是第一个的意思

    下面贴张图看看整个根文件系统制作的步骤:


    第一步创建目录,这里是在我自己的一个目录下建立一个名为rootfs的目录:


    第二步 :创建设备文件(比如操作串口,其实就是打开一个串口文件,向里面写入读出等)

    这里有两个是必须的,其他的暂时不考虑(串口控制台)(这个在dev目录下执行)


    第一个指令console表示是串口控制台设备 c表示是字符设备 5表示主设备号,1表示次设备号

    第二个指令暂时也不明白,先放着。

    第三步:加入配置文件(主要是etc目录下的)


    第四步:添加内核模块


    这个要进入到Llinux 内核中编译内核模块!


    第二条指令是将编译好的模块拷贝到rootfs目录下的相应目录中


    从这里可以看到当前目录下的一些.ko文件


    第五步:编译安装busybox


    先解压,然后进入目录make menuconfig



    这里直接进入第一项,这里有两项要设置

    1. 选中第一项Build BusyBox as a static binary 

    2. Corss Compile prefix 输入自己交叉编译器的前缀




    上图中需要设置两个地方,一个是选中第一项 一个是BusyBox installation prefix安装路径这里填写我自己建的目录所在的绝对路径。


    上图中的home写错了,这里先说一下。退出然后保存,make 编译然后make install(其实这里就是执行一个复制功能)(上面的选项其他的暂不配置)安装成功后截图:


    这是也可以去rootfs/bin目录下看看有什么变化,执行之前bin目录下是空的


    这里可以看到很多常用的命令!


    第二部分:挂载根文件系统(即如何使用上边制作好的根文件系统)





    第一步:


    Initramfs 启动速度快。缺点是掉电后数据丢失!

    进入rootfs目录下,创建一个软链接!把系统的Initramfs链接到当前的目录下的busybox下 软链接的名字取为init

    然后进入Linux内核中配置make menuconfig配置内核


    进入general setup


    选中图中蓝色部分上面一项Initial RAM filessystem and RAM disk.......

    并且进入图中蓝色部分写入自己执着的rootfs路径:


    保存,然后重新编译内核


    编译完成:


    这里将生成的 arch/arm/boot/uImage文件拷贝到tftpboot目录下!(这个可以参考前面的关于自动启动内核设置那篇博文)


    最后一步,设置环境变量:

    打开串口终端,连接开发板

    设置环境变量:



    然后tftp uImage c0008000

    bootm c0008000启动内核

    这里可以看到上面制作的文件系统启动成功


    下面一步来讲述使用NFS来挂着根文件系统!(network file system)

    这样有利于开发过程中的同步,即在PC机上更改一些文件能同时同步到开发板上的文件上

    这样就省去了每次更改一些内核文件时重新编译工作!(内核开发过程中非常实用,使用NFS是必须掌握的技巧)

    首先第一步还是内核配置:

    首先取消掉上面选中的Initial RAM filesystem and RAM disk...选项,如图:(这一项是在Gnenral setup选项里面)


    然后进入file systems中


    进入选中图中蓝色选项:


    选中图中蓝色选项,并且进入,选中图中蓝色部分


    然后退出保存,然后在重新编译make uImage ARCH=arm CROSS_COMPILE=arm-linux-


    同上将uImage拷贝到tftpboot目录下,

    然后剩下的就是设置nfs环境变量了



    我电脑linux的ip 是192.168.1.111, 开发板的ip是192.168.1.110

    所以这里我设置的环境变量为

    <span style="font-size:24px;color:#ff0000;">setenv bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.1.111:/home/S3-ARM/rootfs,proto=tcp,nfsvers=3 ip=192.168.1.110:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off</span>
    
    
    设置完后然后saveenv一下

    tftp c0008000 uImage

    bootm c0008000

    然后看一张截图,就是我在pc机的linux上的rootfs目录下建立一个Text.txt文件,可以看到这个文件立刻就可以在开发板上看到。




    这在内核开发基本是必备技能!用起来是相当方便的!

    这里NFS挂载补充一点:/etc/init.d/nfs restart 启动nfs服务器

    第二点:

    vim /etc/exports 文件 输入一下内容,这个是我的rootfs文件路径(这里的意思就是NFS要挂在的目录是哪个,然后挂载属性是什么)



    展开全文
  • ubuntu根文件系统制作(RK3288)

    千次阅读 2019-09-03 23:21:11
    ubuntu根文件系统制作 参考: http://wiki.t-firefly.com/zh_CN/Firefly-RK3399/linux_build_ubuntu_rootfs.html https://blog.csdn.net/mountzf/article/details/51707853 从官网下载ubuntu基本裸系统 ...
  • linux 根文件系统制作

    千次阅读 2013-01-19 12:54:26
    昨天花了我几个小时的时间,最后终于把那个根文件系统制作好了~ (一):首先linux根文件系统的制作需要的开发环境。 1:移植Linux内核版本: linux-3.0.1 (只要能用就行) 2:交叉编译工具:arm-linux-gcc ...
  • ARM根文件系统制作

    千次阅读 2011-04-24 11:25:00
    嵌入式根文件系统制作过程(For YC2440 Board)
  • 嵌入式根文件系统制作

    千次阅读 2011-11-24 18:19:31
    根文件系统制作  注:busybox下载地址:http://www.busybox.net/ 目标:用busybox定制一个很小的文件系统,并且运行用户编译的hello。 一、文件系统介绍 二、构建根文件系统 三、BusyBox介绍 四、实验步骤
  • 根文件系统制作详解

    千次阅读 2018-03-22 18:08:01
    什么是根文件系统 linux最顶层的目录"/"被称作根目录,与Windows上的目录结构有较大的不同。系统中只有一个根目录,路径是“/”,而其它的分区只是挂载在根目录中的一个文件夹。系统加载linux内核后,就会...
  • tiny linux要求实现以下两点: 精简linux内核镜像,要求在支持TCP/IP数据传输的情况下,内核镜像和正常运行所需内存能够做到尽可能的小。...根文件系统制作 在这里记录了我完成该项目的过程,希望对大家有用。
  • JFFS2根文件系统制作

    千次阅读 2019-05-01 21:58:21
    根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如inittab、rcS)和服务加载到内存中去运行。...
  • 根文件系统制作详解 转自https://blog.csdn.net/qq_17308321/article/details/79624536
  • 根文件系统制作记录

    千次阅读 2015-07-15 15:58:04
    今天制作的ubi的根文件系统出现一个问题,所有的目录和文件的用户和组都是default。导致在arm板子上面很多程序都运行不了,比如运行vi 打开任意文件,就提示vi: can't read user input。再比如,我修改了busybox的...
  • Yaffs2根文件系统制作

    万次阅读 2012-08-24 19:00:36
    Yaffs2根文件系统制作 zouxy09@qq.com 环境:  交叉编译环境:4.3.3 (天嵌科技提供,存放路径/home/xiaoyi/4.3.3) 开发平台:TQ2440 注:这里有一些东西没有提到,请结合天嵌提供的linux移植手册来进行移植   一...
  • UBIFS根文件系统制作

    千次阅读 2019-05-02 16:47:06
    一、UBIFS文件系统简介 UBIFS(Unsorted Block Image File System)无序区块镜像文件系统是用于固态存储设备上,UBIFS在设计与性能上均较YAFFS2、JFFS2更适合MLC(Multi-Level Cell) NAND FLASH。例如:UBIFS支持凑数...
  • 作者:华清远见研发中心,志浩老师。 有用户反馈,关于stm32mp1,ST官方提供的系统太庞大,开机速度慢,占用空间大。基于这个问题,我们整理了Linux5.4.31最小根文件系统的镜像及... 根文件系统制作 可以从http.
  • linux最小根文件系统制作简介

    千次阅读 2013-12-06 11:00:59
    使用busybox制作linux根文件系统步骤简介
  • 一、U-Boot入门 二、嵌入式linux内核制作 三、根文件系统制作
  • Linux根文件系统制作

    千次阅读 2016-05-08 15:28:54
    1 开发环境 宿主机:Ubuntu14.04(32bit) ...(1)创建目录rootfs,这个目录就是要移植到Mini2440开发板的目录: mkdir rootfs (2)进入rootfs并创建目录bin、dev、etc、usr、lib、sbin...
  • Jffs2根文件系统制作

    千次阅读 2009-11-26 22:43:00
    Jffs2根文件系统制作一. 建立目录[root@qljt1 /]# mkdir /jffs2 /jffs2/rootfs /jffs2/rootfs_build[root@qljt1 /]# cd /jffs2/rootfs[root@qljt1 rootfs]# mkdir {bin,dev,etc,usr,lib,sbin,proc,sys,tmp}[root@q
  • linux系统移植和根文件系统制作

    千次阅读 2016-07-12 08:12:40
    内核移植和根文件系统制作 1.1 Linux内核基础知识  在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。  1.1.1 Linux版本  Linux内核的版本号可以...
  • 最小根文件系统制作

    千次阅读 2011-09-08 15:50:29
     所谓制作根文件系统,就是创建各种目录,并且在里面创建各种文件。对于创建一个最下根文件系统,只需要在/dev目录下创建必要的设备节点、在/etc目录下创建一些配置文件就可以了,如果Busybox使用动态链接库,那...
  • 我再制作根文件系统的之后挂载不上 我们的内核 uboot都支持ubi文件系统 所以我只配置busybox来制作文件系统 我制作的大致流程是按照这个网址做的 http://www.eefocus.com/srnoc/blog/15-05/312502_55a04.html 用的...
  • Linux根文件系统制作什么是文件系统计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,...
  • arm linux 根文件系统制作

    千次阅读 2016-08-24 11:24:21
    准备:创建rootfs目录,用于保存文件系统 #mkdir rootfs 1、在rootfs中创建一些必要的目录 #mkdir bin dev etc lib proc sbin sys usr mnt tmp var #mkdir usr/bin usr/lib usr/sbin lib/modules 2、创建设备文件...
  • EasyARM imx283/287根文件系统制作 1.下载busybox 下载地址:http://www.busybox.net/(当前最新的稳定版本busybox-1.22.1) 解压busybox-1.22.1.tar.bz2   2.配置编译busybox 1)进入busybox解压后的目录 2)修改...
  • ************本文转自... 制作根文件系统时,当把busybox编译的四个文件拷进了文件夹里, 必备的文件目录页建立了,初始化目录,设备文件也建立了 这时候就需要添加

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,682
精华内容 28,272
关键字:

根文件系统的制作