laozhang1988的个人空间 https://blog.eetop.cn/1317015 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

构建嵌入式Linux文件系统

已有 546 次阅读| 2014-10-18 23:04 |个人分类:linux驱动

  

构建嵌入式Linux文件系统

一、嵌入式Linux文件系统简介

Linux支持多种文件系统,包括ext2ext3vfatntfsiso9660jffsromfsnfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。

Linux下的文件系统结构如下:


Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。

不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。

1.1 基于FLASH的文件系统

Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。

闪存主要有NORNAND两种技术(简单比较见附录)Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。

在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。

顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。

1.1.1 Romfs

关键字:简单、只读

传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。
     其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。

1.1.2CramfsCompressed ROM File System 

关键字:数据压缩、只读

CramfsLinux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。

cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。

 Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。

另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。

由于以上特性,Cramfs在嵌入式系统中应用广泛。

但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。

Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。

1.1.3jffs2

关键字:支持数据压缩、读写、崩溃/掉电安全保护、读写平衡机制、挂载时间长

JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。

Jffs2的全称是日志闪存文件系统版本2 (Journalling Flash FileSystem v2)主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供写平衡支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。

 目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt

jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

1.1.4yaffsYet Another Flash File System

关键字:不支持数据压缩、速度快、可读写、挂载时间短、内核缺省不支持

yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了LinuxeCos,还支持WinCE, pSOSThreadX等。

yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTDVFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。

yaffsyaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

1.2基于RAM的文件系统

1.2.1 Ramdisk

关键字:基于内存,读写快,容量有限

Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能

 Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。

1.2.2 ramfs/tmpfs

关键字:不允许掉电存储,读写快

RamfsLinus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)

 Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。

Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。

Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。

1.3网络文件系统NFS (Network File System)

NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)sysfs,用于维护设备文件。

二、制作嵌入式Linux文件系统

busybox用于制作文件嵌入式Linux文件系统,它的作用主要有两个:

l 一系列工具链的集合(targzipunzip等)

l shell实现

2.1 嵌入式Linux文件系统必须包括的文件如下:

1. /linuxrc:二进制文件,Linux启动的初始化脚本,内核加载文件系统的入口

2. /bin:用于存放系统常用命令如:(常见的不介绍,介绍不常见的)

a) ash:控制台

b) cpioio方式拷贝

c) dd:生成分区

d) df:查看盘符映射

e) mknod 创建节点,是应用程序与驱动程序的桥梁

3. /sbin:存放系统辅助命令,如:insmod注册驱动模块

4. /usr:用于存放用户命令

a) /usr/bin:用于存放用户主要命令

b) /usr/sbin:用于存放用户辅助命令

5. /lib:库文件第一搜索路径,用于存放动态库,静态库等

6. /devLinux启动时主要的设备节点目录

7. /etc:启动脚本存放目录

a) fstab 文件系统映射表

b) inittabLinuxrc运行配置表

c) passwd:用户信息

d) group:组信息

e) mdev.conf:临时设备配置文件

f) init.d/rcSinittab中的第一项要用到,系统启动时执行的默认配置文件

8. /proc:系统软硬件信息

9. /mnt:默认的挂载目录

10. /var:默认的系统运行日志等存放目录

a) /var/run 运行时信息存放目录

b) /var/log 日志信息

11. /home:用于存放用户主目录

12. /rootroot用户主目录

13. /optLinux系统默认存在的目录

14. /sys:系统档案

制作根文件系统就是要建立以上目录,并在其中建立完整目录内容。其过程大体包括:

1. 编译/安装 busybox,生成/bin/sbin/usr/bin/usr/sbinlinuxrc目录及其内容

2. 利用交叉编译工具链,构建/lib目录

3. 手工构建/etc目录、简化的/dev目录、其他空目录

4. 配置系统自动生成/proc/sys目录

5. 利用udev构建完整的/dev目录

6. 制作根文件系统的jffs2映像文件。

下面详细介绍这个过程。

2.2 使用BusyBox制作基本文件系统(/bin/sbin/usr)

/bin/sbin/usr/bin/usr/sbin目录下存放的主要是常用命令的二进制文件。如果要自己编写这几百个常用命令的源程序将非常困难,好在有嵌入式Linux系统的瑞士军刀——busybox,事情就简单多了。

1.http://www.busybox.net/下载busybox源码包,(我们已经提供了busybox-1.13.3.tar.bz2

2.解压:tar jxvf busybox-1.13.3.tar.bz2

3. 进入解压目录:cd busybox-1.13.3

4.执行缺省配置:make defconfig

5. 执行详细配置,进入配置界面(如下图):make menuconfig

busybox的配置主要分为两部分:

第一部分是BusyBox Settings,主要是编译和安装BusyBox的一些选项。这里需要配置:

Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库。

Build Options  Cross Compiler prefix,表示编译时使用的交叉编译器。我们输入arm-linux-

Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 0

    评论
  • 97

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 20:21 , Processed in 0.024310 second(s), 16 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部