




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINUX原理及应用武汉大学计算机学院李文海
第六章文件系统在计算机中,大量的数据和信息是通过文件存储和管理的。文件系统负责管理文件和逻辑文件系统,提供管理设备、屏蔽设备复杂性的手段,为系统内核其他部分、用户命令和系统函数调用提供统一的服务接口。本章主要讨论Linux系统中文件的概念目录结构及访问权限Linux的逻辑文件系统Ext2/3虚拟文件系统VFS文件系统管理及缓冲区管理等内容。6.1文件系统概述操作系统中,用户直接可见、经常接触的就是文件系统。通常我们把与管理文件有关的软件和数据,统称为文件系统。方便地组织计算机中的所有文件,为用户提供文件的操作手段和存取控制。同时文件系统隐藏了系统中最为纷繁复杂的硬件设备特征,为用户以及操作系统的其他子系统提供一个统一简洁的接口,通过文件系统使得用户方便地使用存储、输入/输出等设备。6.1文件系统概述文件系统是操作系统中与管理文件有关的所有软件和数据的集合。CPU和内存之外的所有其他设备都抽象为文件来处理进程只和文件系统打交道,哪个硬件设备、如何提供服务等都被文件系统屏蔽掉了具体细节,由设备管理部分具体实现并为文件系统提供尽可能简洁统一的接口。文件系统充当着设备管理接口的角色,用户进程使用和操作具体的设备,都必须经过文件系统进行。6.1文件系统概述支持不同类型的文件系统是Linux操作系统的主要特色之一。Linux系统自身的文件系统称为Ext2/3,它是Linux默认的文件系统。我们把Ext2/3以及Linux支持的文件系统称为逻辑文件系统通常每种逻辑文件系统服务于一种特定的操作系统,具有不同的组织结构和文件操作函数,相互之间差别很大。Linux在传统的逻辑文件系统的基础上,增加了一个称为虚拟文件系统(VFS)的接口层。Linux文件系统层次结构示意图虚拟文件系统在最上层,管理各种逻辑文件系统,屏蔽它们之间的差异,为其他部分提供访问文件和设备的统一接口。虚拟文件系统(VFS)逻辑文件系统Buffercache网络协议字符设备块设备网络设备Linux支持的多种文件系统Linux的重要特点之一是支持多种文件系统,这使它可以和许多其他操作系统共存,而且随着时间流逝,它会支持更多的文件系统。Linux可支持的文件系统:Ext、ext2、ext3
:Linux的默认文件系统minix、xia:Minux文件系统及其修正版msdos、umsdos:前者是DOS、Windows操作系统上使用一种文件系统;后者是Linux下的扩展MSDOS文件系统驱动,允许一个普通的MSDOS文件系统用于Linux,而且无须为它建立单独的分区。vfat:是Windows9x和WindowsNT/2000下的DOS系统。Linux支持的多种文件系统ntfs:WindowsNT/2000支持的文件系统。proc:是Linux的一个伪文件系统,可以获取进程的信息。smb:是一组通讯协议,能让运行在OS/2及WindowsNT等的计算机实现文件共享和打印机共享服务.ncp:一种NovellNetWare使用的协议,它可以利用IPX协议让两台电脑之间的文件共享。iso9660:标准CDROM文件系统sysv:SystemV在Linux平台上的文件系统hpfs:是微软的LANManager的文件系统affs
:用于Amiga机器的AmigaOS操作系统上ufs:BSD的文件系统6.1文件系统概述在Linux中,象Unix一样,系统可以使用的不同的文件系统不是通过设备标识符(例如驱动器编号或设备名称)访问,而是连接成一个单一的树型的结构,用一个统一的单个实体表示文件系统。Linux在挂载文件系统的时候把它加到这个单一的文件系统树上。所有的文件系统,不管什么类型,都挂载到一个目录下,挂载的文件系统的文件掩盖了这个目录原来存在的内容。这个目录叫做挂载目录或挂载点。当这个文件系统卸载的时候,挂载目录自己的文件又可以显现出来。6.1文件系统概述当磁盘初始化的时候(比如用fdisk),把物理磁盘分成一组逻辑分区。一个分区可以放一个文件系统,例如一个EXT2文件系统。文件系统在物理设备的块上通过目录、软链接等把文件组织成逻辑的树型结构。可以包括文件系统的设备是块设备。系统中第一个IDE磁盘的第一个分区(/dev/hda1),是一个块设备。Linux文件系统把这些块设备看成简单的线性的块的组合,不知道也不去关心底层的物理磁盘的尺寸。每一个块设备驱动程序把对设备的特定的块的读写请求映射到对于设备有意义的术语:这个块在硬盘上的磁道、扇区和柱面。6.1文件系统概述一个文件系统不管它保存在什么设备上,都应该用同样的方式工作,有同样的观感。另外,使用Linux的文件系统,是否这些不同的文件系统在不同的硬件控制器的控制下的不同的物理介质上都是无关紧要的(至少对于系统用户是这样)。文件系统甚至可能不在本地系统上,它可能是通过网络连接远程挂载的。6.1文件系统概述文件系统中的文件包含了数据的集合:含文件系统内容的文件是一个ASCII文件
filesystems.tex。一个文件系统不仅保存它包括的文件的数据,也保存文件系统的结构。它保存了Linux用户和进程看到的所有的信息,例如文件、目录、软链接、文件保护信息等等。另外,它必须安全地保存这些信息,操作系统的基本的一致性依赖于它的文件系统。结合后边的超级块和组描述符进一步理解!6.1文件系统概述Minix是Linux的第一个文件系统,有相当的局限,性能较差。它的文件名不能长于14个字符(这仍然比8.3文件名要好)最大的文件大小是64M字节。即使中等的数据库文件也比它大。第一个专为Linux设计的文件系统扩展文件系统或EXT(ExtendFileSystem)在1992年4月引入,解决了许多问题,但是仍然感到性能低。1993年,增加了扩展文件系统第二版,或EXT2从RedHatLinux7.2
发行版本开始,默认的文件系统已从ext2转换成ext3。6.1文件系统概述当EXT文件系统增加到Linux的时候进行了一个重要的开发。真实的文件系统通过一个接口层从操作系统和系统服务中分离出来,这个接口叫做虚拟文件系统(VFS)。VFS允许Linux支持许多(通常是不同的)文件系统,每一个都向VFS表现一个通用的软件接口。Linux文件系统的所有细节都通过软件进行转换所以所有的文件系统对于Linux核心的其余部分和系统中运行的程序显得一样虚拟文件系统层允许同时透明地挂载许多不同的文件系统。6.2文件管理6.2.1文件文件可简单地理解为一段程序或数据的集合。在操作系统中文件被定义为一个命名的相关字符流的集合,或者一个具有符号名的相关记录的集合。Linux系统中,文件名的最大长度由NR_NAME_LEN控制,默认值是255个字符。Linux系统中,文件的类型包括:普通文件:主要是流式文件目录文件:用于标识和管理系统中的全部文件连接文件:用于不同目录下文件的共享管道文件:提供进程通信的一种方式设备文件:块设备和字符设备套接字:和网络通信有关。6.2.2文件结构同样的文件,呈现在系统使用者和系统设计者面前是不同形态。系统使用者关心如何方便地组织和使用文件,即文件的逻辑结构,而系统的设计者则关心文件具体的实现方式,即文件的物理结构。1文件的逻辑结构是用户可见的结构,可分为两大类:字符流式无结构文件记录式有结构文件。从逻辑结构来看Linux系统的文件采的是字符流式无结构文件Linux系统同时支持顺序和随机两种访问方式对文件的操作只能通过操作系统提供的命令接口或函数调用接口常用操作包括:建立、删除、重命名、开/关、读、写和追加等。6.2.2文件结构2文件的物理结构物理结构是文件在存储设备上的组织方式,通常解决文件逻辑块与物理块之间的映射关系,即文件对应的物理块的具体组织方式。物理文件结构有顺序、串联、索引和多重索引等。(1)顺序方式按照逻辑上的连续关系把文件依次存放在连续的物理块中。(2)串联方式采用链表方式实现。(3)索引方式为每个文件建立一张索引表,表中存放文件的逻辑块和物理块之间的对应关系。注:Linux系统文件的物理结构采用的就是多重索引方式Linux文件的物理结构示意图文件说明信息
……
…
………一次间接块三次间接块二次间接块数据块
…
…
…直接块一次间接二次间接三次间接6.2.3Linux文件Linux默认的逻辑文件系统是Ext2,采用i节点描述文件属性。根据i节点所存放位置,可以分为:磁盘i节点:静态存放在外存,使用ext2_inode描述。内存i节点:内存i结点是为提高文件访问效率,在内存特定区域建立的磁盘i结点映像。使用ext2_inode_info描述。每个i节点包含两部分:文件说明信息索引表磁盘i结点文件说明信息文件名类型文件长度占用的物理块数创建及最近访问时间连接数拥有者用户名用户组名存取控制表索引表结构每个i结点的索引表共有15个项前12个项是直接块后3项分别是一次间接、二次间接和三次间接ext2文件系统物理块的大小可以是1024、2048或4096字节,在初始化文件系统的时由用户指定,默认值是1KB,块地址占4字节,因此每个物理块可放256个块地址,这样,如果把一个i结点所有的物理块放满,得到的最大文件应该是:12KB+256KB+64MB+16G。实际上,在32位的PC上的Linux系统中,寻址范围32位,文件最大只能达到4GB。结合三次间址计算ext2_inodestruct
ext2_inode{
u16
i_mode;
/*文件模式,给出了文件的类型*/
u16
i_uid;
/*文件主用户标识符*/
u_32
i_size;
/*文件大小*/
u_32
i_atime
/*最近访问文件时间*/
u_32
i_stime;
/*文件创建时间*/
u_32
i_mtime;
/*文件最近修改时间*/
u_32
i_dtime;
/*文件删除时间*/
u16
i_links_count;/*文件连接计数记录多少个目录指向这个I节点*/
u16
i_gid;
/*文件主的用户组标识符*/
u32
i_blocks;
/*文件的总块数*/
u32
i_flag;
/*文件标志*/
u32
i_blocd[EXT2_N_BLOCKS];
/*文件地址块索引表*/
u32
i_file_acl;
/*文件访问控制表*/
u32
i_dir_acl;
/*目录访问控制表*/
…
}ext2_inode_infostructext2_inode_info{
__u32i_data[15];__u32i_flags;__u32i_faddr;__u8i_frag_no;__u8i_frag_size;__u16i_osync;__u32i_file_acl;__u32i_dir_acl;__u32i_dtime;__u32i_version;__u32i_block_group;__u32i_next_alloc_block;__u32i_next_alloc_goal;__u32i_prealloc_block;__u32i_prealloc_count;inti_new_inode:1;/*Isafreshlyallocatedinode*/};6.3目录包括Linux在内的很多操作系统中,目录本身也是一种文件,称为目录文件。6.3.1目录结构在树型的多级目录系统中,文件名由路径名给出。有绝对路径名和相对路径名。6.3.2访问权限文件共享:允许多个用户共同使用一个文件。实现文件共享的方法有绕道法和链接法。Linux中采用链接法。文件保护:保护文件的安全。文件存取权限:文件共享、保护都涉及到文件的访问权限,即文件读、写和执行的许可权。常用的访问权限控制方法有:口令方式:为文件设置口令,访问前检验密码方式:将文件加密,读出时解密存取控制矩阵:所有用户对所有文件的访问权存取控制表:特定文件的访问权限Linux的访问控制利用口令验证用户身份在Linux中,将用户分为三类:文件拥有者同组用户其他用户每类用户对文件有三种访问权限:读、写、执行,分别用r、w、x表示。6.3.3Linux目录分布Linux系统中采用的是树型多级目录结构。bin……bootdevetchomelibprocrootsbintmpusrvarls…cpfstab…passwddy…linux…fdisk…mountlog…runroot6.3.3Linux目录分布根目录下的默认子目录为:bin是实用程序子目录,存放大多数用户都可以用的常用系统工具。boot子目录,存放系统启动时必须的内核映像等文件。dev设备子目录,系统在这个子目录里为每个设备分配一个i结点。etc基本数据子目录,存放系统的用户口令、网络配置等设置文件。home用户数据子目录,默认情况下,每个用户登录后的工作目录都设在这个子目录下。6.3.3Linux目录分布lib系统函数库子目录,存放系统提供的动态和静态函数库。proc系统状态子目录,通过这个目录,可以动态地了解系统内核的运行情况。root系统管理员(超级用户)的用户目录。sbin系统管理实用程序子目录,专门提供给系统管理员使用的各种系统管理工具。tmp临时文件目录。usr用户软件子目录。var记载系统运行情况的日志子目录。6.3.4Linux目录文件Linux系统中目录也是文件的一种,称为目录文件,每个目录也由i结点来描述,i结点中文件类型标识这是一个目录文件,同时在对应的物理块中存放用来描述文件的目录项列表。目录项列表用来描述一个目录所包含的全部文件和子目录,每个目录项对应着一个文件或目录,具体的数据结构如下:6.3.4Linux目录文件Linux系统中目录构成的文件称为目录文件。目录文件中每个目录项的数据结构如下:structext2_dir_entry_2{_u32inode;/*inodenumber*/_u16rec_len;/*directoryentrylength*/_u8name_len;/*namelength*/_u8file_type;/*filetype*/charname[EXT2_NAME_LEN];/*filename*/};i1121.i2121.i32010.i4124.012244456文件名文件名长度目录项长度i节点号6.3.5特殊目录在默认目录中,最值得注意的是:dev设备子目录proc系统进程子目录/dev子目录系统中所有设备文件都存放在dev子目录下。每个设备文件也使用i节点来标识,设备文件i节点不指向文件系统中任何实际的物理块,通过i结点可以访问相应的设备驱动程序,对设备文件的操作就是直接对设备本身进行相应的操作。Linux有两种类型的设备文件:字符设备文件:对应字符设备块设备文件:对应块设备Linux的以太型网卡界面通常被称做eth0、eth1等等。环形卡亦同样地被看待,然而它们被称做tr0、tr1等等。可用ifconfig命令来观看及修改网络界面的状态。Linux的另一特点是网络界面并不会像其他设备一样地被看成是一个在/dev里头的文件。设备文件的文件名设备文件的文件名由设备名称及其从设备号描述。如硬盘的设备名为hda,其第一个分区的从设备名为1,则第一个分区的文件名是/dev/hda1。如使用命令ls–l/dev/hda*可以看到一个硬盘中可能包含的全部设备文件。brw-rw----1rootdisk3,0May61998hda其中各项依次为:访问权限、链接数、所有者名,组名、主设备号、从设备号、建立时间、设备名。/proc子目录/proc子目录下存放当前运行系统的动态资料。/proc目录及其所包含的文件属于proc逻辑文件系统,与其他文件系统不同的是,proc文件系统并不真正存在于块设备上该目录下的文件也没有存放在设备中在系统初始化过程中,proc文件系统注册并建立该目录下所有的i结点,而当访问到其中的目录或文件时,Linux虚拟文件系统才利用内核信息实时地建立这些文件和目录的内容。/proc子目录(续)proc目录几乎提供了全部系统运行的动态资料,包括CPU、内存、外设、中断等信息,内存和外设使用情况、系统中所有进程的工作情况等。系统中的每个进程都在proc下有一个子目录,进程号是该目录的名称。例如,要得到所有进程的列表:$ls-l/proctotal0dr-xr-xr-x4rootroot0Jan3120:371dr-xr-xr-x4liwusers0Jan3120:3763dr-xr-xr-x4liwusers0Jan3120:3794dr-xr-xr-x4liwusers0Jan3120:3795dr-xr-xr-x4rootusers0Jan3120:3798dr-xr-xr-x4liwusers0Jan3120:3799-r--r--r--1rootroot0Jan3120:37devices-r--r--r--1rootroot0Jan3120:37dma-r--r--r--1rootroot0Jan3120:37filesystems-r--r--r--1rootroot0Jan3120:37interrupts-r--------1rootroot8654848Jan3120:37kcore-r--r--r--1rootroot0Jan3111:50kmsg-r--r--r--1rootroot0Jan3120:37ksyms-r--r--r--1rootroot0Jan3111:51loadavg-r--r--r--1rootroot0Jan3120:37meminfo-r--r--r--1rootroot0Jan3120:37modulesdr-xr-xr-x2rootroot0Jan3120:37netdr-xr-xr-x4rootroot0Jan3120:37self-r--r--r--1rootroot0Jan3120:37stat-r--r--r--1rootroot0Jan3120:37uptime-r--r--r--1rootroot0Jan3120:37version$了解进程的当前情况使用命令ls–l/proc/1进程号可以了解进程的当前情况。例如:$ls-l/proc/1其中各项解释如下:total0-r--r--r--1rootroot0Nov223:25cmdline命令行参数lrwx------1rootroot0Nov223:25cwd->/当前工作目录-r--------1rootroot0Nov223:25environ环境变量值lrwx------1rootroot0Nov223:25exe->/sbin/init指向该进程对应的执行程序dr-x------2rootroot0Nov223:25fd 指向包含所有已打开文件描述符的目录pr--r--r--1rootroot0Nov223:25maps内存映象,描述了内存虚地址空间-rw-------1rootroot0Nov223:25mem进程的内存使用情况lrwx------1rootroot0Nov223:25root->/链接此进程的root目录-r--r--r--1rootroot0Nov223:25stat进程状态-r--r--r--1rootroot0Nov223:25statm进程内存状态信息-r--r--r--1rootroot0Nov223:25status 进程当前状态,以可读的方式显示出来6.4逻辑文件系统——Ext2在Linux文件系统中,逻辑文件系统屏蔽了具体的设计细节,向虚拟文件系统提供服务,它真正存在于物理设备中。Linux系统可以支持几十种不同的逻辑文件系统,如DOS的MSDOS。Linux本身默认的文件系统是Ext2/3。6.4.1Ext2文件系统Ext2文件系统的历史:Linux最初从MINIX发展起来,最早使用MINIX的文件系统。但MINIX文件系统功能不完备,性能欠佳,如文件系统最大容量不超过64MB每个目录的目录项固定最长文件名不能超过14个字符为推广Linux迫切需要改进文件系统。首先向Linux内核加入了虚拟文件系统接口,92年专门为Linux设计了Ext(ExtendedFileSystem)。它由MINIX改进而来,其文件系统容量增大,文件名更长,但碎片和效率问题严重。93年在自由软件工作者的努力下,推出了新的Ext2。6.4.1Ext2文件系统——文件系统布局一个Linux系统可以支持多个物理磁盘设备,每个物理磁盘又可以定义多个分区,每个分区是存放逻辑文件系统的最小单位。在Linux系统中,不同分区可以安装不同逻辑文件系统,通过虚拟文件系统的使用让用户看到一致的接口。每个逻辑文件系统按不同规则,把硬盘分区定义为一组逻辑块序列。一般包括:引导块:一般在分区头部,占一个扇区存放引导程序。超级块:记录文件系统的基本管理信息i节点区:存放文件系统的所有i节点数据区:存放文件内容6.4.1Ext2文件系统
——Ext2文件系统的布局Ext2文件系统将磁盘分区分为:引导区块组:由超级块、组描述符、块位图、i节点位图、i节点区和数据区。每个块组中的超级块和组描述符相同。系统启动时只用第一块组中的超级块和组描述符,其他块组中的相应信息为为冗余备份。当系统故障时使用其它块组中的这些数据恢复。6.4.1Ext2文件系统EXT2文件系统的物理分布图6.4.2基本数据结构超级块(superblock)和组描述符(groupdescriptor)是Ext2文件系统的两个重要的数据结构。EXT2的超级块用来描述目录和文件在物理设备上的分布情况,每个文件系统具有自己的超级块。组描述符描述文件系统块组分布和使用情况。6.4.2基本数据结构——EXT2超级块根据超级块所存放的位置,超级块也可分为:磁盘超级块:数据结构ext2_super_block
内存超级块:数据结构ext2_sb_info,内存超级块在系统启动时由磁盘超级块初始化形成,除了包含磁盘超级块中的信息外,还增加了描述文件系统当前状态的动态信息和指向文件系统缓冲区的指针。6.4.2基本数据结构
——EXT2超级块包含的字段MagicNumber(魔数):允许安装软件检查这是否是一个EXT2文件系统的超级块。对于当前版本的EXT2是0xEF53。版本号:文件系统的主、次版本号。安装计数和最大安装数:用来决定是否应该对文件系统进行全面检查。块组号:存放这个超级块拷贝的块组编号。块大小:一般为1024、2048或4096字节。每组块数:块组中数据块的个数。空闲块:文件系统中空闲块个数。空闲索引节点:文件系统中空闲索引节点数。第1个索引节点:文件系统中的1个索引节点的索引节点号。批处理思想6.4.2基本数据结构
——EXT2组描述符每个块组都由一个组描述符来具体描述,其数据结构为ext2_group_desc,主要记录了:BlocksBitmap
这个块组的块分配位图的块编号,用在块的分配和回收过程中InodeBitmap
这个块组的inode位图的块编号。用在inode的分配和回收过程中。InodeTable
这个块组的inodetable的起始块的块编号。整个文件系统的所有块组描述符集中在一起形成组描述符表。这张表在每个块组中都保存一个相同的副本。TheEXT2Inode(EXT2I节点)EXT2InodeTheEXT2Inode(EXT2I节点)在EXT2文件系统中,每一个文件和目录都用一个且只用一个inode描述。每一个块组的EXT2的inode都放在inode表中,还有一个位图,让系统跟踪分配和未分配的I节点。前图显示了一个EXT2inode的格式,在其他信息中,它包括一些域:mode包括两组信息:这个inode描述了文件类型和用户对于它的权限。对于EXT2,一个inode可以描述一个文件、目录、符号链接、块设备、字符设备或FIFO。TheEXT2Inode(EXT2I节点)
OwnerInformation
这个文件或目录的数据的用户和组标识符。这允许文件系统正确地进行文件访问权限控制。
Size文件的大小(字节)。
Timestamps
这个inode创建的时间和它上次被修改的时间。Datablocks指向这个inode描述的数据的块的指针。最初的12个是指向这个inode描述的数据的物理块,最后的3个指针包括更多级的间接的数据块。例如,两级的间接块指针指向一个指向数据块的块指针的块指针。这意味着小于或等于12数据块大小的文件比更大的文件的访问更快。参见include/linux/ext2_fs_i.hTheEXT2Inode(EXT2I节点)应该注意EXT2inode可以描述特殊设备文件。这些不是真正的文件,程序可以用于访问设备。/dev下所有的设备文件都是为了允许程序访问Linux的设备。例如mount程序用它希望安装的设备文件作为参数。6.4.3存储空间管理文件系统的主要目标除了实现文件的有效管理和使用,同时还要保证存储器资源的有效利用。Linux本身默认的EXT2文件系统采用分块的组织方式,利用多重索引的物理文件结构来实现外部存储空间的管理。1块的大小EXT2逻辑文件系统中,块大小可以在一定范围内调整,但格式化后磁盘分区生成文件系统时必须指定块的大小,每一个实际存在的Ext2文件系统的块的大小都是固定的,块的大小对文件系统性能和存储空间利用率有相当大的影响。EXT2文件系统块大小的可选范围是1KB~4KB。系统软件块物理大小的共性6.4.3存储空间管理2空闲空间的管理系统对所有使用和未使用的存储空间,在Ext2文件系统中包括i结点和物理块,都需要做精确的记录,这是内存进一步分配和回收的依据。块的使用情况,具体记录在每一个文件的i结点中,而i结点的使用情况,记录在目录项中,这些都可以通过文件系统实现快速搜索和管理。两种常用方法是空闲链表和位图。Ext2文件系统的空闲空间管理采用位图方式,在每一个块组中,都划分了特定的位图区来记录块和i结点的使用情况,分别称为块位图和i结点位图。Ext2文件系统采用两个高速缓冲区来分别管理这两种位图,以提高时间效率。6.4.3存储空间管理3分配策略i结点和块的分配策略在一定程度上决定着文件系统的效率。Ext2文件系统采用块组的概念,尽可能把同一个文件所使用的块、同一个目录所使用的i结点存放在相邻的单元中,至少是在同一个块组内,减少磁盘访问过程中的寻道时间具体对于一个新分配的i结点,新目录尽可能保证它和父目录分配在同一个组当中,新文件也要尽可能保证和目录同组同时,尽可能保证所有结点平均分配到所有的块组中。6.4.3存储空间管理Ext2文件系统采用称为预分配的机制来保证文件内容扩展时块的分配效率和效果。在文件建立时,如果有足够的空闲块,就在相邻的位置为文件分配多于当前使用的块,多余的块称为预分配块当文件内容扩展时,优先使用预分配块,可以提高分配效率,同时也可以保证这些块具有连续关系。如果预分配的块用完或根本没有启动预分配机制,分配新块时也要尽可能保证与原块相邻,至少时处于同一块组或相邻块组中。在申请分配i结点和空闲块的过程中,都需要改写文件系统的超级块,超级块属于临界资源。6.5虚拟文件系统——VFSLinux虚拟文件系统位于Linux整个文件系统的最上层提供文件系统对命令、系统调用及内核其它模块的统一接口它负责管理并控制下层的逻辑文件系统,使它们按照各自特定的模式正常运转,同时对用户提供尽可能相同的表现形式。虚拟文件系统只存在于内存中,并没有存储在磁盘分区中磁盘分区存放的是逻辑文件系统的内容所有虚拟文件系统的数据结构均在系统启动后才建立完成在系统关闭时撤消。它必须与其它实际存在于磁盘的文件系统一起,才能构成一个完整的文件系统。6.5虚拟文件系统——VFS虚拟文件系统对逻辑文件系统进行抽象采用统一的数据结构在内存中描述所有这些文件系统接受用户层的系统调用和核心层其他模块的访问通过VFS函数操作,按照一定的映射关系,把这些访问重新定向到逻辑文件系统中相应的函数调用由逻辑文件系统完成真正的具体操作VFS只负责设备无关的操作,主要是进行具体操作的映射关系正是VFS的这种抽象功能层次,保证了Linux系统可以支持多种不同的逻辑文件系统所有文件系统都具有基本相同的外部表现,而且可以方便地进行相互访问。6.5虚拟文件系统——VFS针对下层的逻辑文件系统Linux系统中的VFS为它们提供一致接口统一管理各逻辑文件系统,包括文件系统的注册、安装和卸载等提供限额机制,负责对用户使用存储空间的数量进行有效控制把文件操作进行适当的转换,转交由具体逻辑文件系统进行处理把具体的操作结果提供给上层的调用者针对上层VFS对用户函数调用和内核其它模块的访问提供接口接受访问并返回由具体逻辑文件系统完成的结果此外,VFS还负责管理文件系统的各种缓冲区,保证文件系统的整体效率。虚拟文件系统的示意图VFS系统空间系统调用界面索引节点缓存FAText2Minix…目录缓存缓冲区缓存磁盘驱动器用户程序(进程)文件系统操作用户空间6.5.1基本数据结构VFS采用超级块和i结点来描述文件系统,这些基本的数据结构在文件系统初始化的过程中,由具体逻辑文件系统的超级块和i结点的数据来填充,而当文件系统关闭时,VFS的超级块和i结点也就消失了。1VFS超级块初始化完成之后,对于每一个可以访问的逻辑文件系统,都对应于一个VFS超级块,这些数据驻留在系统内存。VFS超级块使用数据结构super_block来描述。见下图。6.5.1基本数据结构——VFS超级块Ext2超级块与VFS超级块设备名称Ext2内存超级块Ext2磁盘超级块文件系统类型s_covereds_mounted初始化i节点数量块长VFS超级块6.5.1基本数据结构——VFS超级块VFS超级块包括:Device这是包含文件系统的块设备的设备标识符。例如,/dev/hda1,系统中的第一个IDE磁盘,设备标识符是0x301。Inodepointers
其中的mountedinode指针指向该文件系统的第一个inode。coveredinode指针指向文件系统安装到的目录的inode。对于root文件系统,它的VFS超级块中没有covered指针。Blocksize文件系统块的字节大小,例如1024字节。Superblockoperations
指向一组本文件系统超级块例程的指针。除其他类型外,VFS用这些例程读写inode和超级块。FileSystemtype
指向这个安装的文件系统的file_system_type数据结构的一个指针。FileSystemSpecific
指向文件系统所需信息的一个指针。6.5.1基本数据结构——VFSi结点2VFSi结点VFSi结点用来描述虚拟文件系统中的文件和目录。VFSi结点只存在于内存中,是所有逻辑文件系统i结点的抽象描述和具体逻辑文件系统的i结点一一对应根据文件系统的i结点信息建立。象EXT2文件系统,VFS中每一个文件、目录等等都用一个且只用一个VFSinode代表。每一个VFSinode中的信息使用文件系统相关的例程从底层的文件系统中获取。VFSinode只在核心的内存中存在,只要对系统有用,就一直保存在VFSinodecache中。除了其它信息,VFSinode包括一些域:此外,还有dentry6.5.1基本数据结构——VFSi结点device存放这个文件(或这个VFSinode代表的其它实体)的设备的设备标识符。
Inodenumber这个inode的编号,在这个文件系统中唯一。Device和inodenumber的组合在整个虚拟文件系统中是唯一的。Mode象EXT2一样,这个域描述这个VFSinode代表的东西和对它的访问权限。Userids属主标识符。Times创建、修改和写的时间。Blocksize这个文件的块的字节大小,例如1024字节。Inodeoperations指向一组例程地址的指针。这些例程和文件系统相关,执行对于这个inode的操作,例如truncate这个inode代表的文件。面向文件层面6.5.1基本数据结构——VFSi结点Count系统组件当前使用这个VFSinode的数目。Count0意味着这个inode是空闲,可以废弃或者重用。Lock这个域用于锁定这个VFSinode。例如当从文件系统读取它的时候。Dirty显示这个VFSinode是否被写过,如果这样,底层的文件系统需要更新。
Filesystemspecificinformation。6.5.1基本数据结构在用户或内核看来,对目录和文件的操作是对VFSi结点进行的。实际上,VFSi结点根据逻辑文件系统的类型,利用存放在其中的结点操作函数指针,对操作函数进行相应的映射,得到具体逻辑文件系统i结点操作函数,对具体的i结点进行操作,把结果返回给使用者。6.5.2文件系统管理Linux系统利用虚拟文件系统VFS实现对多种文件系统的支持,虚拟文件系统负责管理具体的逻辑文件系统,同时也可以提供用户存储空间限额管理。1逻辑文件系统管理某种类型的逻辑文件系统要得到Linux操作系统的支持,首先必须向核心注册。可以采用两种方式:一种是在内核编译过程中确定要支持的文件系统类型,并在系统初始化过程中使用特定的函数调用注册一种是在系统启动完成之后,把某种逻辑文件系统类型作为一个内核模块加入到内核中,加入模块时完成注册。文件系统类型注册表文件系统类型注册表:每一个注册过的文件系统类型都初始化为一个称为file_system_type的数据结构,所有这些数据结构组成一个单向链表,称为文件系统类型注册表。对于某一种文件系统类型,可以管理多个磁盘分区,也就是说由多个该类型的文件系统,但是它只占用类型注册表中的一个结点。当某一种类型的文件系统都不再使用时,可以使用卸载模块的方法来注销文件系统类型。文件系统类型注册表文件系统类型的注册和注销反映在以file_systems为链头,file_system_type为节点的单向链表中。nextnextnext=0file_systemsfile_system_type文件系统类型注册表structfile_system_type{
constchar*name;
/*name:
文件系统类型名*/
intfs_flags;/*fs_flags:
几种文件系统flag标志*/
structsuper_block*(*read_super)(structsuper_block*,void*,int);
structmodule*owner; /*owner:
VFS内部使用,大多数情况下,应该被初始化为THIS_MODULE*/
structfile_system_type*next;/*next:
VFS内部使用,初始化为NULL*/
structlist_headfs_supers;};文件系统的注册对于一个文件系统,在使用前必须向内核注册和安装该文件系统,而卸载一个文件系统时,还需向内核申请注销该文件系统。文件系统注册表由系统中所有注册的文件系统组成。也采用单向链表来描述,结点类型为vfsmount,记录着对应文件系统的设备号、安装目录名称、超级块以及存储空间限额管理数据。文件系统的注册实现设备与文件系统的关联文件系统注册表、超级块和文件类型注册表之间的关系设备名称文件系统注册表VFS超级块超级块s_covereds_mounted设备名称文件系统类型设备名称超级块…文件系统类型文件系统类型注册表…文件系统类型即设备、关联、文件系统6.5.2文件系统管理2存储空间限额管理有效控制系统中每一个用户最多可以使用的存储空间,保证所有用户都有可用的空间资源。限额管理可分为:软限额:用户使用资源超过限额范围之后,系统开始启动定时机制,在一定时间内,只是发出警告,并不强迫用户终止运行的进程,如果在规定的时间内没有采取措施缩减空间,软限额变成硬限额。硬限额:硬限额指定的存储空间范围绝对不可以超过。(终止用户进程)6.5.3VFS和进程接口进程中包括两个关于文件方面的数据:记录文件系统信息:指向fs_struct结构的指针,主要数据是文件系统根目录和当前目录所对应的i结点号,指向系统打开文件表。进程打开文件信息:指向file_struct结构的指针,包含用户打开文件表,是该进程对全部已打开文件进行具体访问的接口。进程与文件系统数据结构的关系文件系统信息进程PCBfs_struct*fsdentry*root打开文件信息打开模式files_struct*filesdentry*pwdfile*fd[0]file*fd[255]intcount指针位置i节点打开模式指针位置i节点file*fd[1]系统打开文件表VFSi节点缓冲区6.5.3VFS和进程接口
——用户打开文件表用户打开文件表:使用file_struct结构描述用户进程已打开的所有文件,其中有一个用户文件描述符数组,大小为256,数组的每个元素fd[i]指向一个file结构,数组元素的下标称为文件描述符,供用户操作文件时使用。每个进程建立时,用户打开文件表中都有默认的三个打开文件,描述符为0,1,2,分别对应于系统标准输入、系统标准输出和系统标准错误输出设备。每当用户进程打开一个新文件,系统就在fd数组中选定其中第一个空闲的元素来指向对应的file结构,代表特定的文件。6.5.3VFS和进程接口——系统打开文件表系统打开文件表:描述系统已经打开的文件,每一个打开文件使用一个file结构描述,包括:文件打开方式:指可以对文件进行操作的方式,包括只读、只写或者读写等类型,可以在打开文件的时候指定;读写位置指针:读写位置指针指出各进程在同一文件中的读写位置文件访问计数:记录共享该文件的数目文件VFSi节点指针和文件操作指针:分别指向该文件对应的VFSi节点和该文件操作函数的位置前后向指针:指向系统打开文件表的双向链表,链表的头是一个空的file结构,称为first_file。用户打开文件表中的每一个有效元素都指向系统打开文件表中相应的结点。6.5.3VFS和进程接口
——文件访问的实现进程通过PCB得到文件系统信息和指向用户打开文件表的指针;由用户打开文件表的相应项得到指向系统文件表指针;再由系统文件表获得该文件当前打开方式、读写指针、指向文件对应的i节点及操作函数的指针;有了这些信息,进程就可以进行具体的文件操作。6.5.3VFS和进程接口
——共享文件访问Linux进程可以通过两种途径来实现文件共享:多个进程共享一个系统打开文件表项。只在父子进程之间发生,子进程复制父进程PCB中关于文件信息的全部内容。多个进程使用不同系统打开文件表项指向相同i节点。文件读写指针的共享情况:共享系统打开文件表项的进程使用相同的文件读写指针。不共享系统打开文件表项的进程分别使用不同的文件读写指针。6.5.4缓冲区管理文件系统管理着各种各样的数据,通常都保存在称为外存中,而进程使用数据时必须读入到内存中,同时把数据写出到文件中,这样,数据在内存和外存之间来回传递,数据传输的频率和数量都非常大。在计算机系统中,内外存数据的访问速度差别很大,因此,必须采用缓冲技术来提高外存数据的访问效率。Linux的虚拟文件系统(VFS)支持多种不同类型的逻辑文件系统,它一方面要根据具体的系统进行不同的操作函数映射,同时又能够保持很好的时间及空间性能,关键是VFS系统中采用了多种有效的缓冲机制。VFS文件系统相关的缓冲主要有:i结点缓冲(inodecache):用于i结点访问;目录缓冲(inodedirectorycache):根据文件目录名找目录i结点;块高速缓冲(buffercache):块设备的数据读写过程中的缓冲。
6.5.4缓冲区管理1块高速缓冲区结构块高速缓冲时文件系统和设备进行数据传输的桥梁,它同时涉及到不同的物理设备和逻辑文件系统,是各种设备驱动程序数据传输的接口,因此是一个相对复杂的数据结构。每一个可以使用的缓冲区由两部分组成:buffer:存放数据的缓冲数据区;buffer_head:用于控制的缓冲头部。6.5.4缓冲区管理为了支持各种不同类型的逻辑文件系统,Linux系统缓冲数据区的大小不是固定的,按照不同的长度分为7种类型。在同一时刻,缓冲区中可能包含不同物理设备的数据块。缓冲区头部大致包括三类信息:所在设备号、物理块号等描述缓冲区对应数据块内容的信息;描述缓冲区状态和访问计数的信息;用于缓冲区管理的信息。在Linux的块高速缓冲中,缓冲数据区和缓冲头部并不是完全一一对应的,整个块高速缓冲区中有四类以缓冲头部为结点的链表,其中有两类不包含数据区,并不能进行实际的数据缓冲,主要涉及缓冲头部管理,包括未使用链表unused_list和重用链表reused_list,都采用单向链表存放;另外两类是真正的缓冲区,每一个链表的结点都是由一一对应的缓冲头部和缓冲数据区组成,分别是空闲链表free_list和正在使用链表lru_list,都使用双向链表保存。
6.5.4缓冲区管理空闲链表free_list中保存由内存页面初次创建的缓冲区和从正在使用链表中回收的空缓冲区。系统中一共有7个这样的链表分别对应于不同长度的缓冲区类型他们共同组成一个链表数组。正在使用链表lru_list存放当前正在使用的缓冲区,这是一个由3条链表组成的数组,分别连接不同类型的缓冲区:BUF_CLEAN,数据已经写出、干净的缓冲区;BUF_LOCKED,正在进行写出操作的缓冲区;BUF_DIRTY,“脏”缓冲区。写入新数据,等待写出的缓冲区。
6.5.4缓冲区管理为了提高查找效率,Linux还同时使用一个散列表(hashtable)来组织所有的正在使用的链表。表的结点类型是缓冲头部buffer_head类型,散列索引值通过缓冲区所对应物理块设备号及其块号来产生,具有相同索引数值的正在使用链表的结点组成新的双向链。6.5.4缓冲区管理散列表和缓冲区链表6.5.4缓冲区管理2块高速缓冲区的分配和释放分配块高速缓冲区的工作由getblk函数完成。首先根据块对应的设备号和块号在散列表中搜索正在使用的链表中是否包含这个数据块如果包含,就得到需要的缓冲区,可以进行数据操作否则,就需要重新分配一个空闲缓冲区。分配空闲缓冲区时,根据所操作数据块的大小在相应的空闲缓冲区链表中查找,如果找到一个合适的空闲缓冲区,从链表中摘下该缓冲区,并初始化该缓冲区的控制数据,然后挂到相应的散列表和干净缓冲区链表中,得到可以使用的缓冲区。6.5.4缓冲区管理如果空闲缓冲区中没有合适的缓冲区,系统就通过两种途径来补充空闲缓冲区的数量:一是申请空闲的内存页面,建立所需长度的新缓冲区并挂到相应的空闲链表中,二是唤醒进程bdflush把“脏”缓冲区写出到设备,以得到空闲缓冲区。在完成这些操作的过程中,可能已经有别的进程曾经对这里需要访问的数据块进行过访问并在正在使用链表中建立了结点,因此再进行一次散列表的搜索,若扔未找到,就从空闲缓冲区中获取。见P105图6-15。缓冲区的释放由try_to_free_buffers函数完成。6.5.4缓冲区管理3块高速缓冲区数据维护维护块高速缓冲区,写到设备上的工作由两个内核线程bdflush和update来完成。bdflush的进程号为2,进程名称为kflushd。update的进程号为3,进程名称为kupdateRegisteringtheFileSystems已注册文件系统
注册文件系统Linux文件系统的注册情形:当核心建立的时候,文件系统初始化代码包括对于所有内建的文件系统的初始化例程的调用。可以在需要的时候加载或者手工使用insmod加载。当加载时,它自身向核心登记当卸载时,它就注销。每一个文件系统的初始化例程都向虚拟文件系统注册自身注册过程即用一个file_system_type数据结构代表,里面包括文件系统名称和一个指向其VFS超级块的读取例程的指针。前图显示file_system_type数据结构被放到了由file_systems指针指向的一个列表中。file_system_type数据结构包括:参见fs/filesystems.csys_setup()参见include/linux/fs.hfile_system_type注册文件系统Superblockreadroutine在这个文件系统的一个实例安装的时候,由VFS调用这个例程FileSystmename文件系统的名称,例如ext2Deviceneeded是否这个文件系统需要一个设备支持?并非所有的文件系统需要一个设备来存放。例如:
/proc文件系统,不需要一个块设备可以检查/proc/filesystems来查看登记了哪些文件系统,例如:ext2nodevprociso9660MountingaFileSystem当超级用户试图安装一个文件系统的时候,Linux核心必须首先验证系统调用中传递的参数。虽然
mount可以执行一些基本的检查,但是它不知道这个核心建立是可以支持的文件系统或者提议的安装点是否存在。考虑以下的mount命令:$mount–tiso9660–oro/dev/cdrom/mnt/cdrom安装一个文件系统这个mount命令会传递给核心三部分信息:文件系统的名称、包括这个文件系统的物理块设备和这个新的文件系统要安装在现存的文件系统拓扑结构中的哪一个地方。虚拟文件系统要做的第一件事是找到这个文件系统,步骤:查看file_systems中每个file_system_type数据结构如果它找到了一个匹配的名称,它就直到这个核心支持这个文件系统类型,并得到了文件系统相关例程的地址去读取这个文件系统的超级块。反之若核心内建了可以支持核心模块按需加载,核心会请求核心守护进程加载适当的文件系统模块,然后继续后续过程。参见fs/super.cdo_mount()参见fs/super.cget_fs_type()安装一个文件系统第二步,如果mount传递的物理设备还没有安装,必须找到即将成为新的文件系统的安装点的目录的VFSinode。这个VFSinode可能在inodecache或者必须从支撑这个安装点的文件系统的块设备上读取。一旦找到了这个inode,就检查它是否是一个目录,而且没有其他文件系统安装在那里。同一个目录不能用作多于一个文件系统的安装点。安装一个文件系统这时,这个VFS安装代码必须分配以一个VFS超级块并传递安装信息给这个文件系统的超级块读取例程。系统所有的VFS超级块都保存在super_block数据结构组成的super_blocks向量表中,必须为这次安装分配一个结构。超级块读取例程必须根据它从物理设备读取得信息填充VFS超级块的域。对于EXT2文件系统而言,这种信息的映射或者转换相当容易,它只需要读取EXT2的超级块并填到VFS超级块。对于其他文件系统,例如MSDOS文件系统,并不是这么简单的任务。不管是什么文件系统,填充VFS超级块意味着必须从支持它的块设备读取描述该文件系统的信息。如果块设备不能读取或不包含该文件系统,mount命令失败。安装一个文件系统每一个安装的文件系统用一个vfsmount数据结构描述。vfsmntlist指向的包含所有安装的文件系统列表。vfsmnttail指向列表中最后一个条目
mru_vfsmnt
指针指向最近使用的文件系统。每一个vfsmount结构包括存放这个文件系统的块设备的设备编号文件系统安装的目录一个指向这个文件系统安装时所分配的VFS超级块的指针。VFS超级块指向这一类型的文件系统的file_system_type数据结构和这个文件系统的rootinode。这个inode在这个文件系统加载过程中一直驻留在VFSinodecache中。参见fs/super.cadd_vfsmnt()FindingaFileintheVirtualFileSystem为了找到一个文件在VFS中的VFSinode,VFS必须依据名称一次一个目录找到中间的每一个的目录的VFSinode。每一个目录查找都要调用和文件系统相关的查找例程(地址放在代表父目录的VFSinode中)。在文件系统的VFS超级块中总是有文件系统的rootinode,并在超级块中用指针指示,所以整个过程可以继续。每一次查找真实文件系统中的inode的时候,都要检查这个目录的目录缓存。如果目录缓存中没有这个条目,真实文件系统要么从底层的文件系统要么从inodecache中获得VFSinode。UnmountingaFileSystem通常把装配描述成为拆卸的反过程,但是对于卸载文件系统有些不同:如果系统有东西在使用文件系统的一个文件,那么这个文件系统就不能被卸载。如果有东西在使用要卸载的文件系统,那么它的VFSinode会在VFSinodecache中。检查整个inode列表,查找该文件系统所占用的设备的inode:如果文件系统的VFS超级块是dirty,就是它被修改过了,必须写盘。一旦它写盘,该VFS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年城市污水处理厂智能化改造与节能降耗策略分析报告
- 2023年药学类之药学(士)试题及答案二
- 2024 建安杯信息通信建设行业安全竞赛题库(试题及答案 1 -331 题)
- 大数据隐私保护在医疗影像数据合规应用中的实践与挑战报告
- 2025年电商平台大数据驱动下的精准营销策略与效果评估报告
- 探索2025年语言培训行业课程国际化与教育信息化融合报告
- 2023年版湖北汽车驾驶员(高级)考试内部培训模拟题库含答案
- 2023新型冠状病毒感染病人择期手术的规范管理
- 2024劳动仲裁申请书(34篇)
- 2023年电大历届成本会计期末考试试题答案
- 配电房管理制度上墙
- DEEPSEEK了解及使用攻略高效使用技巧培训课件
- 玉盘二部合唱简谱
- 2024-2025学年云南省丽江地区宁蒗彝族自治县数学五年级第二学期期末考试试题含答案
- DB37T 3567-2019 连续配筋混凝土路面设计与施工技术指南
- 养老院火灾应急预案
- 设备固定资产管理思路及方案
- 陶瓷企业安全培训
- 法院答辩状范本
- 2024年中级注册安全工程师《安全生产法律法规》真题及答案
- “赤峰小米”谷子品种要求(DB15-T 1734-2019)
评论
0/150
提交评论