《liunx虚拟文件系统介绍.ppt》由会员分享,可在线阅读,更多相关《liunx虚拟文件系统介绍.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Linux的虚拟文件系统的虚拟文件系统2011.05提纲提纲虚拟文件系统VFS的作用VFS的数据结构文件系统类型文件系统安装路径名查找VFS系统调用的实现文件加锁11/03/09嵌入式OS2/31虚拟文件系统虚拟文件系统VFS的作用的作用虚拟文件系统Virtual FilesystemVirtual Filesystem SwitchVFS是一个软件层,用来处理与Unix标准文件系统相关的所有系统调用。是用户应用程序与文件系统实现之间的抽象层能为各种文件系统提供一个通用的、统一的接口Linux与其他类Unix系统一样,采用虚拟文件系统VFS来达到支持多种文件系统格式的目标11/03/09嵌入式
2、OS3/31VFS在一个简单文件复制操作中的作用在一个简单文件复制操作中的作用假设用户输入以下shell命令$cp/floppy/TEST/tmp/test 其中,/floppy是MS-DOS的磁盘的一个挂载点(安装点)/tmp是Ext2文件系统中的一个目录对于cp命令而言,它不需要知道/floppy/TEST和/tmp/test分别是什么文件系统类型在cp命令中,它通过VFS提供的系统调用接口进行文件操作11/03/09嵌入式OS7/3111/03/09嵌入式OS8/31VFS支持的文件系统类型支持的文件系统类型VFS支持的文件系统可以划分为三种主要类型基于磁盘的文件系统:它们管理在本地磁盘
3、分区中可用的存储空间Linux使用的文件系统:ext2、ext3、ReiserFSUnix家族的文件系统:SYSV文件系统,UFS,MINIX文件系统以及VERITAS VxFS微软公司的文件系统:MS-DOS、VFAT以及NTFSISO9660CD-ROM文件系统和通用磁盘格式的DVD文件系统其他有专利权的文件系统,如HPFS、HFS、AFFS、ADFS起源于非Linux系统的其他日志文件系统,JFS,XFS11/03/09嵌入式OS9/31网络文件系统:用于访问属于其他网络计算机的文件系统所包含的文件NFS、Coda、AFS、SMB、NCP特殊文件系统不同于上述两大类不管理具体的磁盘空间/
4、proc各种不同的文件系统通过mount(挂载、安装)到根文件系统中在Linux中,根文件系统即根目录所代表的文件系统通常是ext2文件系统11/03/09嵌入式OS10/31VFS中通用文件模型概念中通用文件模型概念VFS的基本思想:引入一个通用文件模型,这个模型能够表示所有支持的文件系统对于一个具体实现的文件系统,在处理时,需要将其进行概念上的转换例如,在通用文件模型中,目录被看成是普通文件在实现上,read()sys_readfile数据结构f_opMS_DOS文件操作指针(其中的read操作)类似面向对象的概念11/03/09嵌入式OS11/31通用文件模型有下列对象类型组成超级块对象
5、(superblock object)存放文件系统相关信息:例如文件系统控制块索引节点对象(inode object)存放具体文件的一般信息:文件控制块/inode文件对象(file object)存放已打开的文件和进程之间交互的信息目录项对象(dentry object)存放目录项与文件的链接信息11/03/09嵌入式OS12/31三个不同的进程打开同一个文件三个不同的进程打开同一个文件11/03/09嵌入式OS13/31两个不同的硬链接同一个硬链接VFS所处理的系统调用所处理的系统调用mount、umount:挂载/卸载文件系统sysfs:获取文件系统信息statfs、fstatfs、us
6、tat:获取文件系统统计信息chroot:更改根目录chdir、fchdir、getcwd:操纵当前工作目录mkdir、rmdir:创建/删除目录getdents、readdir、link、unlink、rename:对目录项进行操作readlink、symlink:对符号链接进行操作chown、fchown、lchown:更改文件所有者chmod、fchmod、utime:更改文件属性open、close、create 11/03/09嵌入式OS14/31上述大部分操作只需要与通用文件模型中的一些对象打交道,而不需要真正操作具体的文件系统和文件,因此可以把VFS看成是一个“通用”的文件系统,
7、在必要时依赖某种具体的文件系统11/03/09嵌入式OS15/31VFS的数据结构的数据结构每个VFS对象都对应一定的数据结构,在这个数据结构中包含对象的属性及其方法一个具体的文件系统:超级块对象:super_block所有超级块链表:super_blocks:s_list域文件系统特有信息:s_fs_info域脏标志:s_dirt域文件系统特有方法:super_operations数据结构及域11/03/09嵌入式OS16/31include/linux/fs.h一个具体的文件:Inode对象:inodeInode特有的方法目录项对象:dentry一个打开文件:文件对象:file文件操作指针
8、f_pos文件对象特有的方法专用高速缓存:“filp”,filp_cachep 11/03/09嵌入式OS17/31include/linux/fs.hinclude/linux/dcache.hinclude/linux/fs.h11/03/09嵌入式OS18/3111/03/09嵌入式OS19/31与进程相关的文件与进程相关的文件文件系统相关信息fs_struct打开文件相关信息files_struct11/03/09嵌入式OS20/31include/linux/fs_struct.hinclude/linux/path.h11/03/09嵌入式OS21/31include/linux/
9、fdtable.hinclude/linux/fdtable.hinclude/linux/types.hinclude/linux/posix_types.h11/03/09嵌入式OS22/31文件系统类型文件系统类型特殊文件系统用来为系统程序员、系统管理员等提供一种容易的方式来操作内核的数据结构并实现操作系统的特殊特征常用的特殊文件系统11/03/09嵌入式OS23/3111/03/09嵌入式OS24/31文件系统类型的注册文件系统类型的注册文件系统类型:file_system_type在系统初始化期间,register_filesystem()用来注册编译时指定的每个文件系统相应的文件系
10、统对象被插入到file_systems链表中unregister_filesystem()11/03/09嵌入式OS25/31文件系统的挂载文件系统的挂载根文件系统在系统初始化过程中被直接mount提供系统初始化脚本以及基本命令每个文件系统都有自己的根目录如果一个文件系统的根目录是系统目录树的根目录,那个这个文件系统就是根文件系统其他文件系统可以挂载到系统的目录树上这样的目录称为挂载点(mount点,安装点)文件系统之间的挂载关系对应文件系统之间的父子关系11/03/09嵌入式OS27/31例如,放在软盘/dev/fd0上的ext2文件系统,可通过下列命令安装在/flp上mount-t ext
11、2/dev/fd0/flp 一般情况下,只允许挂载一次在umount之前,其他对/dev/fd0的挂载命令会失败在2.4中,可以挂载多次不管被挂载多少次,只有一个真实的文件系统,因此只有一个超级块对象11/03/09嵌入式OS28/31已挂载文件系统描述符vfsmount挂载根文件系统第一阶段:安装一个特殊的文件系统,该文件系统仅提供一个作为初始安装点的空目录:init_mount_tree第二阶段:mount_root挂载一个文件系统sys_mount卸载一个文件系统sys_umount11/03/09嵌入式OS29/31路径名查找路径名查找VFS是如何从文件路径名找到相应的索引节点的?分析
12、路径名,将它拆分成一个文件名序列除了最后一个文件名之外,其他所有文件名必定都是目录名搜索的起点:绝对路径:currentfsroot相对路径:currentfspwd11/03/09嵌入式OS31/31首先找到起点目录的索引节点在这个索引节点的目录文件中,找到第一个目录名(文件名)所对应的索引节点在第一个目录名的索引节点的目录文件中找到第二个目录名(文件名)所对应的索引节点反复,直到文件名序列的最后一项11/03/09嵌入式OS32/31在上述查找过程中要处理的其他问题:对每个目录的访问权限必须进行检查若是符号链接,需要进行扩展要考虑符号链接的循环引用(进行处理)目录名可能是一个文件系统的安装
13、点,必须扩展到一个新的文件系统中路径名查找数据结构:struct nameidata在需要进行路径名查找的时候,依此调用如下函数:path_init,path_walk,path_release11/03/09嵌入式OS33/31查找操作的标志查找操作的标志11/03/09嵌入式OS34/31标准查找操作标准查找操作要处理的问题跳过第一个路径名分量前的任何/考虑符号链接的查找检查权限考虑“.”考虑“.”考虑普通目录,要在目录项高速缓存中查找11/03/09嵌入式OS35/31父路径名的查找父路径名的查找在很多情况下,查找操作的真正目的不是路径名的最后一个分量,而是最后分量的前一个分量例如创建一
14、个文件时此时,路径解析的结果中存放最后一个分量所在目录对应的对象11/03/09嵌入式OS36/31符号链接的查找符号链接的查找关于符号链接的解析由内核来完成如何识别这是一个符号链接?如何处理符号链接的循环情况?11/03/09嵌入式OS37/31VFS系统调用的实现系统调用的实现仍然考虑$cp/floppy/TEST/tmp/test假定cp执行下列代码片段(实际要更复杂)inf=open(/floppy/TEST,O_RDONLY,0);outf=open(/tmp/test,O_WRONLY|O_CREAT|O_TRUNC,0600);do len=read(inf,buf,4096);
15、write(outf,buf,len);while(len);close(outf);close(inf);11/03/09嵌入式OS38/31open()系统调用sys_openread和write系统调用sys_writesys_readclose系统调用sys_close11/03/09嵌入式OS39/31Ext2文件系统简介文件系统简介EXT2文件系统是EXT文件系统的升级,在Linux中得到了广泛的使用。介绍EXT2文件系统的磁盘组织目录项和支持的文件类型11/03/09Linux OS analysis41/31(一)(一)EXT2文件系统的磁盘组织文件系统的磁盘组织 除了引导扇区
16、之外,EXT2磁盘分区被顺序划分为若干个磁磁盘块组盘块组(Block Group)。每个块组由若干个磁盘块,按照相同的方式组织,具有相同的大小。EXT2磁盘块组中的磁盘块按顺序被组织成:一个用作超超级块级块的磁盘块。在这个磁盘块里,存放了文件系统超级块的一个拷贝;N个记录组组描述符描述符的磁盘块;1个记录数据数据块块位位图图的磁盘块;1个记录索引索引结结点位点位图图的磁盘块;N个用作索引索引结结点表点表的磁盘块;N个用作数据数据块块的磁盘块。11/03/09Linux OS analysis42/31EXT2的超级块的超级块每个块组的第一个磁盘块用来保存所在EXT2 fs的超级块多个块组中的超
17、级块形成冗余在某个或少数几个超级块被破坏时,可用于恢复被破坏的超级块信息。11/03/09Linux OS analysis43/31超级块超级块11/03/09Linux OS analysis44/3111/03/09Linux OS analysis45/31Linux 2.4.18中在内存中记录中在内存中记录ext2超级块的数超级块的数据结构据结构11/03/09Linux OS analysis46/31组描述符组描述符组描述符用来描述一个磁盘块组的相关信息11/03/09Linux OS analysis47/31索引结点索引结点 EXT2中所有的索引结点大小相同,都是128个字节
18、。11/03/09Linux OS analysis48/3111/03/09Linux OS analysis49/31索引节点表索引节点表EXT2的一个磁盘块组中的索引结点存储在一组连续的磁盘块中,形成一个索引结点表。这组磁盘块中的第一个磁盘块的块号存储在超级块的bg_inode_table数据项中。根据磁盘块的大小,可以计算出每个磁盘块能容纳多少个索引结点根据索引结点的总个数,可以计算出索引结点表所需要占用的磁盘块的个数。11/03/09Linux OS analysis50/31关于索引节点中的关于索引节点中的i_block11/03/09Linux OS analysis51/31e
19、xt2的索引结点中使用了组合索引方式。前12项用作直接索引第13项用作间接索引第14项用作二次间接索引第15项用作三次间接索引 数据块位图和索引结点块位图数据块位图和索引结点块位图EXT2的空闲盘块分配算法采用了位图法位图:为便于查找数据块或索引结点的分配信息每个位(bit)都对应了一个磁盘块:0,表示对应的磁盘块(或索引结点)空闲1,表示占用。2个位图分别占用一个专门的磁盘块。根据磁盘块的大小,可以计算出每个块组中最多能容纳的数据块个数和索引节点块个数。11/03/09Linux OS analysis52/31(二)(二)EXT2中的目录项和文件类型中的目录项和文件类型 在EXT2中,目录
20、是一种特殊的文件,这种文件的数据块中存放了该目录下的所有目录项 11/03/09Linux OS analysis53/31新版的目录项结构11/03/09Linux OS analysis54/31EXT2支持的文件类型支持的文件类型 EXT2在目录项中存放了文件的类型信息。文件类型可以是07中的任意一个整数。它们分别代表如下含义:0:文件类型未知;1:普通文件类型;2:目录;3:字符设备;4:块设备;5:有名管道FIFO;6:套接字;7:符号链接。11/03/09Linux OS analysis55/31注意:注意:11/03/09Linux OS analysis56/31(三)创建一
21、个(三)创建一个ext2文件系统文件系统在磁盘上创建文件系统通常有两个步骤:格式化磁盘Linux中:superformat或者fdformat创建文件系统Ext2:mke2fsmke2fs的缺省参数磁盘块大小:1024字节分片:目前不支持,因此与磁盘块一样分配inode的个数:1/8192B永久保留的块的个数:511/03/09Linux OS analysis57/31创建流程创建流程1.初始化超级块和组描述符2.Optionally,检查是否有坏块,若有创建坏块列表3.对每个块组,保留所有用来存放超级块、组描述符、inode表、2个位图的磁盘块4.初始化每个块组中的位图5.初始化每个块组中
22、的inode表6.创建/root 目录7.创建 lost+found 目录(供e2fsck 使用,与坏块相关)8.为上述两个目录而更新位图信息9.若有坏块,则将其在 lost+found 目录中组织起来11/03/09Linux OS analysis58/31以以1.44MB的软盘为例,创建的软盘为例,创建ext2文件系统后文件系统后11/03/09Linux OS analysis59/31(四)(四)Ext2提供的各种对象方法提供的各种对象方法超级块对象方法11/03/09Linux OS analysis60/31索引节点对象方法11/03/09Linux OS analysis61/
23、31文件对象方法11/03/09Linux OS analysis62/31(五)管理(五)管理ext2的磁盘空间的磁盘空间存储在磁盘上的文件与用户所“看到”的文件有所不同:用户感觉,文件在逻辑上是连续的而在磁盘上,存储文件数据的磁盘块可能分散在磁盘各处用户感觉,文件可能比较大而在磁盘上,由于文件空洞的存在,分配给文件的磁盘空间可能小于用户感觉到的文件大小。11/03/09Linux OS analysis63/31涉及到如下操作:创建/删除一个索引节点数据块的寻址文件空洞分配/释放一个数据块11/03/09Linux OS analysis64/31创建创建/删除一个索引节点删除一个索引节点
24、创建一个磁盘索引节点删除一个索引节点11/03/09Linux OS analysis65/31关于数据块的寻址关于数据块的寻址任何一个常规文件都会包含一系列数据块文件内块号 vs.逻辑块号根据数据在文件中的偏移可以计算逻辑块号:首先计算出文件内块号(偏移f1)/块大小的商 1 根据索引信息,查询到逻辑块号11/03/09Linux OS analysis66/31混合索引示意图混合索引示意图11/03/09Linux OS analysis67/31文件大小限制文件大小限制11/03/09Linux OS analysis68/31关于文件空洞关于文件空洞A file hole is a p
25、ortion of a regular file that contains null characters and is not stored in any data block on disk.这是UNIX文件一直以来都有的一个特性例如命令:创建一个大小为102461字节的文件,这个文件有一个102466144个字节大小的空洞。只有最后一个字节存放了字母“X”文件空洞可以节省磁盘空间Ext2通过数据块的动态分配来实现这一点:当且当且仅仅当一个当一个进进程要写数据到文件中的程要写数据到文件中的时时候才真正分配磁候才真正分配磁盘块盘块11/03/09Linux OS analysis69/31
26、分配分配/释放一个数据块释放一个数据块当一个文件需要新的数据块来存放数据时当一个文件被删除或者被截断时11/03/09Linux OS analysis70/3171JFFS/JFFS22000年,Axis公司发布了日志式Flash文件系统jffs 2001年初,Red Hat公司在此基础上推出了jffs2文件系统。它们都是针对嵌入式系统中的Flash存储器进行设计的。72(1)JFFS存储格式存储格式 第一版本的jffs是一个日志结构的文件系统。在Flash的存储空间中,数据和辅助信息都依次存放于其中。在该文件系统中,只有一种文件节点,它通过jffs_raw_inode这个结构进行描述。每个
27、这样的节点都关联到某个文件上,其中包含了一个简单的头部,辅助信息以及存储的数据。由于在jffs中,大的文件都分为很多节点存放,所以除了必须存放数据之外,还要额外保存这段数据在文件中的偏移量。73(2)文件系统操作的实施过程)文件系统操作的实施过程 挂接 读取 改变属性 74(3)空间回收空间回收 在进行空间回收时,系统自动从所有存储块中的第一个开始进行分析,不断将废弃的节点回收,将尚在使用的节点进行合并,这样最终合成出整个的一块废弃的Flash存储块,这样就可以将这一整块存储块的内容一次性擦除,成为新的空闲块。75(4)缺陷缺陷 关于空间回收,jffs并没有进行太多优化。不支持对数据进行压缩之
28、后进行存储。不支持硬链接,每一个存储块中都保存了对应的文件名76JFFS2:改进:改进jffs2的节点头部中增加了一些新的信息,包括CRC校验码和节点类型等。由于jffs空间回收方式的缺陷,在jffs2中,所有的存储节点都不可以跨越Flash的块界限了。jffs2不再像jffs中只有一种节点,现在有3种节点类型了,分别用于表示擦除块的标记,普通文件,目录。文件系统的信息并不是像jffs中那样,全部保存在内存之中。可以很快取得的数据并不保存在内存之中,这样可以提高内存的利用率。增加了对数据的压缩。开始支持硬链接。77YAFFS/YAFFS2虽然JFFS/JFFS2是针对Flash建立的文件系统,
29、它可支持NOR和NAND Flash,但是把它应用于NAND Flash还存在如下问题:JFFS需要通过建立在内存中的jffs_node结构体维护Flash中的日志节点,每个节点需要占用48个字节的内存空间。JFFS/JFFS2在挂载时需要扫描整个Flash的内容,以找出所有的日志节点,建立文件结构78 YAFFSYAFFS(Yet Another Flash File System)是专门针对NAND Flash特点编写的日志文件系统。它克服了JFFS/JFFS2的缺点,具有如下特性:很小的内存空间占用。很短的挂载时间。跨平台的文件系统。79YAFFS2YAFFAS是效果很理想的NAND F
30、lash上的文件系统但它不支持数据压缩,而且它仅对512字节页(后简称小页)大小的NAND Flash存储器。而很多大容量的NAND Flash(128MB以上),使用大小为2KB的页(后简称为大页),YAFFS并不能支持这种Flash。YAFFS2是为此而开发出来的。YAFFS2实现对大页Flash的支持。同时,YAFFS2在内存空间占用,垃圾回收速度,读写速度等方面均有大幅度提升。80CramfsCRAMFS最初是Linus Torvalds 编写的一个文件系统,具有简单、压缩和只读等特点。是用于保存只读的根文件系统内容的一个很好的方案。CRAMFS 主要的优点:是将文件数据以压缩形式存储
31、,在需要运行的时候进行解压缩。由于它存储的文件形式是压缩的格式,所以文件系统不能直接在 Flash 上运行。虽然这样可以节约很多Flash 存储空间,但是文件系统运行需要将大量的数据拷贝进RAM 中,造成一定的浪费。81创建创建CRAMFS 根文件系统映像根文件系统映像 需要相关的文件系统工具mkcramfs 和cramfsck。mkcramfs 在一般的桌面Linux 系统中都可以找到,如果没有的话我们可以从内核源代码编译和安装这些工具。这两个工具的源代码位于内核源代码的 scripts/cramfs 目录下,可以直接编译:user$cd$KERNELDIR/scripts/cramfsuser$make然后把生成的mkcramfs 和cramfsck 拷贝到系统执行路径中就可以使用了。可以使用如下命令来制作一个CRAMFS 映像,$ROOTFS为目标根文件系统所在目录:user$mkcramfs$ROOTFS/cramfs.img ThanksThanks!The end.