1 文件系统特性
Linux 的正统文件系统为 Ext2。
文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括inode 与block 的总量、使用量、剩余量等。
- superblock:记录此filesystem 的整体信息,包括inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个block 。
文件系统先格式化出inode 与block的区块,假设某一个文件的属性与权限数据是放置到inode 4 号(下图较小方格内),而这个inode 记录了文件数据的实际放置点为2, 7, 13, 15 这四个block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个block 内容读出来。这种数据存取的方法我们称为索引式文件系统(indexed allocation)。

随身碟使用的文件系统一般为FAT 格式。FAT 这种格式的文件系统并没有inode 存在,所以FAT 没有办法将这个文件的所有block 在一开始就读取出来。每个block 号码都记录在前一个block 当中,他的读取方式有点像底下这样:

上图中我们假设文件的数据依序写入1->7->4->15 号这四个block 号码中, 但这个文件系统没有办法一口气就知道四个block 的号码,他得要一个一个的将block 读出后,才会知道下一个block 在何处。如果同一个文件数据写入的block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!
碎片整理:
FAT文件系统需要碎片整理的原因就是文件写入的block 太过于离散了,此时文件读取的效能将会变的很差所致。这个时候可以透过碎片整理将同一个文件所属的blocks 汇整在一起,这样数据的读取会比较容易。
由于 Ext2 是索引式文件系统,基本上不太需要常常进行碎片整理的。
2 Linux的Ext2文件系统(inode)
文件系统一开始就将inode 与block 规划好了,除非重新格式化(或者利用resize2fs 等指令变更文件系统大小),否则inode 与block 固定后就不再变动。
Ext2 文件系统在格式化的时候基本上是区分为多个区块群组(block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。整个来说,Ext2 格式化后有点像底下这样:

在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的MBR, 这样也才能够制作出多重引导的环境。
2.1 data block (资料区块)
data block 是用来放置文件内容数据地方,在Ext2 文件系统中所支持的block 大小有1K, 2K 及4K 三种。因为 block 大小而产生的Ext2 文件系统限制如下:

block基本限制:
- 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
- 每个block 内最多只能够放置一个文件的数据;
- 承上,如果文件大于block 的大小,则一个文件会占用多个block 数量;
- 承上,若文件小于block ,则该block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
2.2 inode table (inode 表格)
inode 的内容在记录文件的属性以及该文件实际数据是放置在哪几号block 内! 基本上,inode 记录的文件数据至少有底下这些:
- 该文件的存取模式(read/write/excute);
- 该文件的拥有者与群组(owner/group);
- 该文件的容量;
- 该文件建立或状态改变的时间(ctime);
- 最近一次的读取时间(atime);
- 最近修改的时间(mtime);
- 定义文件特性的旗标(flag),如SetUID…;
- 该文件真正内容的指向(pointer)
inode 的数量与大小也是在格式化时就已经固定了,除此之外inode 还有些什么特色呢?
- 每个inode 大小均固定为128 bytes (新的ext4 与xfs 可设定到256 bytes);
- 每个文件都仅会占用一个inode 而已;
- 承上,因此文件系统能够建立的文件数量与inode 的数量有关;
- 系统读取文件时需要先找到inode,并分析inode 所记录的权限与用户是否符合,若符合才能够开始实际读取block 的内容。
系统将inode 记录block 号码的区域定义为12 个直接,一个间接,一个双间接与一个三间接记录区。inode 结构如下:

上图最左边为 inode 本身(128 bytes),里面有12 个直接指向block 号码的对照,这12 笔记录就能够直接取得block 号码。至于所谓的间接就是再拿一个block来当作记录block号码的记录区,如果文件太大时, 就会使用间接的 block 来记录编号。
这样子inode 能够指定多少个block 呢?我们以较小的1K block 来说明好了,可以指定的情况如下:
- 12 个直接指向: 12*1K=12K
由于是直接指向,所以总共可记录12 笔记录,因此总额大小为如上所示; - 间接: 256*1K=256K
每笔 block 号码的记录会花去4bytes,因此1K 的大小能够记录256 笔记录,因此一个间接可以记录的
文件大小如上; - 双间接: 2562561K=2562K
第一层 block 会指定256 个第二层,每个第二层可以指定256 个号码,因此总额大小如上; - 三间接: 256256256*1K=2563K
第一层 block 会指定256 个第二层,每个第二层可以指定256 个第三层,每个第三层可以指定256 个号码,因此总额大小如上;
此时我们知道当文件系统将 block 格式化为1K 大小时,能够容纳的最大文件为16GB,比较一下文件系统限制表的结果可发现是一致的!但这个方法不能用在2K 及4K block 大小的计算中, 因为大于2K 的block 将会受到Ext2 文件系统本身的限制,所以计算的结果会不太符合之故。
2.3 Superblock (超级区块)
Superblock 是记录整个filesystem 相关信息的地方, 没有 Superblock ,就没有这个filesystem 了。他记录的信息主要有:
- block 与inode 的总量;
- 未使用与已使用的inode / block 数量;
- block 与inode 的大小(block 为1, 2, 4K,inode 为128bytes 或256bytes);
- filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck) 的时间等文件系统的相关信息;
- 一个valid bit 数值,若此文件系统已被挂载,则valid bit 为0,若未被挂载,则valid bit 为1 。
一般来说,superblock 的大小为1024bytes。
此外,每个 block group 都可能含有superblock ,但是我们也说一个文件系统应该仅有一个superblock 而已,那是怎么回事啊? 事实上除了第一个 block group 内会含有superblock 之外,后续的block group 不一定含有superblock , 而若含有 superblock 则该superblock 主要是做为第一个block group 内superblock 的备份,这样可以进行superblock 的救援!
2.4 Filesystem Description (文件系统描述说明)
这个区段可以描述每个 block group 的开始与结束的block 号码,以及说明每个区段(superblock,bitmap, inodemap, data block) 分别介于哪一个block 号码之间。
2.5 block bitmap (区块对照表)
如果想要新增文件时,就会选择空的block,透过block bitmap 的
辅助,从block bitmap 当中可以知道哪些block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件。
2.6 inode bitmap (inode 对照表)
这个其实与 block bitmap 是类似的功能,只是block bitmap 记录的是使用与未使用的block 号码,至于 inode bitmap 则是记录使用与未使用的inode 号码。
2.7 dumpe2fs:查询 Ext 家族superblock 信息的指令
dumpe2fs [-bh] 装置文件名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出 superblock 的数据,不会列出其他的区段内容!
本文是关于Linux中Ext2文件系统的学习笔记,探讨了文件系统特性,详细介绍了inode、data block、superblock等核心概念,以及Ext2的组织结构和优势。文件系统通过inode记录文件属性和数据位置,避免了FAT格式的碎片问题,适用于Linux环境。
1702

被折叠的 条评论
为什么被折叠?



