您好,欢迎访问三七文档
第5章Linux文件管理每种操作系统都有自己独特的文件系统,如MS-DOS文件系统、UNIX文件系统等。文件系统包括了文件的组织结构、处理文件的数据结构、操作文件的方法等。Linux自行设计开发的的文件系统称为EXT2。Linux还支持多种其它操作系统的文件系统,例如minix、ext2、hpfs、msdos、umsdos、iso、nfs、sysv、affs、ufs、efs等达二十几种。Linux的虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。§5.1Linux文件系统概论一.Linux文件系统的树型结构Linux文件系统采用了多级目录的树型层次结构管理文件。树型结构的最上层是根目录,用/表示。在根目录之下是各层目录和文件。在每层目录中可以包含多个文件或下一级目录。每个目录和文件都有由多个字符组成的目录名或文件名。系统在运行中通过使用命令或系统调用进入任何一层目录,这时系统所处的目录称为当前目录Linux使用两种方法来表示文件或目录的位置,绝对路径和相对路径。绝对路径是从根目录开始依次指出各层目录的名字,它们之间用”/”分隔,如/usr/include。相对路径是从当前目录开始,指定其下层各个文件及目录的方法,如系统当前目录为/usr,bin/cc。Linux的一个目录是一个驻留在磁盘上的文件,称为目录文件。系统对目录文件的处理方法与一般文件相同。目录由若干目录项组成,每个目录项对应目录中的一个文件。在一般操作系统的文件系统中,目录项由文件名和属性、位置、大小、建立或修改时间、访问权限等文件控制信息组成。Linux继承了UINX,把文件名和文件控制信息分开管理,文件控制信息单独组成一个称为i节点(inode)的结构体。inode实质上是一个由系统管理的“目录项”。每个文件对应一个inode,它们有唯一的编号,称为inode号。Linux的目录项只由两部分组成:文件名和inode号。二.文件的类型1.普通文件计算机用户和操作系统用于存放数据、程序等信息的文件。一般都长期地存放在外存储器(磁盘、磁带等)中。普通文件一般又分为文本文件和二进制文件。2.目录文件是文件系统中一个目录所包含的目录项组成的文件。目录文件只允许系统进行修改。用户进程可以读取目录文件,但不能对它们进行修改。两个特殊的目录项”·”代表目录本身,”··”表示父目录。3.设备文件用于与I/O设备提供连接的一种文件,分为字符设备文件和块设备文件,对应于字符设备和块设备。Linux把对设备的I/O做为普通文件的读取/写入操作内核提供了对设备处理和对文件处理的统一接口。每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器:/dev/fd0。4.管道文件主要用于在进程间传递数据。管道是进程间传递数据的“媒介”。某进程数据写入管道的一端,另一个进程从管道另一端读取数据。Linux对管道的操作与文件操作相同,它把管道做为文件进行处理。管道文件又称先进先出(FIFO)文件。5.链接文件又称符号链接文件,它提供了共享文件的一种方法。在链接文件中不是通过文件名实现文件共享,是通过链接文件中包含的指向文件的指针来实现对文件的访问。普通用户可以建立链接文件,并通过其指针所指向的文件。使用链接文件可以访问普通文件,还可以访问目录文件和不具有普通文件实态的其它文件。它可以在不同的文件系统之间建立链接关系,从对文件内容处理的角度,无论是哪种类型的文件,Linux都把它们看做是无结构的流式文件,即把文件的内容看做是一系列有序的字符流,三.文件的访问权限为了保证文件信息的安全,Linux设置了文件保护机制,其中之一就是给文件都设定了一定的访问权限。当文件被访问时,系统首先检验访问者的权限,只有与文件的访问权限相符时才允许对文件进行访问。Linux中的每一个文件都归某一个特定的用户所有,而且一个用户一般总是与某个用户组相关。Linux对文件的访问设定了三级权限:文件所有者,与文件所有者同组的用户,其他用户。对文件的访问主要是三种处理操作:读取、写入和执行。三级访问权限和三种处理操作形成了9种情况:§5.2EXT2文件系统Linux最初引进了Minix文件系统。Minix文件系统有较大的局限性。1992年4月推出EXT(EXTendedFilesystem)1993年推出了EXT2文件系统。EXT2已经成为Linux的标准文件系统。一.EXT2文件系统的构造文件是存储在块设备上的。在块设备中文件的组织和管理是以物理块为单位的。物理块是块设备上划分的大小相同的存储区域,如磁盘的扇区。当文件存储在块设备上时也被划分成与物理块大小相等的逻辑块。文件在存储设备中是由一系列的逻辑块序列组成的。一个文件系统一般使用块设备上的一个独立的逻辑分区。在文件的逻辑分区中除了表示文件内容的逻辑块(称为数据块)外,还设置了若干包含管理和控制信息的逻辑块。EXT2文件系统也是由逻辑块序列组成的。EXT2文件系统把所使用的逻辑分区划分成块组(BlockGroup),并从0开始依次编号。每个块组中包含若干数据块,数据块中就是目录或文件内容。块组中包含着几个用于管理和控制的信息块:超级块、组描述符表、块位图、inode位图和inode表。二.EXT2超级块(superblock)超级块是用来描述EXT2文件系统整体信息的数据结构主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。超级块对于文件系统的维护是至关重要的。超级块位于每个块组的最前面,每个块组中包含的超级块内容是相同的。在系统运行期间,需要把超级块复制到内存的系统缓冲区内。只需把块组0的超级块读入内存,其它块组的超级块做为备份。在Linux中,EXT2超级块定义为ext2_super_block结构。成员项意义s_inodes_countinode的总数量s_blocks_count块的总数量s_r_blocks_count保留块的数量s_free_blocks_count空闲块的数量s_free_inodes_count空闲inode数量s_first_data_block第一个数据块的块号s_log_block_size逻辑块长度s_log_frag_size片(fragment)长度s_blocks_per_group每个块组包含的块数s_frags_per_group每个块组包含的片(fragment)数s_inodes_per_group每个块组包含的inode数s_mtime安装时间s_wtime最后一次写入时间s_mnt_count安装计数,每安装一次其值增1s_max_mnt_count安装最大数,达到此数将显示警告信息s_magic文件系统署名,EXT2为0xEF53s_state文件系统状态s_errors出错时文件系统的动作s_minor_rev_level改版标志s_lastcheck最后一次文件系统检测时间s_checkinterval两次检测相隔的最大时间间隔s_creator_os可以使用该文件系统的操作系统的IDs_rev_level版本标志,系统以此识别是否支持某些属性s_def_resuid可以使用保留块的默认用户uids_def_resgid可以使用保留块的默认用户组gid二.内存中超级块的映像ext2_super_block结构是超级块在磁盘中的形态。在系统运行期间磁盘上的超级块要读入到内存,在内存建立一个超级块的映像。内存中的超级块映像定义为ext2_sb_info结构,在/include/linix/ext2_fs_sb.h中定义如下:structext2_sb_info{unsignedlongs_frag_size;/*fragment片的长度,以字节为单位*/unsignedlongs_frags_per_block;/*每块中fragment片数*/unsignedlongs_inodes_per_block;/*每块中inode数*/unsignedlongs_frags_per_group;/*每一块组中fragment数*/unsignedlongs_blocks_per_group;/*每一块组中块数*/unsignedlongs_inodes_per_group;/*每一块组中inode数*/unsignedlongs_itb_per_group;/*每一块组中inod表占用的块数*/unsignedlongs_db_per_group;/*每一块组中描述符占用的块数*/unsignedlongs_desc_per_block;/*一块中组描述符数*/unsignedlongs_groups_count;/*整个文件系统中的块组数*/structbuffer_head*s_sbh;/*指向内存中包含超级块的缓冲区的指针*/structext2_super_block*s_es;/*指向缓冲区中超级块的指针*/structbuffer_head**s_group_desc;/*指向缓冲区组描述符数组的指针*/structbuffer_head**s_group_desc;/*指向缓冲区组描述符数组的指针*/unsignedshorts_loaded_inode_bitmaps;/*装入缓冲区的inode位图块数*/unsignedshorts_loaded_block_bitmaps;/*装入缓冲区的块位图块数*/unsignedlongs_inode_bitmap_number[EXT2_MAX_GROUP_LOADED];/*inode位图数组*/structbuffer_head*s_inode_bitmap[EXT2_MAX_GROUP_LOADED];/*inode位图指针数组*/unsignedlongs_block_bitmap_number[EXT2_MAX_GROUP_LOADED];/*块位图数组*/structbuffer_head*s_block_bitmap[EXT2_MAX_GROUP_LOADED];/*块位图指针数组*/ints_rename_lock;/*重命名时的锁信号量*/structwait_queue*s_rename_wait;/*重命名时的等待队列指针*/unsignedlongs_mount_opt;/*安装选项*/unsignedshorts_resuid;/*可以使用保留块的用户uid*/unsignedshorts_resgid;/*可以使用保留块的用户组gid*/unsignedshorts_mount_state;/*超级用户使用的安装选项*/unsignedshorts_pad;/*填充*/ints_addr_per_block_bits;/*块地址(编号)的位(bit)数*/ints_desc_per_block_bits;/*块描述符的位(bit)数*/ints_inode_size;/*inode长度*/ints_first_ino;/*第一个inode号*/};四.组描述符组描述符表的每个表项是一个组描述符。组描述符是一个ext2_group_desc结构,用来描述一个块组的有关信息,定义在/include/linix/ext2_fs.h中:structext2_group_desc{__u32bg_block_bitmap;/*本组中块位图的位置*/__u32bg_inode_bitmap;/*本组中inode位图的位置*/__u32bg_inode_table;/*本组中inode表的位*/__u16bg_free_blocks_count;/*本组中空闲块数*/__u16bg_free_inodes_count;/*本组中空闲inode数*/__u16bg_used_dirs_count;/*本组中所含
本文标题:Linux文件管理
链接地址:https://www.777doc.com/doc-4620554 .html