天天看点

linux下文件系统的制作

一、 文件系统简介

嵌入式系统中常用文件系统包括有cramfs、JFFS2、NFS、initrd、yaffs2 以及squashfs。它们的特点如下:

(1)、cramfs 和JFFS2 具有好的空间特性,很适合嵌入式产品应用。

(2)、cramfs 与squashfs 为只读文件系统。

(3)、squashfs 压缩率最高。

(4)、JFFS2 为可读写文件系统。

(5)、NFS 文件系统适用于开发初期的调试阶段。

(6)、yaffs2 文件系统只用于NAND Flash。

(7)、initrd 采用cramfs 文件系统,为只读。

1、 cramfs

cramfs 是针对Linux 内核2.4 之后的版本所设计的一种新型文件系统,使用简单,加载容易,速度快。

cramfs 的优缺点如下:

优点:将文件数据以压缩形式存储,在需要运行时进行解压缩,能节省Flash 存储空间。

 缺点:由于它存储的文件是压缩的格式,所以文件系统不能直接在Flash 上运行。同时,文件系统运行时需要解压数据并拷贝至内存中,在一定程度上降低读取效率。另外cramfs 文件系统是只读的。如果想要在单板运行的Linux 中提供cramfs 的能力,必须要在编译内核时把cramfs 的选项加入。在make menuconfig 后,进入“File>systems”,选择“miscellaneousfilesystems”,最后选中其中的“Compressed ROM file system support”。

mkfs.cramfs 是用来制作cramfs 文件系统映象的工具。通过这个工具处理已经制作好的根文件系统,就可以生成cramfs 文件系统的映象(这类似于我们把光盘制作成ISO 文件映像)。具体操作如下所示:

$ mkfs.cramfs ./rootbox ./cramfs-root.img

其中,rootbox 是之前已经制作好的根文件系统,cramfs-root.img 是生成的cramfs 文件系统映像文件。

2、JFFS2

JFFS2 是RedHat 的David Woodhouse 在JFFS 基础上改进的文件系统,是用于微型嵌入式设备的原始闪存芯片的实际文件系统。JFFS2 文件系统是日志结构化的可读写的文件系统。

JFFS2 的优缺点如下:

 优点:使用了压缩的文件格式。最重要的特性是可读写操作。

缺点:JFFS2 文件系统挂载时需要扫描整个JFFS2 文件系统,因此当JFFS2 文件系统分区增大时,挂载时间也会相应的变长。使用JFFS2 格式可能带来少量的Flash 空间的浪费。这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪费的空间大小大致是若干个数据段。JFFS2 的另一缺点是当文件系统已满或接近满时,JFFS2 运行速度会迅速降低。这是因为垃圾收集的问题。

加载JFFS2 文件系统时的步骤如下:

步骤 1. 扫描整个芯片,对日志节点进行校验,并且将日志节点全部装入内存缓存。

步骤 2. 对所有日志节点进行整理,抽取有效的节点并整理出文件目录信息。

步骤 3. 找出文件系统中无效节点并且将它们删除。

步骤 4. 最后整理内存中的信息,将加载到缓存中的无效节点释放。

由此可以看出虽然这样能有效地提高系统的可靠性,但是在一定程度上降低了系统的速度。尤其对于较大的闪存芯片,加载过程会更慢。为了使内核支持JFFS2 文件系统,必须在编译内核时把JFFS2 的选项加入。在make menuconfig 后,进入“File>systems”,选择“miscellaneous filesystems”,最后选中其中的“Journalling Flash File System v2 (JFFS2)support”选项。

JFFS2 的制作方法为:

$ mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img

其中,mkfs.jffs2 工具可以从互联网中下载,也可以在SDK 包中找到。rootbox 为之前已经制作好的根文件系统。参数说明如下表 所示。

参数 说明
d 指定根文件系统
l little-endian 小端模式
e Flash 的块大小
o 输出映像文件

3、 yaffs2

yaffs2 是专门为NAND Flash 设计的嵌入式文件系统。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。

yaffs2 的优缺点如下:

 优点

− 专门针对 NAND Flash,软件结构得到优化,速度快。

− 使用硬件的 spare area 区域存储文件组织信息,启动时只需扫描组织信息,启动比较快。

− 采用多策略垃圾回收算法,能够提高垃圾回收的效率和公平性,达到损耗平衡的目的。

 缺点

没有采用压缩的文件格式。当包含的内容相同时,yaffs2 镜像文件要比jffs2 镜像文件大。yaffs2 文件系统在SDK 中作为一个模块提供。只需在yaffs2 代码中的Makefile 中加入所依赖的内核代码路径,进行编译,即可生成yaffs2 文件系统模块。yaffs2 镜像文件的制作和cramfs 相同,即通过工具制作,只需简单的几个参数,具体如下:

$  mkyaffs2image ./rootbox yaffs2-root.img pagesize ecctype

其中,rootbox 是之前已经制作好的根文件系统,yaffs2-root.img 是生成的yaffs2 文件系统镜像文件,pagesize 是单板上焊接NAND Flash 器件的页大小,ecctype 是单板上焊接NAND Flash 器件的ecc 类型。

4、 initrd

initrd 相当于存储介质,它支持的文件系统格式有ext2、cramfs 等,因此内核除了支持initrd 之外,还要支持cramfs 文件系统。内核需要做如下配置,initrd 才可以正常工作:

进入“Device Drivers->Block devices”,选择支持“RAM disk support” 和“InitialRAM disk (initrd) support”。

进入“File>systems”,选择“miscellaneous filesystems”,最后选中其中的“Compressed ROM file system support”。

制作initrd的步骤如下:

步骤 1. 制作cramfs 镜像文件,具体制作方法请参见“4.3.1 cramfs”。

步骤 2. 以步骤1 制作的镜像文件作为输入,制作initrd 文件,制作命令为:

“mkimage -A arm -Tramdisk -C none -a 0 -e 0 -n cramfs-initrd -d ./cramfs-image cramfs-initrd”。

5、Squashfs

squashfs 文件系统是一套基于Linux 内核使用的压缩只读文件系统,压缩率高。

squashfs 具有如下特点:

(1)、数据(data),节点(inode)和目录(directories)都被压缩

(2)、 保存了全部的 32 位 UID/GIDS 和文件的创建时间

(3)、 最大支持 4G 文件系统

(4)、检测并删除重复文件

使用squashfs 文件系统步骤:

步骤 1. 制作支持squashfs 的内核镜像;

步骤 2. 制作squashfs 文件系统镜像。mksquashfs 为制作squashfs 文件系统工具。使用方法如下:

./mksquashfs rootfs ./ rootfs.squashfs.img -b 64K –comp xz

其中,rootfs 是之前已经制作好的根文件系统,rootfs.squashfs.img 是生成的squashfs 文件系统映像文件。-b 64K 指定squashfs 文件系统的块大小为64K(决定于实际spi flash块大小)。-comp 指定文件系统压缩方式为xz。请根据实际情况修改参数。

二、根文件系统简介

Linux 的目录结构的最顶层是一个被称为“/”的根目录。系统加载Linux 内核之后,就会挂载一个设备到根目录上。存在于这个设备中的文件系统被称为根文件系统。所有的系统命令、系统配置以及其他文件系统的挂载点都位于这个根文件系统中。

根文件系统通常存放于内存和Flash 中,或是基于网络的文件系统。根文件系统中存放了嵌入式系统使用的所有应用程序、库以及其他需要用到的服务。 下面列出了根文件系统的顶层目录。

 / -------------- 根目录

    bin --------- 基本命令的可执行文件

    boot -------- 内核映像已经启动时需要用到的一些文件

    dev --------- 设备文件

    etc --------- 系统配置文件,包括启动文件

    home -------- 用户目录

    lib --------- 基本库,例如C库和内核模块

    lost+found -- 在文件系统修复时恢复的文件

    mnt --------- 临时文件系统的挂载点

    nfsroot ----- nfs文件夹,一般不使用

    opt --------- 添加的软件包

    proc -------- 内核以及进程信息的虚拟文件系统

    root -------- root用户目录

    sbin -------- 用于系统管理的可执行程序

    share ------- 共享文件目录

    sys --------- 系统设备和文件层次结构,向用户提供详细的内核数据信息

    tmp --------- 临时文件

    usr --------- 该目录的二级目录包含许多对用户很有用的应用程序和文档

    var -------- 存放系统日志或一些服务程序的临时文件

通用的Linux 系统的根文件系统中会包括根文件系统顶层目录结构图中所有的目录,不过在嵌入式系统中,需要精简根文件系统。部分可以被忽略的目录如下表

目录名称 描述
/home、/mnt、/opt 和/root 所有适合提供给多用户扩展的目录,都可以被忽略。
/var 和/tmp

/var是存放系统日志或一些服务程序的临时文件。

/tmp 是存放用户的一些临时文件,可以被忽略。

/boot /boot 目录一般用于存放内核映像,PC 机启动时一般会从该位置加载内核,但在嵌入式系统中,为了节省空间,内核映像存在于Flash 或网络服务器中,而不是在根文件系统中。因此也可以忽略这个目录。

    注:空目录并不会增大文件系统的体积,如果没有特殊原因,建议保留这些目录。

三、利用busybox 制作根文件系统

利用busybox 制作根文件系统需要先获取busybox 源代码,然后配置、编译和安装busybox,操作成功后开始制作根文件系统。

1、获取busybox 源代码

busybox 源代码也可以从网站http://www.busybox.net 下载源码。

2、 配置busybox

进入busybox 所在目录,进行配置操作需要输入如下命令:

(1)、生成.config 配置文件

(2)、$ make menuconfig

busybox 的配置界面和内核配置相似,其功能选项容易理解,可以根据自己的需求选择配置。在Busybox Settings ---> Build Options 中注意下面两个选项:

[*]Build BusyBox as a static binary (no shared libs)

[*] Build with Large File Support (for accessing files > 2 GB)

(arm-hisiv300-linux-) Cross Compiler prefix

() Path to sysroot

(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional CFLAGS

(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional

LDFLAGS

() Additional LDLIBS

其中:

− 第一个选项选择是否把 busybox 编译成静态链接的可执行文件。如果选择该选项,编译出来的busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的busybox,体积较小,但需要动态库的支持。

− 第二个选项是用于选择 SDK 推荐的交叉编译器,配置好后保存并退出。欲了解busybox 各选项含义请参考busybox 配置帮助。

3、编译和安装busybox

编译和安装busybox 的具体操作如下:

$ make

$ make install

编译并安装成功后,在busybox 目录下的_install 目录下生成以下目录及文件:

drwxr-xr-x 2 lnan lnan 4096 2014-11-20 11:53 bin

lrwxrwxrwx 1 lnan lnan 11 2014-11-20 11:53 linuxrc -> bin/busybox

drwxr-xr-x 2 lnan lnan 4096 2014-11-20 11:53 sbin

drwxr-xr-x 4 lnan lnan 4096 2014-11-20 11:53 usr

4 制作根文件系统

成功安装SDK 后,在osdrv/pub/目录中存放已制作好的根文件系统。

用户如有需要可在busybox 的基础上制作根文件系统。

制作根文件系统的具体操作步骤如下:

步骤 1: $ mkdir rootbox

$ cd rootbox

$ cp –R packet/os/busybox-1.20.2/_intsall/* .

$ mkdir etc dev lib tmp var mnt home proc

2.:配置etc、lib、dev 目录的必需文件。

步骤 a. etc 目录可参考系统/etc 下的文件。其中最主要的文件包括inittab、fstab、init.d/rcS文件等,这些文件最好从busybox 的examples 目录下拷贝过来,根据需要自行修改。

b. dev 目录下的设备文件,可以直接从系统中拷贝过来或者使用mknod 命令生成需要的设备文件。拷贝文件时请使用cp –R file。

c. lib 目录是存放应用程序所需要的库文件,请根据应用程序需要拷贝相应的库文件。