1、第三章 LINUX文件系统,第一节 文件系统管理,文件系统类型,支持多种不同类型的文件系统是LINUX操作系统的一大特色。目前支持的有ext, ext2, minix, umsdos, ncp, iso9660, hpfs,msdos, xia, vfat, proc,nfs, smb, sysv, affs, ntfs以及ufs等,参见 include/linux/autoconf.h。,文件系统类型的注册,一种是在编译核心系统时确定,并在系统初始化时通过内嵌的函数调用向注册表登记。 另一种则利用LINUX的模块(module)特征,把某个文件系统当作一个模块。装入该模块时(通过kernel
2、d或用insmod命令 )向注册表登记它的类型,卸装该模块时则从注册表注销。,操作函数,int register_filesystem(struct file_system_type * fs);Int unregister_filesystem(struct file_system_type * fs);,管理文件系统 类型的结构,文件系统实例的管理,LINUX文件系统管理首先是关于“文件系统” 层的管理。系统启动时,必首先装入“根”文件系统(由全程变量ROOT_DEV指示),然后根据/etc/fstab中指定,逐个建立文件系统。此外,用户也可以通过mount、umount操作,随时安装或卸
3、装文件系统。当装入一个文件系统时,应首先向操作系统核心注册该文件系统。当卸装一个文件系统时,应向操作系统核心申请注销该文件系统。,文件系统实例的注册操作,struct vfsmount *add_vfsmnt(kdev_t dev, const char * dev_name,const char * dir_name);void remove_vfsmnt(kdev_t dev);struct vfsmount *lookup_vfsmnt(kdev_t dev);,文件系统实例的数据结构,文件系统类型和实例示意图,第三章 LINUX文件系统,第二节 虚拟文件系统VFS,VFS,VFS对LI
4、NUX的每个文件系统的所有细节进行抽象,使得不同的文件系统在LINUX核心以及系统中运行的其他进程看来,都是相同的。 VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。 VFS在系统启动时建立,在系统关闭时消亡。 VFS拥有关于各种特殊文件系统的公共界面,如超级块、inode、文件操作函数入口等。,VFS的作用,VFS 超级块,VFS描述系统文件使用超级块和inode的方式。 在系统初启时,所有被初始化的文件系统 (file_system_type)都要向VFS(file_systems)登记。 每种文件系统类型的读超级块函数(read_super)必须识别该文件系统的结
5、构并且将其信息映射到一个VFS的超级块数据结构上。参见文件super.doc,树型目录与VFS超级块,VFS inode,文件系统由子目录和文件构成。 每个子目录或文件只能由唯一的inode结构描述。 VFS inode的内容取自物理设备上的文件系统,由文件系统指定的操作函数(i_op属性指定)填写。参见文件inode.doc,第三章 LINUX文件系统,第三节 EXT2文件系统,LINUX的磁盘文件系统,引导块:在文件系统的开头,通常为一个扇区,存放引导程序,用于读入并启动操作系统。 超级块:用于记录文件系统的管理信息。特定的文件系统定义了特定的超级块。 inode区:一个文件(或目录占据一
6、个索引节点。第一个索引节点是该文件系统的根节点。利用根节点,可以把一个文件系统挂在另一个文件系统的非叶节点上。 数据区:存放文件数据或者管理数据(如一级间址块,二级间址块等。,EXT2体系结构,块组(block group),保存关于文件系统的备份信息(超级块和所有组描述符)。当某个组的超级块或inode受损时,这些信息用来恢复文件系统。 块位图(block bitmap)记录本组内各个数据块的使用情况,每一位(bit)对应于一个数据块,0表示空闲,非0表示已分配。 inode位图(inode bitmap)的作用类似于块位图,它记录inode表中inode的使用情况。,块组(block gr
7、oup),inode表(inode table)保存本组所有的inode。EXT2应用inode描述文件,一个inode对应一个文件,每个inode对应一个唯一的inode号。inode既定义文件内容在外存空间的位置,也定义了对文件的存取权限、文件修改时间、文件类型等信息。 数据块(data blocks)则是真正的文件数据区。为文件分配存储空间以块为单位。,EXT2超级块,每个块组(Block Group)均包含一个相同的超级块。一般,只有块组0的超级块才读入内存,其它块组的超级块仅作为备份。外存中的超级块,参见文件ext2_super.doc内存中的超级块,参见文件ext2_super.d
8、oc,EXT2组描述符 (group discriptor),每个块组(Block Group)都有一个组描述符来描述它所有的组描述符在每个块组中都有备份组描述符一个挨一个存放,构成了组描述符表。,组描述符的结构,EXT2的inode,文件系统的每个文件或目录(看作一种特殊文件)由一个inode描述,且只能由一个inode描述。 属于同一块组(Block Group)的inode保存在同一inode表中,与该组的inode位图一一对应。 外存中的inode,参见文件ext2_inode.doc 内存中的inode,参见文件ext2_inode.doc,inode关于数据块的寻址,EXT2的目录
9、,目录是关于文件的存取路径的特殊文件 一个目录文件就是一个目录项的列表,每一个目录项都有一个数据结构来描述: struct ext2_dir_entry _u32 inode; /* 该目录项的inode号,用它可以查找inode表中对应的inode */_u16 rec_len; /* 目录项的长度 */_u16 name_len; /* 文件名长度,最长255 */char nameEXT2_NAME_LEN; /* 文件名 */ ,例:在EXT2文件系统中查找/usr/include/stdio.h文件,根据ROOT_DEV,从vfsmntlist链表、file_systems链表找到文件系统的超级块,继而找出“/”的inode号(VFS的super_block.s_mounted)。 到块组0的inode表中读取文件系统的根的inode。 根文件是一个目录文件(由“i_mode”识别),包含了根目录下子目录和文件的由ext2_dir_entry描述的目录项。可以在其中找到ext2_dir_entry .name=“usr”的目录项,从该目录项的ext2_dir_entry.inode读出代表/usr目录的inode号。,