《鸟哥的Linux私房菜》学习笔记
概述
Linux系统默认使用的文件系统为:Ext2 (Linux second extended file system, ext2fs),它是一个索引式文件系统,通过inode和block之间的对应关系来完成文件的增删改查等工作。
下面是Ext2文件系统的示意图
在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装启动管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的启动管理程序安装到个别的文件系统最前端,而不用覆盖整颗硬盘唯一的 MBR。在Ext2文件系统中操作数据基本上是按照这样的顺序进行的:
-
调取Boot Sector启动管理程序
-
调取Superblock来查看当前文件系统中的系统核心信息(包括inode、block的信息,文件系统挂载时间等)(每个Block Group有可能含有Superblock,但是一般一个文件系统只有一个Superblock,其余的Superblock只是其的备份)
-
调取Filesystem Description(文件系统描述),找到Block Group的大小、位置,以及其内部block bitmap(区域对照表)、Inode Bitmap、Inode Table等区块的相对位置
-
根据Filesystem Description中的中间信息完成对文件系统的调用
下面我们来主要看一下Block Group中的细节。
Superblock超级区块
它记录了整个Filesystem的相关信息,主要有:
-
block 与 inode 的总量
-
未使用与已使用的 inode / block 数量
-
block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes)
-
filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息
-
一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1
Filesystem Description 文件系统描述
主要用来记录当前Block Group中的起始和结束Block位置,也记录了block bitmap等中间信息的存储位置。说来也奇怪,既然有了Superblock,为什么还要又一个Filesystem Description呢?直接把相关内容放在Superblock中不就行了么?
Block Bitmap 区块对照表
标记所有Block的使用情况,正在使用/未使用
Inode Bitmap Inode对照表
标记所有Inode的使用情况,正在使用/未使用
Inode Table
Table中按照一定顺序(Filesystem Description中记录)存放Inode。这个Inode很有说法!
每个文件创建后系统为其分配一个Inode,主要记录文件的属性以及文件主体存放的Block所在的位置。
主体信息包括:
-
该文件的存取模式(read/write/excute);
-
该文件的拥有者与群组(owner/group);
-
该文件的容量;
-
该文件创建或状态改变的时间(ctime);
-
最近一次的读取时间(atime);
-
最近修改的时间(mtime);
-
定义文件特性的旗标(flag),如 SetUID...;
-
该文件真正内容的指向 (pointer);
Inode与Block的对应关系:
在系统格式化的时候Inode和Block就完成了初始化并从此固定其大小和数量。其中Inode的大小为128bytes,而Inode记录一个Block的位置就需要4bytes,所以为了满足大文件的存储需要,Ext2文件系统采取的是三级索引记录模式:
12个直接索引+1个一级间接索引+1个二级间接索引+1个三级间接索引
具体如下图所示
Ext2三级索引记录模式示意图
这样子 inode 能够指定多少个 block 呢?我们以较小的 1K block 来说明好了,可以指定的情况如下:
12 个直接指向: 12*1K=12K
由于是直接指向,所以总共可记录 12 笔记录,因此总额大小为如上所示;
间接: 256*1K=256K
每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的文件大小如上;
双间接: 256*256*1K=2562K
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;
三间接: 256*256*256*1K=2563K
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定 256 个号码,因此总额大小如上;
总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB
Data Block数据区块
用来存储文件内容。Ext2中只支持1,2,4K三种大小。

基本限制如下:
-
原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
-
每个 block 内最多只能够放置一个文件的数据;
-
承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
-
承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。