inode/block特性
操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux的文件权限(rwx)与文件属性(所有者、事件参数等等)。文件系统通常会将这些数据放到不同的区块,权限与属性放置到 inode 中,实际数据则放置到 data block 区块中。另外,还有一个超级区块(superblock)会记录整个文件系统的整体信息。
每个 inode 与 block 都有编号,他们的意义简略说明如下:
- superblock:记录文件系统的整体信息,包括 inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件实际数据所在的block的号码
- block:实际记录文件的内容,若文件太大,会占用多个block
那么我们接下来就来说说 inode/block 读取文件的方式,如图所示,文件系统先格式化出 inode 与 block的区块,假设一个文件的权限和属性是放在4号(白色方块),而这个 inode 记录了文件数据的实际的放置点为2,7,13,15这4个号码,此时我们就可以一次找到这4个block的内容!
这种数据访问的方式称为索引式文件系统(indexed allocation)。至于我们常用的U盘,使用的一般是FAT格式,这种格式的文件系统没有 inode 存在,所以每个block号码都记录在前一个block当中,如图所示。
我们经常听到“碎片整理”对吧,需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的性能将会变得很差所致。这个时候可以通过碎片整理将一个文件所属的block汇合在一起,读取比较容易,一般来说,Ext2不太需要经常进行碎片整理,使用太久的话,也许需要。
Ext2文件系统(inode)
Linux的正规文件系统为Ext2(Linux second extended file system,Ext2fs)。文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用resize2fs等命令更改文件),否则 inode 与 block 固定后就不再变动。但是如果我们的文件系统高达几百GB时,把所有的 inode 和 block放在一起是很不明智的。
因此Ext2在格式化的时候基本上是区分为多个块组(block group)的,每个块组都有独立的 inode/block/superblock 系统。在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导装载程序,这样我们就能够将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的MBR。
- data block(数据块)
data block是用来放置文件内容的地方,在Ext2文件系统中所支持的 block 大小有1kB、2KB及4KB三种。在格式化时,block的大小就固定了,且每个block都有编号,以便inode记录。**由于block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。如下面表格所示:
Block大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统容量 | 2TB | 8TB | 16TB |
除此之外,Ext2文件系统的block还有哪些限制呢?
- 原则上,block的大小与数量在格式化完就不能再改变了(除非重新格式化)
- 每个block内最多只能够放置一个文件的数据
- 如果文件大于block的大小,则就会占用多个block
- 若文件小于block,则该block的剩余容量就不会被使用(磁盘空间浪费)
例题:
假设你的Ext2文件系统使用4K block,而改文件系统中有10000个小文件,每个文件的大小均为50 bytes,请问此时磁盘浪费多少容量?
由于一个block只能容纳一个文件,所以,每个block会浪费4046 bytes,所有文件仅为:50 x 10000(bytes) = 488.3KB,但浪费却达到了:4046 x 10000(bytes) = 38.6MB。所以合适的block大小很重要。
- inodetable(inode表格)
前面已经说了,inode的内容主要记录文件的属性以及该文件实际数据的位置。基本上,它记录的文件数据有下面这些:
- 该文件的访问模式(read/write/execute)
- 该文件的所有者与组(owner/group)
- 该文件的大小的各个时间(ctime/atime/mtime)
- 定义文件特性的标志(flag),如SUID等
- 该文件真正内容的指向(pointer)
- 每个inode大小固定为128 bytes
- 每个文件都仅会占用一个inode
承上,因此文件系统能创建的文件数量与inode的数量有关。系统读取文件时需要找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。下面我们来简单地分析下 inode/block 与文件大小的关系。inode 要记录的数据非常多,但是又只有128 bytes,一个block占用4 bytes。那如果我们的文件比较大,该怎么办?为此我们的系统将 inode 记录 block 号码的区域定义为 12 个直接、1 个简介、1 个双间接、1 个三间接记录区。如图所示:
以每个 block 的大小1KB为例来说,情况如下:
- 12个直接指向:12 × 1K = 12K
- 间接:256 × 1K = 256K
- 双间接:256 × 256 × 1K = 256^2^K
- 三间接:256 × 256 × 256 × 1K = 256^3^K
总额:将上面的加在一起,可得到 12 + 256 + 256^2^ + 256^3^(K) = 16GB 。我们这下也就知道了前面表格的最大单个文件限制是怎么来的了。
- Superblock(超级块)
Superblock主要是记录整个文件系统相关的地方,记录的主要信息有:
- block 与 inode 的总量未使用和已使用的 inode/block 数量及总量
- block 与 inode 的大小
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等
- 一个 validbit 数值,若此文件系统已被挂载,则valid bit为0,否则为 1
- File system Description(文件系统描述说明)
这个区段可以描述每个 block group 的开始与结束的号码,以及说明每个区段(superblock、bitmap、inodemap、data block)分别介于哪一个 block 号码之间。也能够用dumpe2fs查看。
- block bitmap(块对照表)
我们可以通过block bitmap来知道哪些block是空的,此时系统就可以快速地找到可使用的空间来放置文件。
- indoe bitmap(inode对照表)
这个和block bitmap的功能是类似,只是inode bitmap记录的是使用与未使用的号码。