310 likes | 514 Views
Linux 文件系统. 广州嵌入式软件公共技术支持中心 梁老师 200 7 年 7 月. Unix 风格的文件系统. Unix 风格是指 Unix 文件系统传统上使用了四种和文件系统相关的抽象概念: 文件 — — 在 Unix 中的文件都被看做是一有序字节串,它们都有一个方便用户或系统识别的名称。 目录项 —— 不要和目录概念搞混淆,在 Linux 中目录被看作文件。而目录项是文件路径中的一部分。 索引节点 ——Unix 系统将文件的相关信息(如访问控制权限、大小、拥有者、创建时间等等信息),存储在一个单独的数据结构中,该结构被称为 索引节点 (inode) 。
E N D
Linux文件系统 广州嵌入式软件公共技术支持中心 梁老师 2007年7月
Unix风格的文件系统 • Unix风格是指Unix文件系统传统上使用了四种和文件系统相关的抽象概念: • 文件——在Unix中的文件都被看做是一有序字节串,它们都有一个方便用户或系统识别的名称。 • 目录项——不要和目录概念搞混淆,在Linux中目录被看作文件。而目录项是文件路径中的一部分。 • 索引节点——Unix系统将文件的相关信息(如访问控制权限、大小、拥有者、创建时间等等信息),存储在一个单独的数据结构中,该结构被称为索引节点(inode)。 • 安装点——在Unix中,文件系统被安装在一个特定的安装点上,所有的已安装文件系统都作为根文件系统树中的叶子出现在系统中。
文件系统 • LINUX操作系统支持多个不同的文件系统:ext,ext2,minix,umsdos,ncp,iso9660,hpfs,msdos,xia,fat,vfat,proc,nfs,smb,sysv,affs以及ufs。每一种文件系统都有自己的组织结构和文件操作函数,相互之间差别很大。LINUX对上述文件系统的支持是通过虚拟文件系统VFS的引入而实现的
虚拟文件系统 • VFS是物理文件系统与服务之间的一个接口层,它对LINUX的每个文件系统的所有细节进行抽象,使得不同的文件系统在LINUX核心以及系统中运行的其他进程看来,都是相同的。严格说来,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS在系统启动时建立,在系统关闭时消亡。
VFS的功能 • 记录可用的文件系统的类型; • 将设备同对应的文件系统联系起来; • 处理一些面向文件的通用操作; • 涉及到针对文件系统的操作时,VFS把他们映射到与控制文件、目录、以及inode相关的物理文件系统。
虚拟文件系统VFS • VFS:虚拟文件系统转换 • 一个内核软件层,处理文件系统相关的系统调用,为各种文件系统转换出一个通用的接口。 • 思想:VFS使用通用的文件模型,这个模型对使用者提出一套统一的操作接口,对下面的各种具体物理文件系统,则由相应的文件子系统将其物理组织结构转换为虚拟文件系统的通用模型。
通用文件模型 • 面向对象的思想 • 数据结构+操作函数指针 • 每个目录都被看作普通文件,可以包含文件和子目录。 • 每个主要对象中都包含一个操作对象,这些操作对象描述了内核针对主要对象可以使用的方法。 • 每个打开的文件,都有一个FILE数据结构(对象)对应,其中有一个f_op字段,包含一系列专门针对该文件所在文件系统的操作函数指针。 • 文件操作的系统调用—VFS的统一接口调用—相应文件子系统提供的相应函数指针 • File->f_op->read()
通用文件模型的构成 • 超级块对象super block 描述特定的已安装文件系统信息。对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块。 • 索引节点对象inode • 描述具体文件信息。对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件控制块。 • 文件对象file • 存放打开文件与进程之间进行交互的有关信息。 • 目录项对象dentry • 存放目录项与对应文件链接的信息。
通用文件模型的构成 • 每个主要对象中都包含一个操作对象,操作对象描述了内核针对主要对象可以使用的方法。 • super_operations对象 包括针对特定文件系统所能调用的方法,比如read_inode()和sync_fs()方法等。 • inode_operations对象 包括针对特定文件所能调用的方法,比如create()和link()方法等。 • dentry_operations对象 包括对特定目录所能调用的方法,比如d_compare()和d_delete()方法等。 • file_operations对象 包括进程针对已打开文件所能调用的方法,比如read()和write()方法等。
VFS的运作 • 当某个进程调用一个面向文件的系统调用时,核心将调用VFS中相应的函数,这个函数处理一些与物理结构无关的操作,并且把它重定向为真实文件系统中相应的函数调用,而这些函数调用则用来处理那些与物理结构相关的操作。
VFS的源代码 • VFS的源代码集中在/usr/src/linux/fs目录下,关于它的数据结构的描述是在文件/usr/src/linux/include/linux/fs.h中。
super_block结构 • VFS使用superblock描述特定文件系统。 • 在系统启动后,所有被初始化的文件系统(file_system_type)都要向VFS(file_systems)登记。每种文件系统类型的读超级块子例程(read_super)必须识别该文件系统的结构并且将其信息映射到一个VFS的超级块数据结构上。 • 所有超级块对象(每个安装的文件系统都有一个)都以循环双向链表的形式链接在一起。
super_block • 为了文件系统的性能,设备上的超级块(或FAT表等索引信息)必须驻留内存空间。VFS的super_block数据结构即提供了这样的内存空间。 • 其中,聚合类型成员super_block.u是实现的关键。例如,ext2类型的文件系统一旦安装,磁盘上的超级块信息即会复制到一个ext2_sb_info结构,super_block.u.ext2_sb将指向该结构。
super_block • 与超级块关联的方法就是所谓的超级块操作superblock operation。这些操作是由数据结构super,operations来描述的,该结构的起始地址存放在超级块的s_op域中。 • 每个具体的文件系统都可以定义自己的超级块操作。当VFS需要调用其中某一操作时,将调用s_op域所指向的操作。例如read_inode。 sb一>s-op一>read_inode(inode);
VFS的inode结构 • 索引节点对象包含了内核在操作文件时所需要的全部信息。 • 仅在文件被访问的时候,在内存中创建。 • 一个索引节点代表文件系统中的一个文件。
VFS的inode结构 • VFS的inode同VFS的super_block一样,是物理设备上文件或目录在内存中的统一封装。其中,聚合类型成员inode.u是实现的关键。例如,对于ext2类型的文件系统,其磁盘上的inode信息ext2_inode复制到内存中就是一个ext2_inode_info结构,inode.u.ext2_i将指向该结构。
File对象 • 文件对象描述的是进程怎样与一个打开文件交互的过程。 • 文件对象是在文件被打开时创建的。 • 存放在文件对象中的上要信息是文件指针,即文件巾当前操作的位置。
VFS的目录项对象 • 目录项对象描述树状路径结构中的某一个节点。通过这套对象,可以让内核根据一个具体的路径,轻松的找到相应的索引节点对象。 • 在查找路径名/tmp/test时,内核为根目录/ 创建一个目录项对象,为根目录下的tmp项创建一个第二级目录项对象,为tmp目录下的test项创建一个第三级目录项对象。
VFS的目录项对象 • 和前面的超级块以及索引节点对象不一样,目录项对象,并没有磁盘上对应的存在。这些对象,是VFS根据磁盘上的目录文件的内容,在内存中临时生成的。 • 系统使用目录项高速缓存,存放目录项对象。
文件读写 • 用户空间通过read/write系统调用进入内核执行文件操作,sys_read( ) 和sys_write( )几乎执行相同的步骤: • 调用fget( )从fd获取相应文件对象file,并把引用计数器file->f_count减1。 • 检查file->f_mode中的标志是否允许请求访问(读或写操作)。 • 调用locks_verify_area( )检查对要访问的文件部分是否有强制锁。 • 调用file->f_op->read 或file->f_op->write来传送数据。两个函数都返回实际传送的字节数。 • 调用fput( )以减少引用计数器file->f_count的值 • 返回实际传送的字节数。
EXT2文件系统 • EXT2是LINUX中的一个可扩展的强有力的文件系统。通过VFS的超级块(struct ext2_sb_info ext2_sb)可以访问EXT2的超级块,通过VFS的inode(struct ext2_inode_info ext2_i)可以访问EXT2的inode。
EXT2文件系统 • 在EXT2中,文件也是由逻辑块的序列组成。所有的数据块的长度相同,但是对于不同的EXT2文件系统,其长度可以变化。当然,对于给定的EXT2文件系统,其块的大小在创建时就会固定下来。所有文件的大小都用整数块来表示。
EXT2文件系统 • EXT2文件系统中的每个文件都用一个单独的inode(即struct ext2_inode结构)来描述,而每个inode都有一个唯一的标志号。EXT2通过使用inode对系统中的每个文件的描述来定义文件系统的结构。EXT2文件系统将它所占用的逻辑分区划分成块组(block group)。
EXT2文件系统 • 每个块组中保存着关于文件系统的备份信息(超级块和所有组描述符)。当某个组的超级块或inode受损时,这些信息可以用来恢复文件系统。 • 组描述符中块位图(block bitmap)记录本组内各个数据块的使用情况,其中每一位(bit)对应于一个数据块,0表示空闲,非0表示已分配。inode位图(inode bitmap)的作用类似于块位图,它记录inode表中inode的使用情况。inode表(inode table)保存了本组所有的inode。数据块(data blocks)则是真正的文件数据区。
谢谢 我们一起努力共创美好未来!