日期:2014-05-16  浏览次数:20970 次

对linux档案系统以及磁盘管理的一点总结(三)

        现在开始说说每个分区内部的故事。这个时候似乎要跟操作系统扯上关系了,但有一个基本的共识:每个分区,包括主分区和逻辑分区,第一个部分都是类似于MBR的引导扇区,然后才是文件系统的元数据。但是这个引导扇区到底有多大,就要根据具体的操作系统决定了,这个问题困扰了我很长时间。windows系列似乎是只 统则是1024字节,那么就是两个扇区。可以参考一下这里: http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem_6.php

       引导扇区里面有什么不在本文讨论范围,以后会专门写文章介绍开机流程以及各种引导。引导扇区后面才是跟文件系统相关的内容。如果是linux,那么会是superblock;如果是windows,则是文件分配表(FAT)和目录区(DIR)。然后才是Data区,真正放数据的地方。

下面正式进入linux的文件系统。首先问一下大家:当你操作各种文件和文件夹的时候有没有好奇过,这些东西是如何工作的?他们的本质是什么?有没想到过,他们本身也是需要占据存储空间的,是需要建立和维护的,而不是一开始就“该存在”在电脑里的?文件系统就像今天世界各国的政府一样,一开始并不存在,而是人们为了便于管理人民(磁盘信息)而建立起来的——最重要的是,如果用着不爽可以更换的。他不是唯一的,不是天生于磁盘中的。每个文件系统都有自己的一套管理办法、机构、运行规则等等。下面隆重出场的是linux世界的新宠:ext4文件系统。

(一)像他的前辈一样,ext4管理磁盘的基本单位仍是block,而不是磁盘的基本存储单位sector。一个block的容量是sector的n倍,n是2的方幂。一般n等于2或8,这样一个block的容量就是1024或4096字节。注意,block是分配文件的最小粒度,即一个block不会同时属于两个文件。这样如果一个文件的容量即使小于一个block也会占据整个block,其余的空间就会被浪费。所以规划好block的大小很重要。block上面还有blockgroup,由n个连续的block组成的区域。这样,整个磁盘存储系统就像一只军队,军队那么多人不好管理啊,于是分成各级单位,首先是军,然后是师、旅、团、营、连、排等等。对磁盘来说,军就是各个分区,每个军(分区)有自己的一套机制(文件系统)。对于linux军来说,师就是blockgroup,旅就是block,团是sector,营是字节,连就是最小的位(bit)。所以被格式化为ext4的分区,先被划分为几个大的blockgroup,每个blockgroup下面又划分成一个个的block。


(二)下面说说每个blockgroup是如何组织和利用这些block的,需要注意各个blockgroup的情况并不相同。对于blockgroup0,第一个block叫superblock,第二个和第三个block叫Group Descriptors,后面609个block存放Reserved GDT Blocks。这三个部分相当于整只军队的司令部,里面存放了军队的整体信息。显然司令部太重要了,为了防止意外,它们会在其他的blockgroup备份,但只会在编号为3、5、7的方幂的blockgroup备份。再后面一个block存放Data Block Bitmap,接着inode Bitmap存放在下一个block中,这两个block相当于所在blockgroup的指挥部。然后是inode Table,需要若干个block。最后才是真正存放数据的地方,可以说前面的全都是军官,当兵的排在最后。可见,这些军官也占据了不少空间。就像治军一样,虽然离不了军官,但是官僚系统太过庞大的话,就没人打仗了。