实验九根文件系统构建实验.docx
- 文档编号:12218693
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:19
- 大小:546.13KB
实验九根文件系统构建实验.docx
《实验九根文件系统构建实验.docx》由会员分享,可在线阅读,更多相关《实验九根文件系统构建实验.docx(19页珍藏版)》请在冰豆网上搜索。
实验九根文件系统构建实验
实验九根文件系统构建实验
一、实验目的
1)了解嵌入式操作系统中文件系统的类型和作用。
2)了解yaffs2文件系统的优点及其在嵌入式系统中的作用。
3)掌握利用BusyBox软件制作嵌入式文件系统的方法。
4)掌握嵌入式Linux文件系统的的挂载过程。
二、实验工具
1)操作系统:
ubantu10
2)交叉编译工具:
3)文件系统制作工具:
busybox-1.17.2-20101120.tgz
4)文件系统镜像制作工具:
mkyaffs2image-128M
三、实验要求
利用BusyBox构建简单的根文件系统,并将其制作成为yaffs格式的文件系统镜像,并
下载到A8实验板,要求如下:
1)kernel能够成功挂载根文件系统,
2)通过串口终端查看所建立的根目录,
3)在自己建立的根文件系统中运行简单的“helloworld”程序。
四、实验讲解
文件系统是操作系统中组织、存储和命名文件的一种基本结构,是操作系统中统一管理信息资源的一种方式,可以管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,方便用户使用。
它的存储媒质包括磁盘、光盘、FLASH等,FAT(文件分配表)是最常用的一种文件系统格式,主要优点是可以允许多种操作系统访问。
Linux的一个最重要特点就是它能同时支持多种文件系统。
在加载根文件系统之后可以自动或手动挂载其他的文件系统。
因此,一个系统中可以同时存在多个不同的文件系统。
这使Linux非常灵活,能够与许多其他的操作系统共存。
Linux支持的常见的文件系统有:
JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。
随着时间的推移,Linux支持的文件系统数还会增加。
每台机器都有根文件系统,它包含系统引导和使其他文件系统得以mount(挂载)所必要的文件,根文件系统应该有单用户状态所必须的足够的内容。
还应该包括修复损坏系统、恢复备份等的工具。
根文件系统或者可以认为是一组特定的目录结构,不同的目录里面存放了不同名称,不同用途的文件,方便系统及用户应用程序查找及调用。
根文件系统中各顶层目录,均有其特殊的用法和目的。
下表提供了Linux根文件系统各顶层目录的完整清单。
表9-1linux根目录介绍
目录
内容
bin
必要的用户命令(二进制文件)
boot
引导加载程序所使用的静态文件
dev
设备文件和其他特殊文件
etc
系统配置文件,包括启动文件
home
用户主目录
lib
必要的程序库(例如C程序库)以及内核模块
media
挂载点,用于可移除媒体
mnt
挂载点,用于临时挂载的文件系统
opt
附加的软件套件
proc
用于提供内核与进程信息的虚拟文件系统
root
root用户的主目录
sbin
必要的系统管理员命令(二进制文件)
sys
系统信息与控制(总线、设备以及驱动程序)的虚拟文件系统
tmp
临时文件
usr
在第二层包含了对大多数用户有用的大量应用程序和文件,包括X服务器
var
用于存放服务程序和工具程序的可变资料
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。
之后可以自动或手动挂载其他的文件系统。
因此,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的场合。
在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM)和ROM(常采用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芯片也可以合并为一个分区使用,采用一个文件系统。
即文件系统是针对于存储器分区而言的,而非存储芯片。
JFFS
JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。
JFFS2是RedHat公司基于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闪存会耗费大量时间。
yaffs
yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。
与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。
另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。
当然,yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。
同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
Cramfs
Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。
它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:
1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
由于以上特性,Cramfs在嵌入式系统中应用广泛。
但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。
Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里
Romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。
uClinux系统通常采用Romfs文件系统。
其他文件系统:
fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。
ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。
基于RAM的文件系统
1. Ramdisk
Ramdisk是将一部分固定大小的内存当作分区来使用。
它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。
将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存
2. ramfs/tmpfs
Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。
(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。
)
Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。
Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:
不能格式化,文件系统大小可随所含文件内容大小变化。
Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
3.网络文件系统NFS (Network File System)
NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。
在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统。
实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。
补充知识点1
Øinittab
在创建这个文件之前先了解一下它的作用:
Linux内核引导完成以后,就启动系统的第一个进程init,init进程称为所有进程之父,进程号是1,位于sbin目录下。
init进程需要读取/etc/inittab文件作为其行为指针,inittab是以行(hang)为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:
id:
runlevel:
action:
process
其中,各字段以及与其相关的说明如下:
●id:
登记项标识符,最多为4个字符。
用于惟一地标识/etc/inittab文件中的每一个登记项。
●runlevel:
系统运行级,就是操作系统当前正在运行的功能级别。
这个级别从1到6,具有不同的功能。
如果该字段为空,那么相应的登记项将适用于所有的运行级。
所有功能级别参考表9-1。
●action:
动作关键字。
用于指定init(M)命令或进程对相应进程(在“process”字段定义)所实施的动作。
参考表9-2。
process:
所要执行的shell命令。
任何合法的shell语法均适用于该字段。
表9-1系统运行级
runlevel
功能级别
0
停机(千万不能把initdefault设置为0)
1
单用户模式
2
多用户模式,没有NFS
3
完全的多用户模式
4
没有用的
5
X11
6
重新启动(千万不能把initdefault设置为0)
表9-2action动作对应表
action
执行动作
sysinit
系统引导期间执行此进程。
本进程会在boot或bootwait条目之前得到执行。
runlevels域被忽略。
respawn
该进程只要终止就立即重启
askfirst
类似respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。
它将会促使init在控制台上显示“PleasepressEntertoactivethisconsole”的信息,并在重新启动之前等待用户按下Enter键
restart
init重新启动时执行的进程
shutdown
系统关机时执行相应的进程
boot
系统引导过程中执行该进程,runlevel域被忽略
bootwait
系统引导过程中执行该进程,并且,init等待该进程的结束。
当该进程死亡时,也不重新启动该进程。
initdefault
指定系统引导完成之后的默认运行级。
如果不存在该登记项,那么init将要求用户在系统启动时指定一个最初的运行级。
off
如果相应的进程正在运行,那么就发出一个警告信号,等待20秒后,再通过杀死信号强行终止该进程。
如果相应的进程并不存在就忽略。
once
只要进入相应的运行级别,init就执行该进程一次。
ondemand
与“respawn”的功能完全相同,但只用于运行级为a、b或c的登记项。
powerfail
只在init接收到电源失败信号时执行相应的进程,但不等待该进程结束。
powerwait
只在init接收到电源失败信号时执行相应的进程,并在继续对/etc/inittab文件进行任何处理前等待该进程结束。
wait
只要进入指定的运行级别就启动该进程,并且init等待该进程结束
ctrlaltdel
按下Ctrl-Alt-Delete的组合键时执行的进程
补充知识点2
创建设备文件
先了解一下Linux的设备:
Linux中主要有2种类型的设备:
字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。
每个设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。
这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。
每个设备在/dev目录下都有一个对应的文件(节点)。
可以通过cat/proc/devices命令查看当前已经加载的设备驱动程序的主设备号。
你可以在你的宿主机上执行这个命令看看你的宿主机所拥有的设备文件,可以看到,Linux有很多很多的设备文件,在嵌入式Linux中并没有这么多的设备,下面用mknod命令创建一些主要设备文件。
关于Linux的设备号:
很多设备在Linux下已经有默认的主次设备号,如帧缓冲设备是Linux的标准字符设备,主设备号是29,如果Linux下有多个帧缓冲设备,那么这些帧缓冲设备的次设备号就从0~31(Linux最多支持32个帧缓冲设备)进行编号,比如fb0对应的次设备号就是0,fb1为1,类推。
用户也可以创建自己的设备文件,比如下一篇章中我们要讨论的Led设备,需要注意的是用户自己的设备号不能与一些标准的系统设备号重叠。
Linux下创建设备节点的命令是mknod,下面是它的命令格式:
mknodName{b|c}MajorMinor
Name是设备名称,“b”或“c”用来指定设备的类型是块设备还是字符设备。
Major指定设备的主设备号,Minor是次设备号。
创建嵌入式Linux系统中一些基本的设备文件,必须是root权限
五、实验步骤
第一步:
配置busybox
1、从网上下载BusyBox软件包(busybox-1.17.2-20101120.tgz),也可以用我们提供的软件包,把该软件解压到/opt目录下。
【图9-1】
2、切换到busybox目录,执行makemenuconfig命令,进入busybox图形配置界面,如【图9-2】所示。
按键盘上下键移动选择对应的选项,如果有下级菜单,敲回车进入下级菜单,在对应的菜单项中敲空格可以选中与取消选择该项如图9-3。
【图9-2】
【图9-3】配置界面
3、为了简化配置过程,用户可以先加载一个默认的配置文件,首先在配置主界面中向下翻页,找到“LoadanAlternateConfigurationFile”项,如图9-4所示;
【图9-4】加载配置文件
按下回车键后,可看到如图9-5所示画面
【图9-5】进入加载配置文件选项界面
首先将其中的“.config”删除,并输入“fa.config”,然后回车,如图9-6所示
【图9-6】输入配置文件名
接下来可以根据自己的需要配置BusyBox中包含的命令。
完成后,回到配置界面的主界面,选择“Exit”退出配置程序,会弹出是否保存的提示,选择“Yes”,如图9-7所示;
【图9-7】退出并保存配置
4、回到终端后,执行make,编译成功后执行“makeinstall”命令,或者按照如图9-8所示执行命令;
【图9-8】编译安装Busybox
等待编译安装结束,可以看到图9-9所示的提示;
【图9-9】编译安装结束
可以看到,在Busybox文件夹的上一级目录中,生成了一个名为“rootfs”的文件夹,其中包含了bin、sbin两个文件夹,并包含一个linuxrc的链接,如图9-10所示;
【图9-10】安装之后的目录结构
第二步、创建其他目录和文件
1、进入由busybox所生成的rootfs目录,在该目录下添加以下目录结构,所使用命令如下(以下命令也可以写一个脚本直接运行):
1cd/opt/rootfs
2mkdirrootdevbootetclibprocsysmnttmpvarhome
3chmod1777tmp
4mkdirusr/libusr/modules
5mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
6mkdirvar/libvar/lockvar/logvar/runvar/tmp
7chmod1777var/tmp
Ø第一行进入根文件系统目录。
Ø第二行在根目录下创建一级目录rootdevbootetclibprocsysmnttmpvarhome。
Ø第三行更改tmp权限,使得用户只能修改、删除自己在本目录下创建的文件。
Ø第四行创建usr目录下的子目录
Ø第五行创建mnt目录下的子目录。
Ø第六行创建var目录下的子目录。
Ø第七行更改var/tmp目录的权限。
2、创建设备文件。
在本实验中,系统控制台console,可以使用mknod命令来创建。
mknod-m600dev/consolec51
mknod-m600dev/nullc13
Ø第一行创建系统控制台设备
Ø第二行创建空设备,任何写入都将被丢弃,任何读取都得到EOF
本次配置中devs设备配置采用mdev方式
第三步、建立etc目录下的配置文件
1、Linux启动所需要的文件有etc/inittab、etc/init.d/rcS、etc/fstab这三个文件,在etc下建立inittab文件,在该文件呢输入以下内容(使用vi编辑器编辑以下内容即可,或者nano)
:
:
sysinit:
/etc/init.d/rcS
:
:
askfirst:
-/bin/sh
:
:
respawn:
-/bin/sh
:
:
restart:
/sbin/init
:
:
ctrlaltdel:
/sbin/reboot
:
:
shutdown:
/bin/umount-a-r
:
:
shutdown:
/sbin/swapoff-a
分析该配置文件,可以知道init进程首先执行/etc/init.d/rcS脚本文件,该文件马上就会被创建。
2、创建rcS文件,执行命令:
mkdiretc/init.d
nanoetc/init.d/rcS
在文件中添加如下内容:
#!
/bin/sh
#mountallfilesystemdefinedin"fstab"
echo"#输入你们小组成员名字"
echo"#mountall......."
/bin/mount-a
更改该文件的权限:
chmod777rcS
3、创建fstab文件,执行命令:
nanoetc/fstab
在文件中添加如下内容:
proc/procprocdefaults00
none/tmpramfsdefaults00
sysfs/syssysfsdefaults00
mdev/devramfsdefaults00
第四步、建立动态链接库
该目录下存放程序运行时所需要的加载器和动态库,我们可以直接从前面已经安装好的
交编译器中拷贝相应的库文件。
cd/opt/rootfs/lib
cp-a/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/*.so*./
第五步、制作根文件系统映像文件
1、使用友善之臂提供的制作yaffs2文件制作工具mkyaffs2image-128M,该制作工具在mktools-20120518.tar.gz内,先对该文件进行解压,如下:
tarxvfzmktools-20120518.tar.gz–C/
该文件被解压到/usr/sbin目录下
2、在mkyaffs2image-128M制作工具目录下(要进入到/usr/sbin目录下)执行以下命令“
mkyaffs2image-128M/opt/rootfs/opt/rootfs_qtopia_qt4.img
将生成的根文件系统映像文件拷贝到SD卡,重启开发板,看到下图表示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 文件系统 构建