880 likes | 1.15k Views
第 9 章 文件系统. 本章主要内容. 本章主要介绍: ◆ Linux 的文件系统结构。 ◆ Linux 采用的 VFS ,支持如 romfs 、 ramfs 、 ex2 、 jffs2 、 ms-dos 、 nfs 等各种文件系统。 ◆ Linux 源程序和开发板根文件系统 romfs 的目录结构和功能描述。 ◆ 在 uClinux 中文件的打开和读写操作示例。. 目 录. 9.1 文件系统结构 9.2 文件系统类型 9.2.1 romfs 文件系统 9.2.2 ramfs 文件系统
E N D
本章主要内容 本章主要介绍: ◆ Linux的文件系统结构。 ◆ Linux采用的VFS,支持如romfs、ramfs、ex2、jffs2、ms-dos、nfs等各种文件系统。 ◆ Linux源程序和开发板根文件系统romfs的目录结构和功能描述。 ◆ 在uClinux中文件的打开和读写操作示例。
目 录 9.1 文件系统结构 9.2 文件系统类型 9.2.1 romfs文件系统 9.2.2 ramfs文件系统 9.2.3 JFFS与JFFS2文件系统 9.2.4 EXT2文件系统 9.3 文件系统目录结构 9.3.1 romfs文件系统目录结构 9.3.2 uClinux源程序结构 9.4 简单编程事例
9.1 文件系统结构 • Linux透明的支持许多不同的文件系统,将各种安装的文件和文件系统以一个完整的虚拟文件系统的形式呈现给用户。
9.1 文件系统结构 • 简介 将文件系统的操作和管理纳入统一的框架当中来,使得内核的文件系统接口,如同标准的的文件系统“总线”,让用户通过同一组系统调用来管理和操作不同类型文件系统上的文件。这个统一的、抽象的、虚拟的文件系统接口,被称为VFS(virtual组标准的文件操作接FileSystem Switch),主要包含一口。 VFS与具体文件系统的关系如图9-1所示。
图9-1 VFS与具体文件系统的关系 文件系统操作的系统调用界面,包括read(),write(),open(),close()等 用户空间 用户程序(进程) 函数sys_read() sys_write() sys_open()等 VFS 系统空间 通过file结构中的f_op指针实现的”文件系统总线” minix Ext2 FAT 设备文件 … … …
9.1 文件系统结构 • 文件访问 • 用户访问磁盘文件系统时,对于目录树下的访问, 最终将转换成对这一部分物理磁盘的访问 • 对于设备文件的访问,最终将转换成对于对于驱动程序的访问。 注意:这两种系统文件的访问最终都反映在磁盘驱动程序上!! 对于磁盘文件系统中文件的访问,是在文件目录树的结构下,对于有组织的数据进行的;而对磁盘设备文件进行访问,则是对于线性空间内数据的访问,也就是无法看到数据的组织情况。 • 对于其他特殊文件的访问,一般是在Linux的内存数据结构中完成的。
9.2 文件系统类型 在uClinux的系统中 ,一般内存的容量比较小 外存只配置小容量的FLASH。 在uClinux中,常用的文件系统有: • romfs文件系统, • 虚拟ramdisk, • JFFS文件系统。 • 有网络设备的系统,使用NFS文件系统。
9.2.1 romfs文件系统 • 简介 romfs(rom file system)是一种只读文件系统,系统的管理代码占用的空间比较小,系统创建romfs文件系统需要使用genromfs工具。 值得注意的是,romfs的文件访问权限和属主这些信息尚未完全实现。 由于romfs文件系统是只读的,所以可以做得很小,从而节省空间。如果要进行写操作,只能在编译的时候加上写访问功能,或者在运行时另外生成一个RAMdisk送暂存数据。
9.2.1 romfs文件系统 • romfs文件系统结构 • romfs文件系统是为了对块设备进行高效管理而开发的。所有的romfs文件,经过genromfs程序生成之后,合并到一个文件(即romfs的映象文件)中去。只需要采用mount命令将这个文件挂接到任何一个目 录下,就可以对romfs中的文件以正常方式进行访问了。 romfs映像文件的文件组织方式如表9-1所示。
表 9-1 romfs映像文件头部结构 偏移量 内容 0-4 R O M 4-8 I F S 8-12 full size 12-16 cheeksum 16 volume name … file headers … …
9.2.1 romfs文件系统 • romfs映像文件开始的8个字节存放了ASCII码“-ROM1FS-”,后面存放了这个文件系统的字节数。 • checksum存放从文件头开始的512个字节的校验码。然后是文件系统的卷标名称,该名称以ASCII值为0的字符结尾,所占用的空间为16字节的整数倍。 后面存放各个文件的头部结构如表9-2所示。
9.2.1 romfs文件系统 • spec.info域主要有如下几种情况: 0:硬链接,spec.info域的内容用于链接的目标文件 1:目录,spec.info域的内容为第一个文件的文件头 2:普通文件,spec.info域的内容无效,应设置为0 3:符号链接,spec.info域的内容无效,应设置为0
9.2.1 romfs文件系统 4:块设备,spec.info域内容为各16bit的主、从设备号 5:字符设备,spec.info域的内容无效,设置为0 6:网络socket套接字spec.info域的内容无效,设置为0 7:fifo管道文件,spec.info域的内容无效,设置为0 注意:romfs文件系统为了减小module的大小省略了很多完整性检测的代码。如:不要生成硬链接循环,要为当前目录和父目录生成“.”和“..”链接。
9.2.1 romfs文件系统 • EV44B0II的romfs的制作过程如图9-3所示。 系统启动 时读取 romfs 文件系统 中的数据 在主机的 /romfs目 录下生成 需要的目 录结构 使用工具 将/romfs 目录转换 为/romfs的 组织结构 /romfs.img 将romfs.img 作为初始化 数据连接到 linux内核当 中
9.2.1 romfs文件系统 • romfs使用: • 在主机的/romfs目录下生成需要的目录结构 • 利用genromfs工具,将/cygdrive/d/aaaa/uClinux-44b0ii/romfs目录生成ROMdisk的romfs映像文件 romfs.img genromfs–v–V"ROMdisk"-f/cygdrive/d/aaaa/images/romfs.img –d/cygdrive/d/aaaa/uClinux-44b0ii/romfs
9.2.1 romfs文件系统 • 将romfs.img作为初始化数据连接到Linux内核当中。 • 使用romfs的文件系统的时,可采用mount命令直接将其挂接到合适的目录下,例如(假设/dev/ram0是romfs文件系统的设备): mount -t romfs /dev/rom0 /var 这样把/dev/ram0挂接到/var目录上去,此后直接对/var目录进行操作即可。但romfs映射到内存中,仍旧无法支持动态擦写保存。如需要动态保存数据可以采用虚拟ramdisk或JFFS进行处理。
9.2.2 ramfs文件系统 • Ramdisk简介 • ramdisk是使用RAM虚拟的磁盘(该驱动程序在/linux/drivers/block/rd.c),是一个作为盘分区使用的内存块,或者说将内存模拟为硬盘空间。 • 使用ramdisk可以提高访问速度,若已知某个文件将被高频率访问,通过将文件存放在内存里就可以提高性能。通过加载EXT2文件系统来管理和操作文件。
9.2.2 ramfs文件系统 • 使用ramdisk : • ramdisk的配置项是/config/.config文件中的CONFIG_USER_RAMIMAGE_RAMFS128(128K)。ramdisk的加载过程包含在/vendors/micetek/44b/rc文件中: bin/expand /etc/ramfs.img /dev/ram0 mount -t ext2 /dev/ram0 /var 过程:1.将预先生成的EXT2的磁盘映像压缩格式释放到块设备上 2.使用mount命令将ram块设备中的文件系统安装到 根文件系统的/var下。 3.可以对ramdisk进行文件操作了。
9.2.3 JFFS与JFFS2文件系统 • ramdisk是运行在内存中的,所以在系统掉电后,所有保存的数据都会丢失。 这时,一个比较好的选择是JFFS文件系统(最新的版本是JFFS2),JFFS文件系统一般使用FLASH作为磁盘,所以在掉电后数据不会丢失;而且,JFFS可以对由于在掉电时刻操作导致的不完整数据进行修复。
9.2.3 JFFS与JFFS2文件系统 • JFFS • JFFS 存储格式 JFFS是一个日志结构的文件系统。只有一种文件节点,它通过jffs_raw_inode这个结构进行描述。每个这样的节点都关联到某个文件上,其中包含了一个简单的头部、辅助信息以及存储的数据。存储的辅助信息包括通常所记录的文件inode信息(如uid,gid等)及所关联的文件名。 注意:由于在JFFS中,大的文件都分为很多节点存放,所以除了存放数据外,还要额外保存数据在文件中的偏移量。设备文件节点和符号链接等特殊的文件只需要占用很小的空间。
9.2.3 JFFS与JFFS2文件系统 • 删除文件时, 在辅助信息存放的地方设置一个已删除标记, 被删除文件的Flash块都会加上这个已删除标记,在该文件的文件句柄释放后,这些节点就成为废弃节点了。 • 更新文件的时,新的文件存放的节点会添加到所有已经使用的存储空间的末尾,旧版本的文件也会被废弃,等待在回收空间的时候重新分配利用。
9.2.3 JFFS与JFFS2文件系统 • 挂接挂接JFFS文件系统时,会把整个存储设备扫描一次,每个存储块都读取一次,然后根据所有节点中存储的信息来生成一个文件系统的目录树,同时也自动生成了一个文件在Flash中物理存储位置的对应表,用来进行文件的寻址操作。 • 文件系统操作的实施过程
9.2.3 JFFS与JFFS2文件系统 • 读取文件目录结构可以通过mount时生成的信息获得,cd和rmdir等目录操作都可以直接根据这些信息来确定如何操作。读取文件时,利用mount时生成的物理地址将指定的内容读入到缓存区中。
9.2.3 JFFS与JFFS2文件系统 • 改变属性 例如改变文件的属主(chown命令)和操作权限(chmod命令)等操作,只需要将一个记录新的信息的节点写到Flash已利用的存储空间的末尾,然后将旧节点标记为废弃节点即可。 写文件等操作也与此类似,并不是通过直接改写旧节点来完成的。
9.2.3 JFFS与JFFS2文件系统 • 空间回收 • JFFS的文件系统操作使占用的存储块增多, 当所有存储块都被占用后 ,文件系统开始对废弃的存储块进行回收利用。 注意:如果发现所有回收空间加起来仍不足以满足当前操作的需求,则系统不能继续当前的操;
9.2.3 JFFS与JFFS2文件系统 • 同时,系统也自动从所有存储块中的第一个开始进行分析,不断将废弃的节点回收,将尚在使用的节点进行合并,最终合成出整个的——块废弃的Flash存储块,这样就可以将这一整块存储块的内容一次性擦除,成为新的空闲块。
9.2.3 JFFS与JFFS2文件系统 • 缺陷 • 对空间回收,JFFS并没有进行太多优化,效率不高。它是按照顺序,从第一个数据块开始腾出空间,如果第一块写满了有效数据,它也会将这些数据后移,腾出第一块来作为空闲块。 但这种方式保证了Flash的每一块都可以得到相同的擦写次数,有利于提高整个Flash设备的使用寿命。
9.2.3 JFFS与JFFS2文件系统 • JFFS不支持对数据进行压缩之后存储。而在嵌入式系统中,如果数据可以得到最大限度的压缩,可以提高资源的利用率,提高性能、节省成本。 • 不支持硬链接,每一个存储块中都保存了对应的文件名。这样,就算是很常用的改名操作,也需要增加一个新的需要保存全部所需数据的存储块进行存储。
9.2.3 JFFS与JFFS2文件系统 • JFFS2的主要改进 • JFFS2的节点头部中增加了一些新的信息,包括CRC校验码和节点类型等。 • 由于JFFS空间回收方式的缺陷,在JFFS2中,所有的存储节点都不可以跨越Flash的块界限了。 • 这样,就可以在回收空间的时候,按照Flash的各个块为单位,进行选择,将最合适的块腾出来,擦除之后作为新的空闲块,提高效率与利用率。
9.2.3 JFFS与JFFS2文件系统 • JFFS2 有3种 节点类型了,分别用于表示擦除块的标记、普通文件、目录。 第一种是在Flash擦除了一块之后建立的,用于表明F1ash的块擦除工作完成。 • 文件系统的信息可以很快取得数据并不保存在内 存之中,从而可以提高内存的利用率。 • 增加了对数据的压缩。 • 开始支持硬链接。
9.2.3 JFFS与JFFS2文件系统 • JFFS文件系统的结构
9.2.3 JFFS与JFFS2文件系统 • MTD 是内存技术设备子系统,负责操作和管理FLASH和RAM物理器件,可以自动识别该器件,还支持将一块FLASH器件分为不同的分区管理,这样可以将Linux内核和根文件系统分别存在不同的分区,避免由于FLASH擦写和文件系统组织结构的相互影响。 • MTD 向JFFS提供了字符型和块设备,对于需要无延时的写入使用字符设备,如Linux内核的升级。块设备为JFFS文件系统服务,在加载JFFS文件系统后,可以操作和管理文件。 EV44B0II在使用JFFS文件系统时,要进行特殊处理,因为S3C44B0X的中断向量表在FLASH中,所以在操作FLASH擦写时,要关闭中断和快速中断,以避免FLASH在擦写状 态下,返回的状态数据,被误解成跳转地址。
9.2.4 EXT2文件系统 • 文件系统组成 每个文件系统由逻辑块的序列组成,一个逻辑盘空间一般划分 引导块、超级块、inode区以及数据区等四部分。 EXT2文件系统是Linux中主流的文件系统 。在Linux中,普通文件和目录文件保存在称为块物理设备的磁盘或者磁带上。一套Linux系统支持若干物理盘,每个物理盘可定义一个或者多个文件系统。
9.2.4 EXT2文件系统 • 引导块:在文件系统的开头,通常为一个扇区,存放引导程序,用于读入并启动操作系统。 • 超级块(superblock):用于记录文件系统的管理信息。特定的文件系统定义了特定超级块。 • inode区(索引节点):一个文件(或目录)占据一个索引节点。利用根节点(首个索引节点),可以把一个文件系统挂在另一个文件系统的非叶节点上。 • 数据区:用于存放文件数据或者管理数据(如一级间址块、二级间址块等)。
9.2.4 EXT2文件系统 • 访问EXT2 • EXT2是Linux中的一个可扩展的文件系统。通过VFS的超级块(struct ext2_sb_infoext2_sb)可以访问EXT2的超级块,通过VFS的inode(stuct ext2_inode_info ext2_i)可以访问EXT2的inode。 文件系统EXT2的源代码在: /usr/src/linux/fs/ext2目录下,数据结构在文件 /usr/src/linux/include/linux/ext2_fs.h及同一目录下的文件ext2_fs_i.h和ext2_fs_sb.h中定义。
9.2.4 EXT2文件系统 • 文件存储方式 • EXT2中文件由逻辑块的序列组成。数据块的长度相同。不同的EXT2系统长度可以不同 。 文件总是整块存储,不足一块的部分也占用一个数据块。 • EXT2中的每个文件都用一个单独的inode(即stuct ext2_inode结构)来描述,而每个inode都有一个唯一的标志号。 通过使用inode来定义文件系统的结构以及描述系统中每个文件的管理信息。
9.2.4 EXT2文件系统 • EXT2文件系统中的每个文件都用一个单独的inode(即stuct ext2_inode结构)来描述,而每个inode都有一个唯一的标志号。 EXT2通过使用inode来定义文件系统的结构以及描述系统中每个文件的管理信息。 • 挂接(mount)为ext2文件系统 mount -t ext2 /dev/ram0 /tmp 将/dev/ram0上ext2文件系统挂接到/tmp目录
9.3 文件系统目录结构 内容简介 嵌入式Linux中,文件系统通常还是按照标准的目录结构来存放所有的文件的。在本节之中,选择了uClinux(Micetek)开发环境中的默认目录、文件层次来对嵌入式Linux中的目录与文件进行介绍。
9.3.1 romfs文件系统目录结构 • uClinux生成的目录结构 / /prlc /home /sbin /bin /dev /etc /lib /tem /var /usr 图9-5 uClinux生成的romfs文件系统目录结构
9.3.1 romfs文件系统目录结构 • /bin和/sbin存放了可执行程序; • /dev目录存放的是系统设备文件,提供系统中各 种设备的说明; • /etc目录存放系统中各种关于用户帐号、网络等的 配置文件和启动脚本; • /lib下存放了库文件; • /proc下面是系统信息(本目录是虚拟目录,并不存 放在romfs中,而是在系统运行的时候自动生成);
9.3.1 romfs文件系统目录结构 • /proc下面是系统信息(本目录是虚拟目录,并不存放 在romfs中,而是在系统运行的时候自动生成); • /usr 目录是Linux系统里面占用磁盘空间最大的目 录,是用户共享文件目录; • /home是系统默认的普通用户的主目录的根目录; • /var、/tmp是一些系统记录文件和临时文件存放地。 本节主要介绍/etc,/bin,/sbin和/dev目录。
9.3.1 romfs文件系统目录结构 • /etc目录 在/etc目录中,通常保存的是启动脚本和应用程序的配置文件。 在uClinux中,/etc目录下默认文件如表9-3所示。
9.3.1 romfs文件系统目录结构 • inetd.conf(未用) 文件inetd.conf中的内容如下: telnet stream tcp nowait root /sbin/telnetd http stream tcp nowait root /sbin/httpd -i uptime stream tcp nowait root /bin/cat /proc/uptime /etc/motd 从文件内容看出: • 对telnet的登录请求,将会由/sbin/telnetd来处理; • 对http请求,则会由/sbin/http来处理; • 对于uptime,则会将/proc/uptime的内容和/etc/issue中的内容显示出来。
9.3.1 romfs文件系统目录结构 • inittab 由于要在启动的时候通过串行口向调试机发回提示信息、错误信息等,因此文件inittab这里要进行终端的初始化。 • motd(或issue) 文件motd中的内容主要是uClinux的一些欢迎信息,在启动MICETEK开发版的时候,会在登录之前显示这些欢迎信息。
9.3.1 romfs文件系统目录结构 • Passwd 文件passwd中的内容: root ab6TRGT20sY26r • rc 文件rc中的内容: hostname EV44B0II /bin/expand /etc/ramfs.img /dev/ram0 mount -t proc proc /proc mount -t ramfs /dev/ram0 /var
9.3.1 romfs文件系统目录结构 mkdir /var/config mkdir /var/tmp mkdir /var/log mkdir /var/run mkdir /var/lock cat /etc/motd ifconfig lo 127.0.0.1 route add -net 127.0.0.0 netmask 255.255.255.0 lo dhcpcd -p -a eth0 & ifconfig eth0 192.168.1.20 MDB :9999&
9.3.1 romfs文件系统目录结构 本系统的rc文件中主要完成的功能: ◆设定hostname为EV44B0II。 ◆ 使用ifconfig设定网络(ip地址、网关等)。 ◆ 使用expand将ramfs展开到/dev/ramO。 ◆ 挂接/var(ram盘)和/proc文件系统。 ◆ 建立一些目录,显示欢迎信息,启动MDB调 试服务程序。