Linux – EXT2文件系统详述

文件系统特性

举例来说,Windows 98 以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),Windows 2000 以后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在默认的情况下,Windows 操作系统是不会认识 Linux 的 Ext2 的。

那么文件系统是如何运行的呢?这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。

每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下:

superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;

inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;

block:实际记录文件的内容,若文件太大时,会占用多个 block 。

我们将 inode 与 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 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!

data block (数据区块)

data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录啦。 不过要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:

除此之外 Ext2 文件系统的 block 还有什么限制呢?有的!基本限制如下:

原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);

每个 block 内最多只能够放置一个文件的数据;

承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;

承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。

inode table (inode 表格)

再来讨论一下 inode 这个玩意儿吧!如前所述 inode 的内容在记录文件的属性以及该文件实际数据是放置在哪几号 block 内! 基本上,inode 记录的文件数据至少有底下这些:

该文件的存取模式(read/write/excute);

该文件的拥有者与群组(owner/group);

该文件的容量;

该文件创建或状态改变的时间(ctime);

最近一次的读取时间(atime);

最近修改的时间(mtime);

定义文件特性的旗标(flag),如 SetUID…;

该文件真正内容的指向 (pointer);

inode 的数量与大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特色呢?

每个 inode 大小均固定为 128 bytes;

每个文件都仅会占用一个 inode 而已;

承上,因此文件系统能够创建的文件数量与 inode 的数量有关;

系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。

我们约略来分析一下 inode / block 与文件大小的关系好了。inode 要记录的数据非常多,但偏偏又只有 128bytes 而已, 而 inode 记录一个 block 号码要花掉 4byte ,假设我一个文件有 400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录呢!inode 哪有这么多可记录的信息?为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。这是啥?我们将 inode 的结构画一下好了。

上图最左边为 inode 本身 (128 bytes),里面有 12 个直接指向 block 号码的对照,这 12 笔记录就能够直接取得 block 号码啦! 至于所谓的间接就是再拿一个 block 来当作记录 block 号码的记录区,如果文件太大时, 就会使用间接的 block 来记录编号。如上图 1.3.2 当中间接只是拿一个 block 来记录额外的号码而已。 同理,如果文件持续长大,那么就会利用所谓的双间接,第一个 block 仅再指出下一个记录编号的 block 在哪里, 实际记录的在第二个 block 当中。依此类推,三间接就是利用第三层 block 来记录编号!

Superblock (超级区块)

Superblock 是记录整个 filesystem 相关信息的地方, 没有 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 。

[root@www ~]# dumpe2fs [-bh] 装置文件名

选项与参数:

-b :列出保留为坏轨的部分(一般用不到吧!?)

-h :仅列出 superblock 的数据,不会列出其他的区段内容!

范例:找出我的根目录磁盘文件名,并观察文件系统的相关信息

[root@www ~]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hdc2 9920624 3822848 5585708 41% /

/dev/hdc3 4956316 141376 4559108 4% /home

/dev/hdc1 101086 11126 84741 12% /boot

tmpfs 371332 0 371332 0% /dev/shm

[root@www ~]# dumpe2fs /dev/hdc2

dumpe2fs 1.39 (29-May-2006)

Filesystem volume name: /1

Filesystem features: has_journal ext_attr resize_inode dir_index

filetype needs_recovery sparse_super large_file

Default mount options: user_xattr acl

Filesystem state: clean

Errors behavior: Continue

Filesystem OS type: Linux

Inode count: 2560864

Block count: 2560359

Free blocks: 1524760

Free inodes: 2411225

First block: 0

Block size: 4096

Filesystem created: Fri Sep 5 01:49:20 2008

Last mount time: Mon Sep 22 12:09:30 2008

Last write time: Mon Sep 22 12:09:30 2008

Last checked: Fri Sep 5 01:49:20 2008

First inode: 11

Inode size: 128

Journal inode: 8

Journal backup: inode blocks

Journal size: 128M

Group 0: (Blocks 0-32767)

Primary superblock at 0, Group descriptors at 1-1

Reserved GDT blocks at 2-626

Block bitmap at 627 (+627), Inode bitmap at 628 (+628)

Inode table at 629-1641 (+629)

0 free blocks, 32405 free inodes, 2 directories

Free blocks:

Free inodes: 12-32416

Group 1: (Blocks 32768-65535)

….(底下省略)….

# 由于数据量非常的庞大,因此将一些信息省略输出了!

# 前半部在秀出 supberblock 的内容,包括标头名称(Label)以及inode/block的相关信息

# 后面则是每个 block group 的个别信息了!您可以看到各区段数据所在的号码!

# 也就是说,基本上所有的数据还是与 block 的号码有关就是了!很重要!

目录

可以以心感悟,以此沉淀,足矣;耳听佳音,目极美好,

Linux – EXT2文件系统详述

相关文章:

你感兴趣的文章:

标签云: