您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > EXT2的文件系统探析
EXT2的文件系统探析硬盘组成与分割首先说明一下磁盘的物理组成,整颗磁盘的组成主要有:圆形的磁盘盘(主要记录数据的部分);机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据。从上面我们知道数据储存与读取的重点在于磁盘盘,而磁盘盘上的物理组成则为(假设此磁盘为单盘片,磁盘盘图标请参考下图:扇区(Sector)为最小的物理储存单位,每个扇区为512bytes;将扇区组成一个圆,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小单位;第一个扇区最重要,里面有:(1)主要启动区(Masterbootrecord,MBR)及分割表(partitiontable),其中MBR占有446bytes,而partitiontable则占有64bytes。各种接口的磁盘在Linux中的文件名分别为:/dev/sd[a-p][1-15]:为SCSI,SATA,U盘,Flash闪盘等接口的磁盘文件名;/dev/hd[a-d][1-63]:为IDE接口的磁盘文件名;复习完物理组成后,来复习一下磁盘分区吧!所谓的磁盘分区指的是告诉操作系统『我这颗磁盘在此分割槽可以存取的区域是由A磁柱到B磁柱之间的区块』,如此一来操作系统就能够知道他可以在所指定的区块内进行文件数据的读/写/搜寻等动作了。也就是说,磁盘分区意即指定分割槽的启始与结束磁柱就是了。那么指定分割槽的磁柱范围是记录在哪里?就是第一个扇区的分割表中啦!但是因为分割表仅有64bytes而已,因此最多只能记录四笔分割槽的记录,这四笔记录我们称为主要(primary)或延伸(extended)分割槽,其中扩展分配槽还可以再分割出逻辑分割槽(logical),而能被格式化的则仅有主要分割与逻辑分割而已。最后,我们再将第三章关于分割的定义拿出来说明一下啰:主要分割与扩展分隔最多可以有四笔(硬盘的限制)扩展分配最多只能有一个(操作系统的限制)逻辑分割是由扩展分配持续切割出来的分割槽;能够被格式化后,作为数据存取的分割槽为主要分割与逻辑分割。扩展分配无法格式化;逻辑分割的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逻辑分割(5号到63号),SATA硬盘则有11个逻辑分割(5号到15号)。文件系统:我们都知道磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个分割槽。为什么需要进行『格式化』呢?这是因为每种操作系统所配置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分割槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem)』。由此我们也能够知道,每种操作系统能够使用的文件系统并不相同。举例来说,windows98以前的微软操作系统主要利用的文件系统是FAT(或FAT16),windows2000以后的版本有所谓的NTFS文件系统,至于Linux的正统文件系统则为Ext2(Linuxsecondextendedfilesystem,ext2fs)这一个。此外,在默认的情况下,windows操作系统是不会认识Linux的Ext2的。传统的磁盘与文件系统之应用中,一个分割槽就是只能够被格式化成为一个文件系统,所以我们可以说一个filesystem就是一个partition。但是由于新技术的利用,例如我们常听到的LVM与软件磁盘阵列(softwareraid),这些技术可以将一个分割槽格式化为多个文件系统(例如LVM),也能够将多个分割槽合成一个文件系统(LVM,RAID)!所以说,目前我们在格式化时已经不再说成针对partition来格式化了,通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分割槽喔!下面来了解下EXT2文件系统:系统结构:块设备:文件组织管理以物理块为单位。物理块是块设备上大小相同的存储区域(如磁盘上的扇区)。一个块究竟多大是在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024、2048或4096字节。一个文件系统一般使用块设备上一个独立的逻辑分区;文件逻辑分区中除了有表示文件内容的逻辑块(称为数据块)外,还设置了包含管理和控制信息的逻辑块。磁盘上可能有多个逻辑分区,每个分区可以使用不同的文件子系统;ext2文件系统把逻辑分区划分为块组,并且从0开始编号。每个块组包含的等量的物理块(即块组大小是相同的;物理分区最后一个块组可能小些);在块组的数据块中存储文件或目录;上图中启动块(BootBlock)的大小是确定的,就是1KB,启动块是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划成若干个同样大小的块组(BlockGroup),每个块组都由以下部分组成:超级块(SuperBlock)描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。超级块位于每个块组的最前面,每个块组包含超级块的内容是相同的(超级块在每个块组的开头都有一份拷贝);系统运行期间,把超级块复制到系统缓冲区内,只需把块组0的超级块读入内存,其它块组的超级块做为备份终极块的起始位置为其所在分区的第1024个字节,占用1KB的空间,其结构如下:structext2_super_block{__le32s_inodes_count;//文件系统中inode的总数__le32s_blocks_count;//文件系统中块的总数__le32s_r_blocks_count;//保留块的总数__le32s_free_blocks_count;//未使用的块的总数(包括保留块)__le32s_free_inodes_count;//未使用的inode的总数__le32s_first_data_block;//块ID,在小于1KB的文件系统中为0,大于1KB的文件系统中为1__le32s_log_block_size;//用以计算块的大小(1024算术左移该值即为块大小)__le32s_log_frag_size;//用以计算段大小(为正则1024算术左移该值,否则右移)__le32s_blocks_per_group;//每个块组中块的总数__le32s_frags_per_group;//每个块组中段的总数__le32s_inodes_per_group;//每个块组中inode的总数__le32s_mtime;//POSIX中定义的文件系统装载时间__le32s_wtime;//POSIX中定义的文件系统最近被写入的时间__le16s_mnt_count;//最近一次完整校验后被装载的次数__le16s_max_mnt_count;//在进行完整校验前还能被装载的次数__le16s_magic;//文件系统标志,ext2中为0xEF53__le16s_state;//文件系统的状态__le16s_errors;//文件系统发生错误时驱动程式应该执行的操作__le16s_minor_rev_level;//局部修订级别__le32s_lastcheck;//POSIX中定义的文件系统最近一次检查的时间__le32s_checkinterval;//POSIX中定义的文件系统最近检查的最大时间间隔__le32s_creator_os;//生成该文件系统的操作系统__le32s_rev_level;//修订级别__le16s_def_resuid;//报留块的默认用户ID__le16s_def_resgid;//保留块的默认组ID//仅用于使用动态inode大小的修订版(EXT2_DYNAMIC_REV)__le32s_first_ino;//标准文件的第一个可用inode的索引(非动态为11)__le16s_inode_size;//inode结构的大小(非动态为128)__le16s_block_group_nr;//保存此终极块的块组号__le32s_feature_compat;//兼容特性掩码__le32s_feature_incompat;//不兼容特性掩码__le32s_feature_ro_compat;//只读特性掩码__u8s_uuid[16];//卷ID,应尽可能使每个文件系统的格式唯一chars_volume_name[16];//卷名(只能为ISO-Latin-1字符集,以’\0’结束)chars_last_mounted[64];//最近被安装的目录__le32s_algorithm_usage_bitmap;//文件系统采用的压缩算法//仅在EXT2_COMPAT_PREALLOC标志被设置时有效__u8s_prealloc_blocks;//预分配的块数__u8s_prealloc_dir_blocks;//给目录预分配的块数__u16s_padding1;//仅在EXT3_FEATURE_COMPAT_HAS_JOURNAL标志被设置时有效,用以支持日志__u8s_journal_uuid[16];//日志终极块的卷ID__u32s_journal_inum;//日志文件的inode数目__u32s_journal_dev;//日志文件的设备数__u32s_last_orphan;//要删除的inode列表的起始位置__u32s_hash_seed[4];//HTREE散列种子__u8s_def_hash_version;//默认使用的散列函数__u8s_reserved_char_pad;__u16s_reserved_word_pad;__le32s_default_mount_opts;__le32s_first_meta_bg;//块组的第一个元块__u32s_reserved[190];};块组描述符表(GDT,GroupDescriptorTable)由很多块组描述符组成,Linux组描述符为32字节,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(GroupDescriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,具有相同内容的组描述符表放在每个块组中做为备份,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝。通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。块组描述符存放于终极块所在块的下一个块中。一个块组描述符的结构如下:structext2_group_desc{__le32bg_block_bitmap;//块位图所在的第一个块的块ID__le32bg_inode_bitmap;//inode位图所在的第一个块的块ID__le32bg_inode_table;//inode表所在的第一个块的块ID__le16bg_free_blocks_count;//块组中未使用的块数__le16bg_free_inodes_count;//块组中未使用的inode数__le16bg_used_dirs_count;//块组分配的目录的inode数__le16bg_pad;__le32bg_reserved[3];};块位图(BlockBitmap)每个块组都有一个块位图,位于组描述符表之后,用来描述本块组中数据块的使用状况,它本身占一个逻辑块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用;各位的顺序与块组中数据块顺序一致;为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的
本文标题:EXT2的文件系统探析
链接地址:https://www.777doc.com/doc-3265218 .html