350 likes | 522 Vues
嵌入式文件系统. Embedded file system. 课程目标. Linux 文件系统 常见嵌入式文件系统介绍 yaffs 文件系统 flash 文件系统实现分析 根文件系统的制作和下载. Linux 文件系统. 文件系统是在一个磁盘(包括光盘、软盘、 Flash 及其它存储设备)或分区中的目录结 构,一个可应用的磁盘设备可以包含一个或多个文件系统。 文件系统是基于被划分的存储设备上的逻辑单位的一种定义文件的命名、存储、组织 及取出的方法,可以是分布在本地存储设备上,也可能是分布在网络其它节点之上, 如 NFS 。
E N D
嵌入式文件系统 Embedded file system
课程目标 • Linux文件系统 • 常见嵌入式文件系统介绍 • yaffs文件系统 • flash文件系统实现分析 • 根文件系统的制作和下载
Linux文件系统 • 文件系统是在一个磁盘(包括光盘、软盘、Flash及其它存储设备)或分区中的目录结 构,一个可应用的磁盘设备可以包含一个或多个文件系统。 • 文件系统是基于被划分的存储设备上的逻辑单位的一种定义文件的命名、存储、组织 及取出的方法,可以是分布在本地存储设备上,也可能是分布在网络其它节点之上, 如NFS。 • Linux目前几乎支持所有的Unix类的文件系统 • 除了支持在安装Linux操作系统时所要选择的ext3、reiserFS和ext2外,还支持苹果 MACOS的HFS,也支持其它Unix操作系统的文件系统,如:XFS、JFS、Minix fs及UFS等。 • 支持Windows文件系统NTFS和fat,支持fat文件系统的读写,但不支持NTFS文件系统的写入。 • 支持标准的NFS和iso9660光盘文件系统。 • 为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。 • 在桌面或服务器上常用的文件系统是ext3,这是一种适合大容量磁盘的文件系统。 • ext2文件系统应该说是正宗的Linux文件系统,早期的Linux都是用ext2,但随着 技术的发展,大多Linux的发行版本目前已不再用这个文件系统。 • ext3 is a Journalizing file system for Linux(ext3是一个用于Linux的日志 文件系统),ext3支持大文件,但不支持反删除(undelete)操作。Redhat和Fedora都力挺ext3。 • reiserFS是一种新开发的日志文件系统,采用数据库常用B树索引,对小文件处理极快。
文件系统基本概念 • 存储介质 • 硬盘、光盘、软盘、Flash盘、磁带、网络存储设备等。 • 存储介质的分区 • 针对大容量的存储设备,如:磁盘或U盘,为了更有效的使用空间并加快读写速度,一般需要对其分区, 分区命令一般为fdisk。 • 嵌入式文件系统主要为方便底层软件编写,一般也需对存储设备进行分区。 • 文件系统的创建 • 这个过程是存储设备建立文件系统的过程,一般也被称为格式化或初始化,通过一些初始化工具来进行。 把存储设备分区后,用操作系统自带的工具初始化分区,也就是格式化分区。在Linux中有mkfs系列分区 工具。 • 嵌入式文件系统需要在宿主开发机(HOST)上预先制作好image,然后用工具下载到开发板(target) 上。 • 挂载(mount) • 文件系统只有被挂载后才能被使用,Unix类的操作系统如此,Windows也是一样。 • Unix类的操作系统是通过mount进行的,挂载文件系统时要有挂载点。 • Linux启动时,第一个必须挂载的是根文件系统(rootfs),若系统不能从指定设备上挂载根文件系统,则 系统会出错而退出启动,之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同 的文件系统。 • 文件系统可视的几何结构 • 文件系统是用来组织和排列文件存取的,所以它是可见的。在Linux中,可以通过ls等命令工具查看其结 构。在Linux系统中,我们见到的都是树形结构,比如操作系统安装在一个文件系统中,此文件系统表现 为由”/”起始的树形结构。
文件系统常用命令 • 常见文件系统的设备名 • 文件系统常用命令 • ls • chmod • chattr • df • fdisk • ls • du • mount
嵌入式文件系统 • Linux系统必须要有一个根文件系统。在嵌入式Linux设备中, 通常没有硬盘之类的存储设备,主要的存储设备为RAM (DRAM、SDRAM)和ROM(常采用FLASH存储器)。 • 鉴于Flash存储介质的读写特点,传统的Linux文件系统己经不 适合应用在嵌入式系统中。比如ext2文件系统是为像IDE那样的 块设备设计的,这些设备的逻辑块是512字节、1024字节等大 小,没有提供很好的扇区擦写支持,不支持损耗平衡,没有掉电 保护,也没有特别完美的扇区管理,这不太适合于扇区大小因设 备类型而划分的闪存设备。基于这样的原因,产生了很多专为 Flash设备设计的文件系统。 • 常用的基于存储设备的文件系统类型包括:jffs2、yaffs、 cramfs、romfs、ramdisk、ramfs/tmpfs等。
基于Flash的文件系统 • Flash(闪存)作为嵌入式系统的主要存储媒介有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 • 闪存主要有NOR和NAND两种技术。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统。 • 传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。 • 在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。 • 一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
基于Flash的文件系统(2) • Flash设备的两大类型(Nor Flash和Nand Flash) • NOR型闪存可以直接读取芯片内储存的数据,因而速度比较快,但是价格较高。NOR型芯片,地址线与数据线分开,所以NOR型芯片可以像SRAM一样连在数据线上,对NOR芯片可以“字”为基本单位操作,因此传输效率很高,应用程序可以直接在Flash内运行,不必再把代码读到系统RAM中运行。它与SRAM的最大不同在于写操作需要经过擦除和写入两个过程。 • 有Nor Flash 来存储Bootloader 比较方便,因为可以直接在Flash内运行程序. • NAND型闪存芯片共用地址线与数据线,内部数据以块为单位进行存储,直接将NAND芯片做启动芯片比较难。NAND闪存是连续存储介质,适合放大文件。擦除NOR器件时是以64-128KB的块进行的,执行一个写入/擦除操作的时间为5s;擦除NAND器件是以8-32KB的块进行的,执行相同的操作最多只需要4ms。 • NAND Rash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。NOR flash占据了容量为1―16MB闪存市场的大部分,而NAND flash只是用在8―128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储。 • 寿命(耐用性),在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。
Flash驱动的类型 • Flash 驱动都可以看一种特殊的块设备,当前在嵌入式Linux中有三种常用的块驱动抽象层 . • Blkmem驱动层 • Blkmem驱动是为uclinux专门设计的,也是最早的一种块驱动程序之一,现在仍然有很多嵌入式Linux操作系统选用它作为块驱动程,尤其是在uClinux中。它相对来说是最简单的,而且只支持建立在NOR型Flash和RAM中的根文件系统。使用Blkmem驱动,建立Flash分区配置比较困难,这种驱动程序为Flash提供了一些基本擦除/写操作。 • RAMdisk驱动层 • RAMdisk驱动层通常应用在标准Linux中无盘工作站的启动,对Flash存储器并不提供任何的直接支持, RAM disk就是在开机时,把一部分的内存虚拟成块设备,并且把之前所准备好的档案系统映像解压缩到该RAM disk环境中。当在Flash中放置一个压缩的文件系统,可以将文件系统解压到RAM,使用RAM disk驱动层支持一个保持在RAM中的文件系统。 • MTD驱动层 • 为了尽可能避免针对不同的技术使用不同的工具,以及为不同的的技术提供共同的能力,Linux内核纳入了MTD子系统(memory Technology Device)。它提供了一致且统一的接口,让底层的MTD芯片驱动程序无缝地与较高层接口组合在一起。
MTD简介 • MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。 • MTD包含特定Flash芯片的驱动程序,开发者要选择适合自己系统的Flash芯片驱动。Flash芯片驱动向上层提供读、写、擦除等基本的操作,MTD对这些操作进行封装后向用户层提供MTD char和MTD block类型的设备。 • MTD char类型的设备包括/dev/mtd0, /dev/mtdl等,它们提供对Flash原始字符的访问。MTD block类型的设备包括/dev/mtdblock0,/dev/mtdblock1等,MTD block设备是将Flash模拟成块设备,这样可以在这些模拟的块设备上创建像Cramfs, JFFS2等格式的文件系统。 • MTD驱动层也支持在一块Flash上建立多个Flash分区,每一个分区作为了一个MTD block设备,可以把系统软件和数据等分配到不同的分区上,同时可以在不同的分区采用不用的文件系统格式。这一点非常重要,正是由于这一点才为嵌入式系统多文件系统的建立提供了灵活性。 • 常见的Flash 文件系统都是基于MTD驱动的
常见的几种Flash文件系统 • Romfs • 传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。 • Cramfs • Cramfs是Linux的创始人Linus Torvalds开发的一种可压缩只读文件系统在Cramfs文件系统中,每一页被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间。Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM 空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时, Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。
常见的几种Flash文件系统(2) • Jffs2 • Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2) • JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。 • JFFS2是一个可读写的、压缩的、日志型文件系统,并提供了崩溃/掉电安全保护,克服了JFFS的一些缺点:使用了基于哈希表的日志节点结构,大大加快了对节点的操作速度 • 支持数据压缩;提供了“写平衡”支持;支持多种节点类型;提高了对闪存的利用率,降低了内存的消耗。这些特点使JFFS2文件系统成为目前Flash设备上最流行的文件系统格式 • 它的缺点就是当文件系统已满或接近满时,JFFS2运行会变慢,这主要是因为碎片收集的问题。 • 用于NOR Flash 比较多
常见的几种Flash文件系统(3) • YAFFS • YAFFS/YAFFS2是一种和JFFSx类似的闪存文件系统,它是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。 • 它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等 • 为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作 • YAFFS2支持大页面的NAND设备,并且对大页面的NAND设备做了优化。JFFS2在NAND闪存上表现并不稳定,更适合于NOR闪存,所以相对大容量的NAND闪存,YAFFS是更好的选择。
基于RAM的文件系统 • Ramdisk • Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。 在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。 • Ramfs/Tmpfs • Ramfs也是Linus Torvalds开发的,Ramfs文件系统把所有的文件都放在RAM里运行,通常是Flash系统用来存储一些临时性或经常要修改的数据,相对于ramdisk来说,Ramfs的大小可以随着所含文件内容大小变化,不像ramdisk的大小是固定的。Tmpfs是基于内存的文件系统,因为tmpfs驻留在RAM 中,所以写/读操作发生在RAM 中。tmpfs文件系统大小可随所含文件内容大小变化,使得能够最理想地使用内存;tmpfs驻留在RAM,所以读和写几乎都是瞬时的。tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
网络文件系统NFS • NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。 • Linux可以在启动时直接用把一个NFS文件系统作根文件系统启动 • 把内核支持NFS启动支持打开编译选项打开 • networking options->IP:kernel level auloconfiguralion项选中file systems->network file systems->的root file system on nfs和nfs file system support • 设置启动参数 root=/dev/nfs rw nfsroot=<nfs_server >:<root_path> ip • Root=/dev/nfs 指定要挂接NFS根文件系统 • Rw 表示按可以可读可写属性挂接 • nfs_server是NFS服务器IP • root_path 是nfs共享目录 • Ip是本机IP地址 • 例如root=/dev/nfs rw nfsroot=192.168.1.100:/root_dir/root_china noinitrd init=linuxrc console=ttys0 ip=192.168.1.10 • 也可以启动后把某个NFS目录mount到Arm-Linux上某个目录. • mount –o nolock 192.168.1.100:/root_dir/root_china /mnt
文件系统的创建 • 文件系统的创建通常都有一组以mk打头工具,如mkcramfs,mkyaffs,mkfs.jffs2 • NFS 根文件系统比较特殊,是否远程NFS服务器上一个目录
根文件系统结构 • Linux的根文件系统可能包括如下目录 • (1)/bin (binary):包含着所有的标准命令和应用程序; • (2)/dev (device):包含外设的文件接口,在Linux下,文件和设备采用同种地方法访问的,系统上的每个设备都在/dev里有一个对应的设备文件; • (3)/etc (etcetera):这个目录包含着系统设置文件和其他的系统文件,例如/etc/fstab(file system table)记录了启动时要mount 的filesystem; • (4)/home:存放用户主目录; • (5)/lib(library):存放系统最基本的库文件; • (6)/mnt:用户临时挂载文件系统的地方; • (7)/proc:linux提供的一个虚拟系统,系统启动时在内存中产生,用户可以直接通过访问这些文件来获得系统信息; • (8)/root:超级用户主目录; • (9)/sbin:这个目录存放着系统管理程序,如fsck、mount等; • (10)/tmp(temporary):存放不同的程序执行时产生的临时文件; • (11)/usr(user):存放用户应用程序和文件。 • Linux 根文件系统要包括busybox • 为了让共享链接的程序也运行起来,通常会从gcc 的lib 库的拷贝最重要的动态链接库
NFS根文件系统的使用 • NFS根文件系统常用于调试根文件 • 配置远程NFS服务器一个共享目录 • 把busybox,共享库和应用程度拷贝这个目录下 • 在bootloader 设置NFS启动参数 • root=/dev/nfs rw nfsroot=192.168.1.145:/root_arm noinitrd init=linuxrc console=ttys0 ip=192.168.1.230 • 在vivi的控制台下,用set linux_cmd_line “…”把参数设置进去,设置成功后用boot命令启动根文件系统
RamDisk的创建 • Ramdisk就是利用内存空间来模拟出硬盘分区,2.4内核支持用RamFS来创建RamDisk. • 在redhat9.0创建RamDisk的步骤. • 1.在上用mke2fs 命令把在内核创建一个ramdisk • mke2fs /dev/ram0 • 2.把RAMDISK挂载到文件系统中 • mkdir /home/myram • mount /dev/ram0 /home/myram • df –k /dev/ram0 #显示分区信息 • 通过上面三步操作,把ram0安装在目录/home/myram上,对这个目录的操作就对RAMDISK操作
RamDisk的创建(2) • 为嵌入式设备创建RamDisk根文件系统 • 1.创建image文件 • dd if=/dev/zero of=myram2 bs=1k count=4096 • 上述命令创建一个4M的Image文件myram2,并通过/dev/zero初始化.(即dd生成4096块的1k空间,并用0填充 • 2.格式化image文件 • mke2fs –F myram2 • 3.利用loopback设备挂载块文件 • mkdir /home/tmp • mount –o loop myram2 /home/tmp • 4.制作RAMDISK • 按根目录要求在/home/tmp创建多个目录, • cd /home/tmp • mkdir dev bin sbin lib mnt usr proc home etc • 复制共享库,假设用编译器是 gcc 3.3.2 • 从 /usr/local/arm/3.3.2/arm-linux/lib 拷贝. libc libcrypt libdl libm libpthread libresolv libutil 打头的so文件,和ld打头的so文件 • 拷贝busybox • cp –rf /busybox-1.2.0/_install/* /mnt/ • 从busybox 的_install 目录下拷贝/bin,/sbin目录过来
RamDisk的创建(3) • 创建必要的设备文件 • cd /home/tmp/dev • mknod -m 660 console c 5 1 • mknod -m 660 null c 1 3 • 5.卸载RAMDISK,并且压缩 • cd .. • umount /home/tmp • gzip -9 myram2 • 这样会生成 myram2.gz 这个文件
RamDisk的内核支持配置 • 调整Ramdisk大小,要跟先前创建myram2 尺寸一致,block devices配置如下图:
yaffs文件系统的创建 • Yaffs/Yaffs2专门针对Nand Flash 设备的文件系统.并有较强的移植性. • 使用mkyaffsimage 命令来创建文件系统image • ./mkyaffsimage root_qtopia_tp root_qtopia_tp.img • 命令格式 ./mkyaffsimage <目录名> <image文件名> • yaffs 文件系统下载 • 在DNW下,vivi 控制台输入 loadyaffs root u • Yaffs 文件系统启动时,用root=/dev/mtdblock/N
cramfs文件系统的创建 • 内核要求支持cramfs 格式 • mkcramfs 命令创建image 格式 • mkcramfs <目录名> <image名字> • Linux启动参数将使用 root=/dev/bon/N来安装cramfs 文件作为根目录
Jffs2文件系统的创建 • 内核要求支持jffs2 格式 • mkfs.jffs2 命令创建image 格式 • mk.jffs2 –d <目录名> -o <image名字> • Linux启动参数将使用 root=/dev/bon/N来安装cramfs 文件作为根目录
课堂练习 • 用NFS启动根文件系统 • 用mkyaffs 制作一个根文件系统,下载到Flash • 由内存中内核启动 • 由Flash中内核启动 • 试着从0制作一个根文件系统,在各种模式运行起来
谢谢,请提问 在疯狂的时代把握未来