《张惠娟副教授Mszhjcom.ppt》由会员分享,可在线阅读,更多相关《张惠娟副教授Mszhjcom.ppt(96页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、张惠娟副教授Mszhjcom Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望内容linux文件系统概论EXT2文件系统VFS虚拟文件系统文件操作和使用2 文件系统特点 树型结构 文件类型 访问权限概论3特点自行设计开发的文件系统称为EXT2Linux支持多种其它操作系统的文件系统:如minix、ext2、hpfs、msdos、umsdos、iso、nfs、sysv、affs、ufs、efs等达二十几种。虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件
2、系统提供了统一的接口。概论4 树型结构采用多级目录的树型层次结构管理文件。系统在运行中通过使用命令或系统调用进入任何一层目录,这时系统所处的目录称为当前目录。概论56Linux用两种方法来表示文件或目录的位置:绝对路径和相对路径。绝对路径相对路径 概论7 文件类型目录文件普通文件设备文件管道文件 链接文件概论8目录文件 Linux一个目录是一个驻留在磁盘上的文件,称为目录文件。系统对目录文件的处理方法与一般文件相同。目录由若干目录项组成,每个目录项对应目录中的一个文件。目录项由文件名和属性、位置、大小、建立或修改时间、访问权限等文件控制信息组成。概论9Linux继承了UINX,把文件名和文件控
3、制信息分开管理。i节点 i节点实质上是一个由系统管理的“目录项”,由文件控制信息单独组成的结构体。每个文件对应一个i节点,有唯一编号,称为节点号。Linux目录项只由两部分组成:文件名和节点号。概论10概论11普通文件计算机用户和操作系统用于存放数据、程序等信息的文件。一般都长期地存放在外存储器(磁盘、磁带等)中普通文件一般又分为文本文件和二进制文件概论12设备文件 分为字符设备文件和块设备文件。内核提供了对设备处理和对文件处理的统一接口,每种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器:/dev/fd0。概论13管道文件 主要用于在进程间
4、传递数据 Linux对管道的操作与文件操作相同,把管道做为文件进行处理。管道文件又称先进先出(FIFO)文件概论14链接文件也称为符号链接文件,提供了共享文件的一种方法。不是通过文件名实现文件共享,而是通过链接文件包含指向文件的指针来实现对文件访问。普通用户可以建立链接文件,并通过其指针所指向的文件。概论15总之 从对文件内容处理的角度来说,无论是哪种类型文件,Linux都把它们看做是无结构的流式文件,即把文件内容看做是一系列有序的字符流。概论16访问权限目的 保证文件信息的安全,即文件被访问时,系统首先检验访问者权限,只有与文件访问权限相符时才允许对文件进行访问。概论17EXT2文件系统EX
5、T2介绍系统结构inode结构18 最初引进了Minix文件系统,Minix文件系统有较大局限性 1992年4月推出EXT(EXTended File system)1993年推出了EXT2文件系统,EXT2已经成为Linux的标准文件系统EXT2介绍 19EXT2系统结构 系统结构 EXT2超级块 内存中超级块的映像 组描述符 块位图20系统结构块设备 文件组织和管理是以物理块为单位。物理块是块设备上大小相同的存储区域,如磁盘的扇区。一个文件系统一般使用块设备上一个独立的逻辑分区;文件逻辑分区中除了表示文件内容的逻辑块(称为数据块)外,还设置了若干包含管理和控制信息的逻辑块。磁盘上可能有多个
6、逻辑分区,每个分区使用不同的文件子系统。EXT2系统结构21EXT2文件系统由逻辑块序列组成的。EXT2文件系统把逻辑分区划分成块组,并从0开始依次编号。每个块组中包含若干数据块,数据块中就是目录或文件内容。块组中包含着几个用于管理和控制的信息块:超级块、组描述符表、块位图、inode位图和inode表。EXT2系统结构22EXT2系统结构23 超级块描述文件系统整体信息的数据结构,主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。EXT2系统结构24超级块位于每个块组的最前面,每个块组中包含的超级块内容是相同的。系统运行期间,把超级块复制到系统缓冲区内
7、,只需把块组0的超级块读入内存,其它块组的超级块做为备份。EXT2超级块ext2_super_block结构。EXT2系统结构252627EXT2系统结构28超级块映像 ext2_super_block结构是超级块在磁盘中的形态,系统运行期间将磁盘上的超级块读入到内存,在内存建立一个超级块映像。超级块映像定义为ext2_sb_info结构,定义在:/include/linix/ext2_fs_sb.h EXT2系统结构29 struct ext2_sb_info unsigned long s_frag_size;/*片的长度,以字节为单位*/unsigned long s_frags_per
8、_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;/*每一块组中描述符占用的 块数*/EXT2系统结构30 un
9、signed 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_load
10、ed_block_bitmaps;/*装入缓冲区的块位图块数 */unsigned long s_inode_bitmap_numberEXT2_MAX_GROUP_LOADED;/*inode位图数 。EXT2系统结构31组描述符Linux组描述符为32字节,每一个块组有一个组描述符。所有组描述符集中在一起依次存放,形成组描述符表。描述符表中的组描述符顺序与块组在磁盘上的顺序对应。一个组描述符可能占用多个物理块,具有相同内容的组描述符表放在每个块组中做为备份,组描述符定义在/include/linix/ext2_fs.h中:EXT2系统结构32 struct ext2_group_desc_
11、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;/*保留*/;EXT2系统结构33EXT2系统结构34块位图描述块的使用状况每个块组都有
12、一个块位图,位于组描述符表之后,用来描述本块组中数据块的使用状况。块位图的每一位表示一个数据块的使用情况,为1表示对应数据块已占用,为0表示数据块空闲。各位的顺序与块组中数据块顺序一致块位图一般占用一个逻辑块EXT2系统结构35 inode结构 inode表和inode位图 inode在内存中的映像 EXT2的目录结构Inode结构36 inode结构inode是EXT2基本构件,表示文件系统树型结构的节点。EXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述。EXT2文件系统的inode 定义为struct ext2_inode,该定义在/include/linux/
13、ext2_fs.h中。Inode结构37Inode结构38Inode结构3940inode在内存中的映像 inode与文件一起存放在外存,系统运行时,把inode写入内存建立映像。内存映像定义为ext2_inode_info 结构,在include/linux/ext2_fs_i.h中定义:Inode结构41struct ext2_inode_info _u32 i_data15;/*数据块指针数组*/_u32 i_flags;/*文件标志(属性)*/_u32 i_faddr;/*片地址*/_u8 i_frag_no;/*片号*/_u8 i_frag_size;/*片大小*/_u16 i_os
14、ync;/*同步标志*/Inode结构42 _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_in
15、ode:1;/*标志,是否为新分配的inode*/;Inode结构43inode表和inode位图一个块组中所有文件的inode形成了inode表,表项序号是inode号;inode表存放在块组中所有数据块之前,在块组中要占用几个逻辑块由超级块中s_inodes_per_group给出。inode位图反映了inode表中各个表项的使用情况,每位表示inode表的一个表项,为1表示对应表项已占用,为0表示表项空闲。Inode结构44目录文件中的目录项是ext2_dir_entry结构体,前后连接成一个类似链表的形式。struct ext2_dir_entry _u32 inode;/*inode
16、号*/_u16 rec_len;/*目录项长度*/_u16 name_len;/*文件名长度*/char nameEXT2_NAME_LEN;/*文件名*/;其中:#define EXT2_NAME_LEN 255EXT2的目录结构45EXT2的目录结构46虚拟文件系统VFS 引言 VFS的工作原理 文件系统的注册 文件系统的安装 VFS超级块 VFS的inode47 引言Linux除了自己的文件系统EXT2,还支持多种其它操作系统的文件系统。Linux的虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。虚拟文件系统VFS48 VFS的工作原理虚拟文件系统VF
17、S49 注意:VFS并不是一种实际文件系统 EXT2等物理文件系统是存在于外存空间的,而VFS 仅存在于内存 VFS是在系统启动时建立,在系统关闭时消失的,物理文件系统是长期存在于外存。VFS中包含着向物理文件系统转换的一系列数据结构,如VFS超级块、VFS的inode等、各种操作函数的转换入口。虚拟文件系统VFS50文件系统注册向系统内核注册文件系统的两种方式:系统引导时在VFS中注册,在系统关闭时注销。把文件系统做为可装卸模块,安装时在VFS中注册,并在模块卸载时注销。虚拟文件系统VFS51VFS的注册链表管理文件系统注册每个注册文件系统登记在file_system_type结构体中fil
18、e_system_type结构体组成一个链表,称为注册链表链表的表头由全局变量file_system给出虚拟文件系统VFS52struct file_system_type struct super_block*(*read_super)(struct super_block*,void*,int);const char*name;int requires_dev;struct file_system_type*next;虚拟文件系统VFS53对于EXT2文件系统:static struct file_system_type ext2_fs_type=ext2_read_super,ext2,
19、1,NULL ;虚拟文件系统VFS54虚拟文件系统VFS55文件系统的安装 文件系统除在VFS中注册,还必须安装到系统中。要安装的文件系统必须已经存在于外存磁盘空间上,每个文件系统占用一个独立的磁盘分区,并且具有各自的树型层次结构。EXT2是Linux的标准文件系统,所以系统把EXT2文件系统的磁盘分区做为系统根文件系统。虚拟文件系统VFS56EXT2以外的文件系统安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝。用于安装其它文件系统的目录称为安装点或安装目录。虚拟文件系统VFS5758已安装的文件系统用一个vfsmount结构进行描述:虚拟文件系统VFS59struct vfsm
20、ount 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
21、 vfsmount*mnt_next;虚拟文件系统VFS60虚拟文件系统VFS61VFS超级块超级块是文件系统中描述整体组织和结构的信息体,在VFS中建立的超级块称为VFS超级块。VFS超级块是在文件系统安装时,由系统在内存中建立的。Linux中对于每种已安装的文件系统,在内存中都有与其对应的VFS超级块。VFS超级块中的数据来自该文件系统的超级块。虚拟文件系统VFS62VFS超级块是一个定义为super_block结构。struct super_block kdev_t s_dev;/*物理文件系统所在设备的设备号*/unsigned long s_blocksize;/*文件系统物理组织的
22、块大小,字节为单位*/unsigned char s_blocksize_bits;/*块长度值的位数*/unsigned char s_lock;/*锁定标志,若置位则拒绝其它进程对该超级块访问*/unsigned char s_rd_only;/*只读标志,若置位,则该超级块禁写*/虚拟文件系统VFS63 unsigned char s_dirt;/*修改标志,若置位表示该超级块已修改过*/struct file_system_type*s_type;/*指向文件系统file_system_type结构体*/struct super_operations*s_op;/*指向该文件系统的超级
23、块操作函数的集合*/struct dquot_operations*dq_op;/*指向该文件系统的限额操作函数的集合*/unsigned long s_flags;/*超级块标志*/unsigned long s_magic;/*署名,文件系统特有标志数*/unsigned long s_time;/*时间信息*/虚拟文件系统VFS64 struct inode*s_covered;/*指向该文件系统安装目录inode的指针*/struct inode*s_mounted;/*指向该文件系统第一个inode的指针*/struct wait_queue*s_wait;/*指向该超级块等待队列的
24、指针*/虚拟文件系统VFS65union /*联合体,其成员项是各种文件系统超级块的内存映像*/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
25、_sb;struct affs_sb_info affs_sb;struct ufs_sb_info ufs_sb;void*generic_sbp;u;虚拟文件系统VFS66VFS超级块的操作VFS要建立、撤消一些VFSinode,还要对VFS超级块进行一些必要的操作。这些操作由一系列操作函数实现。不同文件系统的组织和结构不同,完成同样功能的操作函数的代码不同,每种文件系统都有自己的操作函数。虚拟文件系统VFS67VFS接口VFS超级块中,s_op是一个指向super_operations结构的指针,super_operations中包含着一系列的操作函数指针,即操作函数的入口地址。supe
26、r_operations定义如下:虚拟文件系统VFS68struct 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
27、super_block*,struct statfs*,int);int(*remount_fs)(struct super_block*,int*,char*);虚拟文件系统VFS69 VFSinode为了区别物理文件系统的inode,VFS中的inode称为VFSinode。文件系统的inode在外存中并且长期存在的,VFS的inode在内存中,仅在需要时才建立,不再需要时撤消。文件系统的inode是静态的,而VFS的inode是动态结构。虚拟文件系统VFS70struct inode kdev_ti_dev;/*主设备号*/unsigned long i_ino;/*外存的inode号*
28、/umode_ti_mode;/*文件类型和访问权限*/nlink_ti_nlink;/*该文件的链接数*/uid_ti_uid;/*文件所有者用户标识*/gid_ti_gid;/*文件的用户组标识*/kdev_ti_rdev;/*次设备号*/off_ti_size;/*文件长度,以字节为单位*/time_t i_atime;/*文件最后一次访问时间*/虚拟文件系统VFS71time_t i_mtime;/*文件最后一次修改时间*/time_t i_ctime;/*文件创建时间*/unsigned long i_blksize;/*块尺寸,以字节为单位*/unsigned long i_blo
29、cks;/*文件的块数*/unsigned long i_version;/*文件版本号*/unsigned long i_nrpages;/*在内存中占用页面数*/struct semaphore i_sem;/*文件同步操作用信号量*/struct inode_operations*i_op;/*指向inode操作函数入口表的指针*/虚拟文件系统VFS72struct super_block*i_sb;/*指向VFS超级块*/struct wait_queue*i_wait;/*文件同步操作用等待队列struct file_lock*i_flock;/*指向文件锁定链表的指针struct
30、vm_area_struct*i_mmap;/*虚存区域*/struct page*i_pages;/*指向文件占用内存页面page结构 体链表*/struct dquot*i_dquotMAXQUOTAS;struct inode*i_next,*i_prev;/*inode链表指针*/虚拟文件系统VFS73 struct inode*i_hash_next,*i_hash_prev;/*inode hash链表指针*/struct inode*i_bound_to,*i_bound_by;struct inode*i_mount;/*指向该文件系统根目录inode的指针*/unsigned
31、 long i_count;/*使用该inode的进程计数*/unsigned short i_flags;/*该文件系统的超级块标志*/unsigned short i_writecount;/*写计数*/虚拟文件系统VFS74unsigned char i_lock;/*对该inode的锁定标志*/unsigned char i_dirt;/*该inode的修改标志*/unsigned char i_pipe;/*该inode表示管道文件*/unsigned char i_sock;/*该inode表示套接字*/unsigned char i_seek;/*未使用*/unsigned ch
32、ar i_update;/*inode更新标志*/unsigned char i_condemned;虚拟文件系统VFS75union /*各种文件系统特有的信息*/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;s
33、truct iso_inode_info isofs_i;struct nfs_inode_info nfs_i;虚拟文件系统VFS76 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;虚拟文件系统VFS77 VFSinode操作函数VFS提供的inode操作函数实质上是一个面向各种不同文件系统进行操作的转换接口。inode
34、结构体中i_op指向inode_operations结构。虚拟文件系统VFS78 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)(str
35、uct inode*,const char *,int);虚拟文件系统VFS79 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
36、*,const char*,int,int);虚拟文件系统VFS80 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(*per
37、mission)(struct inode*,int);int(*smap)(struct inode*,int);虚拟文件系统VFS81 文件管理 文件操作文件管理和操作82文件管理和操作文件管理一方面 由系统通过系统打开文件表进行统一管理,另一方面 是由进程通过私有数据结构进行管理。83文件管理和操作系统打开文件表Linux系统内核把所有进程打开的文件集中管理,组成“系统打开文件表”。系统打开文件表是一个双向链表,每个表项是一个file结构,称为文件描述符,存放着一个已打开文件的管理控制信息 进程每打开一个文件就建立一个file结构体,并把它加入到系统打开文件链表中。全局变量first_f
38、ile指向系统打开文件表的表头。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*/文件管理和操作85struct
39、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 为读和写操作
40、打开文件文件管理和操作87f_pos 记载文件中当前读写处理所在的字节位置,相当是文件内部的一个位置指针。f_inode 指向文件对应的VFSinodef_count 记载共享该file结构体的进程的数目i_count 记载共享此文件的独立进程数目f_op 指向对文件进行操作的函数指针集合file_operations结构 通过f_op对不同文件系统的文件调用不同的操作函数。文件管理和操作88进程的文件管理 一个进程打开的所有文件,由进程两个私有结构进行管理:fs_struct结构 记录着文件系统根目录和当前目录files_struct结构 包含着进程的打开文件表文件管理和操作89 struc
41、t 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 op
42、en_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
43、结构是面向文件进行操作的接口,是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