一块新磁盘投入使用时,需要进行分区和格式化。磁盘的分区可以看成是一个“物理”的操作。而分区完成后还需要进行格式化,格式化就是将磁盘定义为合适的文件系统,以便操作系统可以理解。(一般情况下,一个分区是一个单独的文件系统,但也不一定。)
每个文件都有数据信息,也有文件本身的属性信息(如所有者、所属的组、创建时间、权限等)。在文件系统的设定里,数据和属性是放在不同的位置的。
一般的文件系统里都包括block(主要是存放真正的文件内容,各block有不同的编号,从0开始编号)、inode(存放文件都放在哪些个block里,同时还有权限等属性信息)、superblock(存放文件系统已用了多少、inode编号用了多少、block用了多少等信息)。
如果一个分区太大的话,一般还会将之分成不同的block group,每个group里有自己的inode/block/superblock信息(每个分区的第一个扇区都是boot sector,而一块磁盘的第一个分区放的是MBR)。
严格来说,每一个block group都包含以下6个部分:
Data Block:此部分放置的是文件的内容(而不是属性)。Linux支持每一个Block可以为1k、2k或4k的大小,可以根据自己的系统的情况在格式化的时候选择不同的block大小。每一个block都有编号。
Inode Table:此部分放置的文件的属性,包括权限、几个不同的时间、所有者、所属组、大小以及该文件所对应的block的编号。需要注意的是,每个inode大小固定为128byte,而每个文件都只会占用一个inode。系统在读取的时候,会先找到inode,分析权限,权限合适时,才会去找block中的数据。
一个文件只会占用一个inode。而一个文件根据内容的大小,可以放在一个block里或分放在多个block里。但一个block最多能放一个文件,也就是说,如果block的大小为4k,但文件才1k,那么该block会浪费3k的空间。
承上,一个inode为128byte,而inode每记录一个block号码需要用掉4byte。照这样计算,一个inode最多只能记录32个block号码,也就是说,文件最大只能是4k*32=128k,更何况这128byte里除了记录号码还要记录文件的属性信息。那么对于大文件,系统采用了将inode区域划分为权限区、12个直接记录区、一个间接记录区、一个双间接记录区和一个三间接记录区的方法来解决。
直接记录区就是直接写入的block号码。而间接记录区是记录了一个block号码,此block并没有写文件数据,而写的也是block号码(相当于从block区域‘借’来了block当作了inode)。此时,假设当前文件系统的block大小为1k,那么此1k大小的block就可以写入1k/4byte=256笔记录,即可以再对应256个block。同理,双间接,可以再对应256*256个block,三间接可以对应256*256*256个block。这样的话,使用12个直接、1个间接、1个双间接、1个三间接,对于block大小为1k的文件系统来说,就能最多表示16GB的文件了。
SuperBlock:存放的是该文件系统整体情况,包括block与inode的总量、未使用与已使用的量等。(SuperBlock可能并不是每个block group都有,可能就第一个block group才有)。
Filesystem Discription:是对整个文件系统的描述,包括每个block group的开始号码、结束号码等。
block bitmap:记录的是哪些block已使用,哪些未使用。
inode bitmap:记录的是哪些inode已使用,哪些未使用。
block bitmap和inode bitmap记录都是使用或未使用的具体编号,而superblock里记录的只是一个总量和使用率等总体概念。
inode table存放的是权限等属性,而block存放的真实的数据,这两块叫做数据存放区;而inode bitmap存放的是当前这个分区里有哪些inode还未用,block bitmap里存放的是有哪些block还未用,superblock里存放的整个分区的使用情况等,故这三个区域可以叫做数据中介区。
格式化的时候,block都是从0开始编号。并且后续对文件系统的所有描述都是根据此编号进行的。在一个block group中,假设inode tabe占用了34--44这11个block,由于每个inode是128字节,而每个block假设是4k,那么此11个block里可以存储4k/128字节=32个inode。
df命令,即disk free,是用来查看磁盘的使用情况的,也可以列出当前系统的挂载情况;dumpe2fs(dump ext2/ext3 file system的简写)可以看出当前系统的inode、block等信息。
当新建一个目录时,系统会给该目录分配一个inode,并给该目录分配一个block。inode会记录该目录的权限等属性信息,并记录inode对应的block编号。而该block里会记录该目录下的文件信息,如文件名和文件占用的inode信息。如果文件太多,而1个block盛不下的话,系统还会自动分配多个block给目录使用。
这样的话,当我们查找一个文件时,先找到所属目录的inode,然后找到目录的block,然后找到文件的inode,查看权限符合时,才去查找文件inode所记录的block编号,找到文件的block。需要注意的是,文件的inode里面并不记录文件名,文件名是在所属目录的block里记录的。
新建一个文件的时候,会自动分配一个inode,同时会根据文件的大小来给它分配block数量。
每个filesystem的顶层inode编号都是2,因此,对于Linux系统中不同的挂载点来说,当ls -id的时候,会发现这几个目录的inode编号都是2.(具体有几个挂载点,是在安装系统时进行分区时设定的)。