看了cjdhb的linux第8章,有关磁盘及文件系统的章节之后,觉得有必要记录一下。
cjdhblinux第三版基础篇,使用的是centos5.x,文件系统为Ext2。这个文件系统还是很有必要学习一下的,作为linux家族一种古老和通用的文件系统,个人觉得挺不错。
首先最基本的,要了解一下磁盘的构成。
磁盘的物理组成在cjdhblinux第零章里面就介绍过, 同时第三章谈过分区的概念, 详细的内容可以查阅那两章自行复习哦!
对于Ext2文件系统来说,文件系统通常会将权限属性放置到 inode 中,而实际数据则放置到 data block 区块中。还有一个超级块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
superblock:记录文件系统的整体信息,包括inode和block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block 号码;block:实际记录档案的内容,若档案太大时,会占用多个 block 。
每个文件都会占用一个inode和多个block,inode可以理解为索引节点,同时inode中也包含文件的相关属性。所以学过操作系统原理的同学也该就明白了,对于Ext2文件系统来讲,其实就不存在所谓碎片整理一说了。这里可以将Ext2和FAT进行一个比较:
Ext2文件系统
FAT 文件系统
通过以上比较可以看出,Ext2和FAT存取方式的巨大差别。FAT 这种格式的文件系统没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读出来。它需要知道一个文件的一个物理块地址,而每个物理块中又包含后一个物理块的地址,就如第二张图所示。如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!而Ext2就不存在这个问题了。
我们说在Ext2中,每个文件都有一个inode,这个inode作为索引节点指向每一个文件存放的物理块block,而文件系统一开始就将 inode 与 block 的大小规划好了,想要更改,就要重新格式化。
此外Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。
这样分group更加便于管理
至于每一个区块群组(block group)的几个内容说明如后:
data block(数据区块)
进行文件的存放,Ext2文件系统中,block的大小可以是1KB,2KB,4KB。每个block都有自己的编号,这个编号就是inode用以进行寻找物理块的最重要的一个信息。不同block大小所影响的单个文件大小是不同的。不过若文件大小小于block大小的时候,也是会占用一个block,这就会带来空间的浪费,所以也就是平时看到的,一个文件实际大小与所需空间大小不同的原因了。
inode table (inode 表格)
存放着inode。可以这么理解,inode有多少,就能存放多少个文件(因为一个文件要占用一个inode)。基本上,inode 记录的档案数据至少有底下这些:
该档案的存取模式(read/write/excute);该档案的拥有者的群组(owner/group);该档案的容量;该档案建立或状态改变的时间(ctime);最近一次的读取时间(atime);最近修改的时间(mtime);定义档案特性的旗标(flag),如 SetUID…;该档案真正内容的指向 (pointer);
inode的数量和大小也是在格式化时就已经固定了,就Ext2来说,每一个inode大小为128B,而每个inode当中的信息的确特别多,每记录一个block编号又要占据4B,假设一个文件有 400MB ,每个 block 为 4K 时, 那至少也要十万个 block 号码的记彔!感觉明显不够用啊。这里就要提到Ext2当中比较高明的一点了,也就是操作系统概念当中的混合索引概念。
inode当中进行索引的部分,包含两种,一种直接,也就是直接记录了存储文件的block的编号,另一个是间接,以一级间接为例,也就是inode当中先指向一个block,将这个block不作为直接存储文件的块,而是通过将这个block进行延伸,用它存储文件当中其他block的编号,那么二级间接和三级间接也就是同一个原理,间接的越多,寻址的范围越广。inode当中,包含12个直接寻址单元,一个一级间接寻找单元,一个二级,一个三级。
举一个例子来说,以4KB大小的block为例,每个block编号需要4B,那每个block当中又可以寻址4KB / 4B = 1K个block,那么:
12个直接寻址——> 12*4KB = 48KB 一级间接——>1K * 4KB = 4MB二级间接——>1K * 1K * 4KB = 4GB三级间接——>1K * 1K * 1K * 4KB = 4TB
这样,一个inode就可以寻址一个48KB+4MB+4GB+4TB的文件了,这么大的单个文件容量应该足够用了吧~
由此,Ext2文件系统的基本原理就是这样,的确很高明的文件系统。更多的内容,大家可以去查阅《cjdhb的linux私房菜 基础篇》,附上共享的连接吧,http://pan.baidu.com/s/1mgsqMpE