文章引用自:鸟哥的 Linux 私房菜,经过部分修改
Linux 文件系统中涉及的几个基本概念
superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等
inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码
block:实际记录文件的内容,如果文件太大,会占用多个 block
inode 和 block 都有编号,找到一个文件的 inode 便可以找到存放文件的 block
这种文件系统统称为索引式文件系统
不同于索引式,FAT 文件系统使用的是类似于链表的存储系统
这种文件系统无法直接得到文件大小,并且在一个文件的 block 比较分散的时候,文件读取的性能便会降低,所以才有了“磁盘碎片整理”这一说法。
注意:实际上,如果 Linux 的文件较大,而存储文件内容的 block 比较分散,也是会产生读取性能降低的问题。这时可以将文件系统的中的文件备份,格式化文件系统,然后将文件恢复回去即可解决。
Ext2 文件系统
文件系统在一开始便已经规划好所有的 inode 和 block,除非重新格式化或改变文件系统大小
Ext2 文件系统在格式化式会分为多个 block group,每个 block group 都有自己的 superblock/inode/block。如下图
data block:
用来存放文件内容,Ext2 支持的 block 大小有 1K、2K、4K 三种。
Block 大小 | 1KB | 2KB | 4KB |
最大单个文件 | 16GB | 256GB | 2TB |
文件系统最大容量 | 2TB | 8TB | 16TB |
原则上 data blcok 的数量和大小只在格式化的时候确定
每个 data block 只能存放一个文件的内容,也可以说一个文件使用的存储空间是以 data block 为单位的
inode table:
inode 记录了存取模式(r/w/x)、owner、group、文件大小、ctime、atime、mtime、setuid、setgid、文件内容的指针。
每个 inode 大小均为 128 byte
每个文件只占用一个 inode,因此文件系统所能建立的总档案数目与 inode 数目有关,而 inode 的数目和大小在格式化时指定
由于 inode 大小有限,且文件所在的 block 的数目可能很庞大,为了使用有限的空间记录庞大的 block 号码信息,所以文件系统将 inode 记录 block 号码的区域划分为 12 个直接记录区、1 个间接记录区、1 个双间接记录区、1 个三间接记录区。(每个 data block 号码需要 4 byte 空间)
这里的间接记录区就是将一个 data block 作为记录 block 号码的记录区。
这样,在 block 大小为 1K 的文件系统中,一个 inode 可以记录的最大 data block 号码数量为:12 + 1K / 4 + 1K / 4 * 1K / 4 + 1K / 4 * 1K / 4 * 1K / 4 = 16 M,所以一个 inode 在 block 大小为 1K 的情况下可以记录的最大文件大小为 16G。
(由于 Ext2 文件系统对于大于 2K 的 block 有限制,所以以上算法并不适用于 2K 和 4K 大小的 block)
super block:
记录整个文件系统的信息:block 与 inode 的大小与总量、文件系统的挂载时间等相关信息
由于文件系统中应该只有一个 super block,实际上除了第一个 block group 必须包含 super block,而其他的 block group 中的 super block 仅仅是第一个的备份
文件系统描述(FileSystem Description):
记录每个 block group 起始与结束的 block 号码,以及说明每个区段(superblock、block bitmap、inode bitmap、data block)分别介于哪个 block 号码之间。
可使用 dumpe2fs 来查看此部分信息。
区块对照表(block bitmap):
记录每个 block 是否为空。
在创建文件时查找空 block,并更新为非空;在删除文件时将不用的 block 更新为空。
inode 对照表(inode bitmap):
类似于 block bitmap,记录每个 inode 是否在使用。
如果需要查询文件系统的信息,可以使用 dumpe2fs 命令
目录在文件系统中的存储
目录在的存储与文件相同。
当创建一个目录时,文件系统为其分配一个 inode 和至少一个 data block(所以在 block 大小为 4K 的文件系统中,大多数的目录大小为 4096),inode 中记录目录的权限、属性、data block 号码等信息,而 data block 中记录的是目录下所有文件/目录的名称以及相应的 inode 号码。
可以使用 ls -i 查看一个目录下的文件的 inode 号码
创建文件的步骤:
日志式文件系统(Journaling Filesystem)
Ext2 文件系统对于文件创建的操作是先写入 inode 再写入 block,所以如果在写入 inode 之后,创建操作中断,则会出现资料不一致状态。
系统在开机时会根据 super block 中的信息判断是否出现了资料不一致状态,可以使用 e2fsck 命令进行资料不一致状态的检查。这种检查非常费时。
为了避免出现资料不一致状态,引入了日志式文件系统
日志式文件系统引入一个日志区块,该区块记录文件创建或修改操作。
日志式文件系统创建一个文件的步骤为:
Ext3 文件系统便是日志文件系统,它为 Ext2 的升级版。