资源预览内容
第1页 / 共97页
第2页 / 共97页
第3页 / 共97页
第4页 / 共97页
第5页 / 共97页
第6页 / 共97页
第7页 / 共97页
第8页 / 共97页
第9页 / 共97页
第10页 / 共97页
亲,该文档总共97页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第九章第九章 Linux文件系统文件系统1内容linux文件系统概论EXT2文件系统VFS虚拟文件系统文件操作和使用2概论3 文件系统特点 树型结构 文件类型 访问权限概论特点自行设计开发的文件系统称为EXT2Linux支持多种其它操作系统的文件系统: 如minix、ext2、hpfs、msdos、umsdos、iso、nfs、sysv、affs、ufs、efs等达二十几种。虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。4概论 树型结构采用多级目录的树型层次结构管理文件。系统在运行中通过使用命令或系统调用进入任何一层目录,这时系统所处的目录称为当前目录。56概论Linux用两种方法来表示文件或目录的位置:绝对路径和相对路径。绝对路径相对路径 7概论 文件类型目录文件普通文件设备文件管道文件 链接文件8概论目录文件 Linux一个目录是一个驻留在磁盘上的文件,称为目录文件。系统对目录文件的处理方法与一般文件相同。目录由若干目录项组成,每个目录项对应目录中的一个文件。目录项由文件名和属性、位置、大小、建立或修改时间、访问权限等文件控制信息组成。9概论Linux继承了UINX,把文件名和文件控制信息分开管理。i节点 i节点实质上是一个由系统管理的“目录项”,由文件控制信息单独组成的结构体。每个文件对应一个i节点,有唯一编号,称为节点号。Linux目录项只由两部分组成:文件名和节点号。10概论11概论普通文件计算机用户和操作系统用于存放数据、程序等信息的文件。一般都长期地存放在外存储器(磁盘、磁带等)中普通文件一般又分为文本文件和二进制文件12概论设备文件 分为字符设备文件和块设备文件。 内核提供了对设备处理和对文件处理的统一接口,每种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器:/dev/fd0。13概论管道文件 主要用于在进程间传递数据 Linux对管道的操作与文件操作相同,把管道做为文件进行处理。 管道文件又称先进先出(FIFO)文件14概论链接文件也称为符号链接文件,提供了共享文件的一种方法。不是通过文件名实现文件共享,而是通过链接文件包含指向文件的指针来实现对文件访问。普通用户可以建立链接文件,并通过其指针所指向的文件。15概论总之 从对文件内容处理的角度来说,无论是哪种类型文件,Linux都把它们看做是无结构的流式文件,即把文件内容看做是一系列有序的字符流。16概论访问权限目的 保证文件信息的安全,即文件被访问时,系统首先检验访问者权限,只有与文件访问权限相符时才允许对文件进行访问。 17EXT2文件系统EXT2介绍系统结构inode结构18EXT2介绍 最初引进了Minix文件系统,Minix文件系统有较大局限性 1992年4月推出EXT(EXTended File system) 1993年推出了EXT2文件系统,EXT2已经成为Linux的标准文件系统19EXT2系统结构 系统结构 EXT2超级块 内存中超级块的映像 组描述符 块位图20EXT2系统结构系统结构块设备 文件组织和管理是以物理块为单位。物理块是块设备上大小相同的存储区域,如磁盘的扇区。一个文件系统一般使用块设备上一个独立的逻辑分区;文件逻辑分区中除了表示文件内容的逻辑块(称为数据块)外,还设置了若干包含管理和控制信息的逻辑块。磁盘上可能有多个逻辑分区,每个分区使用不同的文件子系统。21EXT2系统结构EXT2文件系统由逻辑块序列组成的。EXT2文件系统把逻辑分区划分成块组,并从0开始依次编号。每个块组中包含若干数据块,数据块中就是目录或文件内容。块组中包含着几个用于管理和控制的信息块:超级块、组描述符表、块位图、inode位图和inode表。22EXT2系统结构23EXT2系统结构 超级块描述文件系统整体信息的数据结构,主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。24EXT2系统结构超级块位于每个块组的最前面,每个块组中包含的超级块内容是相同的。系统运行期间,把超级块复制到系统缓冲区内,只需把块组0的超级块读入内存,其它块组的超级块做为备份。 EXT2超级块ext2_super_block结构。252627EXT2系统结构28EXT2系统结构超级块映像 ext2_super_block结构是超级块在磁盘中的形态,系统运行期间将磁盘上的超级块读入到内存,在内存建立一个超级块映像。 超级块映像定义为ext2_sb_info结构,定义在:/include/linix/ext2_fs_sb.h 29EXT2系统结构 struct ext2_sb_info unsigned long s_frag_size; /* 片的长度,以字节为单位 */ unsigned long s_frags_per_block; /* 每块中片数 */ unsigned long s_inodes_per_block;/* 每块中inode数 */ unsigned long s_frags_per_group; /* 每一块组中片数 */ unsigned long s_blocks_per_group;/* 每一块组中块数 */ unsigned long s_inodes_per_group;/* 每一块组inode数 */ unsigned long s_itb_per_group; /* 每块组节点表占用块数 */ unsigned long s_db_per_group; /* 每一块组中描述符占用的 块数 */30EXT2系统结构 unsigned long s_desc_per_block; /* 一块中组描述符数*/ unsigned long s_groups_count; /* 文件系统中的块组数 */ struct buffer_head * s_sbh; /* 指向内存中包含超级块 的缓冲区的指针 */ struct ext2_super_block * s_es; /* 指向缓冲区中超级块的指针 */ struct buffer_head * s_group_desc; /* 指向描述符数组的指针 */ unsigned short s_loaded_inode_bitmaps; /* 装入缓冲区的inode位图 块数 */ unsigned short s_loaded_block_bitmaps;/* 装入缓冲区的块位图块数 */ unsigned long s_inode_bitmap_numberEXT2_MAX_GROUP_LOADED;/* inode位图数 。31EXT2系统结构组描述符Linux组描述符为32字节,每一个块组有一个组描述符。所有组描述符集中在一起依次存放,形成组描述符表。描述符表中的组描述符顺序与块组在磁盘上的顺序对应。一个组描述符可能占用多个物理块,具有相同内容的组描述符表放在每个块组中做为备份,组描述符定义在/include/linix/ext2_fs.h中:32EXT2系统结构 struct ext2_group_desc_u32 bg_block_bitmap; /* 本组中块位图的位置 */_u32 bg_inode_bitmap; /* 本组中inode位图的位置*/_u32 bg_inode_table; /* 本组中inode表的位 */_u16 bg_free_blocks_count;/* 本组中空闲块数 */ _u16 bg_free_inodes_count;/* 本组中空闲inode数 */_u16 bg_used_dirs_count; /* 本组中所含目录数 */_u16 bg_pad; /* 填充 */_u32 bg_reserved3; /* 保留 */;33EXT2系统结构34EXT2系统结构块位图描述块的使用状况每个块组都有一个块位图,位于组描述符表之后,用来描述本块组中数据块的使用状况。块位图的每一位表示一个数据块的使用情况,为1表示对应数据块已占用,为0表示数据块空闲。各位的顺序与块组中数据块顺序一致块位图一般占用一个逻辑块35Inode结构 inode结构 inode表和inode位图 inode在内存中的映像 EXT2的目录结构36Inode结构 inode结构inode是EXT2基本构件,表示文件系统树型结构的节点。EXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述。EXT2文件系统的inode 定义为struct ext2_inode,该定义在/include/linux/ext2_fs.h中。37Inode结构38Inode结构3940Inode结构inode在内存中的映像 inode与文件一起存放在外存,系统运行时,把inode写入内存建立映像。 内存映像定义为ext2_inode_info 结构,在include/linux/ext2_fs_i.h中定义: 41Inode结构struct ext2_inode_info _u32 i_data15; /* 数据块指针数组 */ _u32 i_flags; /* 文件标志(属性)*/ _u32 i_faddr; /* 片地址 */ _u8 i_frag_no; /* 片号 */ _u8 i_frag_size; /* 片大小 */ _u16 i_osync; /* 同步标志 */42Inode结构 _u32 i_file_acl; /* 文件访问控制链表 */_u32 i_dir_acl; /* 目录访问控制链表 */_u32 i_dtime; /* 文件删除时间 */_u32 i_version; /* 文件版本 */_u32 i_block_group; /* inode所在块组号 */ _u32 i_next_alloc_block; /* 下一个要分配的块 */_u32 i_next_alloc_goal; /*下一个要分配的对象 *_u32 i_prealloc_block; * 预留块首地址 */_u32 i_prealloc_count; /* 预留计数 */ int i_new_inode:1; /* 标志,是否为新分配的inode */;43Inode结构inode表和inode位图一个块组中所有文件的inode形成了inode表, 表项序号是inode号;inode表存放在块组中所有数据块之前,在块组中要占用几个逻辑块由超级块中s_inodes_per_group给出。inode位图反映了inode表中各个表项的使用情况,每位表示inode表的一个表项,为1表示对应表项已占用,为0表示表项空闲。44EXT2的目录结构目录文件中的目录项是ext2_dir_entry结构体,前后连接成一个类似链表的形式。 struct ext2_dir_entry _u32 inode; /* inode号 */ _u16 rec_len; /* 目录项长度 */ _u16 name_len; /* 文件名长度 */ char nameEXT2_NAME_LEN; /* 文件名 */;其中: #define EXT2_NAME_LEN 25545EXT2的目录结构46虚拟文件系统VFS 引言 VFS的工作原理 文件系统的注册 文件系统的安装 VFS超级块 VFS的inode47虚拟文件系统VFS 引言Linux除了自己的文件系统EXT2,还支持多种其它操作系统的文件系统。 Linux的虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。48虚拟文件系统VFS49 VFS的工作原理虚拟文件系统VFS 注意: VFS并不是一种实际文件系统 EXT2等物理文件系统是存在于外存空间的,而VFS 仅存在于内存 VFS是在系统启动时建立,在系统关闭时消失的,物理文件系统是长期存在于外存。 VFS中包含着向物理文件系统转换的一系列数据结构,如VFS超级块、VFS的inode等、各种操作函数的转换入口。50虚拟文件系统VFS文件系统注册向系统内核注册文件系统的两种方式:系统引导时在VFS中注册,在系统关闭时注销。把文件系统做为可装卸模块,安装时在VFS中注册,并在模块卸载时注销。51虚拟文件系统VFSVFS的注册链表管理文件系统注册每个注册文件系统登记在file_system_type结构体中file_system_type结构体组成一个链表,称为注册链表链表的表头由全局变量file_system给出52虚拟文件系统VFSstruct file_system_type struct super_block *(*read_super) (struct super_block *, void *, int); const char *name; int requires_dev; struct file_system_type * next;53虚拟文件系统VFS对于EXT2文件系统: static struct file_system_type ext2_fs_type = ext2_read_super, ext2, 1, NULL ;54虚拟文件系统VFS55虚拟文件系统VFS文件系统的安装 文件系统除在VFS中注册,还必须安装到系统中。要安装的文件系统必须已经存在于外存磁盘空间上,每个文件系统占用一个独立的磁盘分区,并且具有各自的树型层次结构。EXT2是Linux的标准文件系统,所以系统把EXT2文件系统的磁盘分区做为系统根文件系统。56虚拟文件系统VFSEXT2以外的文件系统安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝。用于安装其它文件系统的目录称为安装点或安装目录。5758虚拟文件系统VFS已安装的文件系统用一个vfsmount结构进行描述:59虚拟文件系统VFSstruct vfsmount kdev_t mnt_dev; /* 文件系统所在设备的设备号 */ char *mnt_devname; /* 设备名,如/dev/dsk/hda1 */ char *mnt_dirname; /* 安装点的目录名 */ unsigned int mnt_flags; /* 设备标志 */ struct semaphore mnt_sem;/* 设备I/O操作时信号量 */ struct super_block *mnt_sb; /* 指向超级块的指针 */ struct file *mnt_quotasMAXQUOTAS; time_t mnt_iexpMAXQUOTAS; time_t mnt_bexpMAXQUOTAS; struct vfsmount *mnt_next; 60虚拟文件系统VFS61虚拟文件系统VFSVFS超级块超级块是文件系统中描述整体组织和结构的信息体,在VFS中建立的超级块称为VFS超级块。VFS超级块是在文件系统安装时,由系统在内存中建立的。Linux中对于每种已安装的文件系统,在内存中都有与其对应的VFS超级块。VFS超级块中的数据来自该文件系统的超级块。62虚拟文件系统VFSVFS超级块是一个定义为super_block结构。 struct super_block kdev_t s_dev; /* 物理文件系统所在设备的设备号 */ unsigned long s_blocksize; /* 文件系统物理组织的块大小,字节为单位 */ unsigned char s_blocksize_bits; /* 块长度值的位数 */ unsigned char s_lock; /* 锁定标志,若置位则拒绝其它进程对该超级块访问 */ unsigned char s_rd_only; /* 只读标志,若置位,则该超级块禁写 */63虚拟文件系统VFS unsigned char s_dirt; /* 修改标志,若置位表示该超级块已修改过 */ struct file_system_type * s_type; /* 指向文件系统file_system_type结构体*/struct super_operations *s_op; /* 指向该文件系统的超级块操作函数的集合 */struct dquot_operations *dq_op; /* 指向该文件系统的限额操作函数的集合 */unsigned long s_flags; /* 超级块标志 */unsigned long s_magic; /* 署名,文件系统特有标志数 */ unsigned long s_time; /* 时间信息 */ 64虚拟文件系统VFS struct inode * s_covered; /* 指向该文件系统安装目录inode的指针 */ struct inode * s_mounted; /* 指向该文件系统第一个inode的指针 */ struct wait_queue * s_wait; /* 指向该超级块等待队列的指针 */65虚拟文件系统VFSunion /* 联合体,其成员项是各种文件系统超级块的内存映像 */struct minix_sb_info minix_sb;struct ext_sb_info ext_sb;struct ext2_sb_info ext2_sb;struct hpfs_sb_info hpfs_sb; struct msdos_sb_info msdos_sb;struct isofs_sb_info isofs_sb;struct nfs_sb_info nfs_sb;struct xiafs_sb_info xiafs_sb;struct sysv_sb_info sysv_sb;struct affs_sb_info affs_sb;struct ufs_sb_info ufs_sb;void *generic_sbp; u;66虚拟文件系统VFSVFS超级块的操作VFS要建立、撤消一些VFSinode,还要对VFS超级块进行一些必要的操作。这些操作由一系列操作函数实现。不同文件系统的组织和结构不同,完成同样功能的操作函数的代码不同,每种文件系统都有自己的操作函数。 67虚拟文件系统VFSVFS接口VFS超级块中,s_op是一个指向super_operations结构的指针,super_operations中包含着一系列的操作函数指针,即操作函数的入口地址。super_operations定义如下:68虚拟文件系统VFSstruct super_operations void (*read_inode) (struct inode *);int (*notify_change) (struct inode *, struct iattr *);void (*write_inode) (struct inode *);void (*put_inode) (struct inode *);void (*put_super) (struct super_block *);void (*write_super) (struct super_block *);void (*statfs) (struct super_block *, struct statfs *, int);int (*remount_fs) (struct super_block *, int *, char *);69虚拟文件系统VFS VFSinode为了区别物理文件系统的inode,VFS中的inode称为VFSinode。文件系统的inode在外存中并且长期存在的,VFS的inode在内存中,仅在需要时才建立,不再需要时撤消。文件系统的inode是静态的,而VFS的inode是动态结构。70虚拟文件系统VFSstruct inode kdev_ti_dev; /* 主设备号*/unsigned long i_ino;/* 外存的inode号 */umode_ti_mode; /* 文件类型和访问权限 */nlink_ti_nlink; /* 该文件的链接数 */uid_ti_uid; /* 文件所有者用户标识 */gid_ti_gid; /* 文件的用户组标识 */kdev_ti_rdev; /* 次设备号 */off_ti_size; /* 文件长度,以字节为单位 */ time_t i_atime; /* 文件最后一次访问时间 */71虚拟文件系统VFStime_t i_mtime; /* 文件最后一次修改时间 */time_t i_ctime; /* 文件创建时间 */unsigned long i_blksize; /* 块尺寸,以字节为单位 */unsigned long i_blocks; /* 文件的块数 */unsigned long i_version; /* 文件版本号 */unsigned long i_nrpages; /* 在内存中占用页面数 */struct semaphore i_sem; /* 文件同步操作用信号量 */struct inode_operations *i_op; /* 指向inode操作函数入口表的指针 */72虚拟文件系统VFSstruct super_block *i_sb; /* 指向VFS超级块 */struct wait_queue *i_wait;/*文件同步操作用等待队列struct file_lock *i_flock; /* 指向文件锁定链表的指针struct vm_area_struct *i_mmap; /* 虚存区域 */struct page *i_pages;/* 指向文件占用内存页面page结构 体链表 */struct dquot *i_dquotMAXQUOTAS;struct inode *i_next, *i_prev; /* inode链表指针 */73虚拟文件系统VFS struct inode *i_hash_next, *i_hash_prev; /* inode hash链表指针 */ struct inode *i_bound_to, *i_bound_by; struct inode *i_mount; /* 指向该文件系统根目录inode的指针 */ unsigned long i_count; /* 使用该inode的进程计数 */ unsigned short i_flags; /* 该文件系统的超级块标志 */ unsigned short i_writecount;/* 写计数 */74虚拟文件系统VFSunsigned char i_lock; /* 对该inode的锁定标志 */unsigned char i_dirt; /* 该inode的修改标志 */ unsigned char i_pipe; /* 该inode表示管道文件 */unsigned char i_sock; /* 该inode表示套接字 */unsigned char i_seek; /* 未使用 */unsigned char i_update; /* inode更新标志 */ unsigned char i_condemned;75虚拟文件系统VFSunion /* 各种文件系统特有的信息 */ struct pipe_inode_info pipe_i; struct minix_inode_info minix_i; struct ext_inode_info ext_i; struct ext2_inode_info ext2_i; struct hpfs_inode_info hpfs_i; struct msdos_inode_info msdos_i; struct umsdos_inode_info umsdos_i; struct iso_inode_info isofs_i; struct nfs_inode_info nfs_i;76虚拟文件系统VFS struct xiafs_inode_info xiafs_i;struct sysv_inode_info sysv_i;struct affs_inode_info affs_i; struct ufs_inode_info ufs_i;struct socket socket_i;void * generic_ip; u; ;77虚拟文件系统VFS VFSinode操作函数VFS提供的inode操作函数实质上是一个面向各种不同文件系统进行操作的转换接口。inode结构体中i_op指向inode_operations结构。78虚拟文件系统VFS struct inode_operations struct file_operations * default_file_ops;int (*create) (struct inode *,const char *,int,int,struct inode *);int (*lookup) (struct inode *,const char*,int,struct inode *);int (*link) (struct inode *,struct inode *,const char *,int);int (*unlink) (struct inode *,const char *,int); 79虚拟文件系统VFS int (*symlink)(struct inode *,const char *,int,const char *); int (*mkdir) (struct inode *,const char *,int,int); int (*rmdir) (struct inode *,const char *,int); int (*mknod) (struct inode *,const char *,int,int,int); int (*rename) (struct inode *,const char *,int,struct inode *,const char *,int, int);80虚拟文件系统VFS int (*readlink) (struct inode *,char *,int); int (*follow_link) (struct inode *,struct inode *,int,int,struct inode *);int (*readpage) (struct inode *, struct page *);int (*writepage)(struct inode *, struct page *);int (*bmap) (struct inode *,int);void (*truncate) (struct inode *);int (*permission) (struct inode *, int);int (*smap) (struct inode *,int);81文件管理和操作 文件管理 文件操作82文件管理和操作文件管理一方面 由系统通过系统打开文件表进行统一管理,另一方面 是由进程通过私有数据结构进行管理。83文件管理和操作系统打开文件表Linux系统内核把所有进程打开的文件集中管理, 组成“系统打开文件表”。系统打开文件表是一个双向链表,每个表项是一个file结构,称为文件描述符,存放着一个已打开文件的管理控制信息 进程每打开一个文件就建立一个file结构体,并把它加入到系统打开文件链表中。 全局变量first_file指向系统打开文件表的表头。84文件管理和操作 struct file mode_t f_mode; /* 文件的打开模式 */ loff_t f_pos; /* 文件的当前读写位置 */ unsigned short f_flags; /* 文件操作标志 */ unsigned short f_count; /* 共享该结构的计数值 */ unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; struct file *f_next, *f_prev;/* 链接前后节点指针 */ struct fown_struct f_owner;/* SIGIO用PID */85文件管理和操作struct inode * f_inode; /* 指向文件对应的inode */struct file_operations * f_op; /* 指向文件操作结构体的指针 */unsigned long f_version; /* 文件版本 */void *private_data; /* 指向与文件管理模块有关的私有数据的指针 */;86文件管理和操作说明: f_mode 创建或打开时指定的文件属性,包括文件操作模式和访问权限。 符号常量FMODE_READ(读)和FMODE_WRITE(写) f_flags 指定了文件打开后的处理方式: O_RDONLY 仅为读操作打开文件 O_WRONLY 仅为写操作打开文件 O_RDWR 为读和写操作打开文件87文件管理和操作f_pos 记载文件中当前读写处理所在的字节位置,相当是文件内部的一个位置指针。f_inode 指向文件对应的VFSinodef_count 记载共享该file结构体的进程的数目i_count 记载共享此文件的独立进程数目f_op 指向对文件进行操作的函数指针集合file_operations结构 通过f_op对不同文件系统的文件调用不同的操作函数。88文件管理和操作进程的文件管理 一个进程打开的所有文件,由进程两个私有结构进行管理:fs_struct结构 记录着文件系统根目录和当前目录files_struct结构 包含着进程的打开文件表89文件管理和操作 struct fs_struct int count; /* 共享此结构的计数值 */unsigned short umask; /* 文件掩码 */struct inode * root, * pwd; /* 根目录和当前目录inode指针 */;90文件管理和操作说明: root 指向当前目录所在的文件系统的根目录inode,按照绝对路径访问文件时就从这个指针开始。 pwd是指向当前目录inode的指针,相对路径则从这个指针开始。91文件管理和操作#define NR_OPEN 256struct files_struct int count; /* 共享该结构的计数值 */fd_set close_on_exec; fd_set open_fds;struct file * fdNR_OPEN;92文件管理和操作说明:进程所打开文件都记载在fd数组中,fd数组下标称为文件标识号。进程使用文件名打开一个文件,之后对文件识别就不再使用文件名,而直接使用文件标识号。打开文件时,建立file结构体,并加入到系统打开文件表中,然后把该file结构体的首地址写入fd数组的第一个空闲元素中。系统启动时文件标识号0、1、2由系统分配: 0标准输入设备,1标准输出设备,2标准错误输出设备。93文件管理和操作94文件管理和操作文件操作文件打开后要进行各种操作,VFS提供了面向文件操作的统一接口。file中f_op指向的file_operations结构是面向文件进行操作的接口,是VFS提供的向各种物理文件系统的文件操作函数进行转换的统一接口。95文件管理和操作 struct file_operations int (*lseek) (struct inode *, struct file *, off_t, int);int (*read) (struct inode *, struct file *, char *, int);int (*write) (struct inode *, struct file *, const char *, int);int (*readdir) (struct inode *, struct file *, void *, filldir_t);int (*select) (struct inode *, struct file *, int, select_table *); 96作业Page 271.10.1, 10.4 97
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号