Linux EXT2 文件系统详解

磁盘是用来储文件的,但是必须先把磁盘格式化为某种格式的文件系统,才能存储文件。文件系统的目的就是组织和管理磁盘中的文件。在 Linux 系统中,最长见的是 ext2 系列的文件系统。其早期版本为 ext2,后来又发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进行了增强,但是其核心设计并没有发生变化,所以我们仍是以较老的 ext2 作为演示对象。

基本结构

Ext2 文件系统在格式化的时候一般会包含多个区块群组(blockgroup)。Ext2 格式化后有点像下面这样:

Linux EXT2 文件系统详解

这是因为文件系统非常大时,如果将所有的 inode 和所有的 block 放在一起管理起来会比较麻烦。所以将文件系统分割为多个 Block Group,每个 Block Group 中都有独立的 inode/block/superblock 系统。

Block
Block 就是我们在《Linux 文件系统相关的基本概念》一文中介绍的逻辑块。对于 ext2 文件系统来说,硬盘分区首先被分割为一个一个的逻辑块(Block),每个 Block 就是实际用来存储数据的单元,大小相同,Block 按照0,1,2,3 的顺序进行编号,第一个 Block 的编号为 0。ext2 文件系统支持的 Block 的大小有 1024 字节、2048 字节和 4096 字节,Block 的大小在创建文件系统的时候可以通过参数指定,如果不指定,则会从 /etc/mke2fs.conf 文件中读取对应的值。原则上,Block 的大小与数量在格式化后就不能够发生改变了,每个 Block 内最多只会存放一个文件的数据(即不会出现两个文件的数据被放入同一个 Block 的情况),如果文件大小超过了一个 Block 的 size,则会占用多个 Block 来存放文件,如果文件小于一个 Block 的 size,则这个 Block 剩余的空间就浪费掉了。
可以使用 dumpe2fs 命令查看 Block 的大小:

$ sudo dumpe2fs /dev/sda1 | grep "Block size:"

在笔者的环境中,输出的结果如下:
Block size:              1024

注意,Ext2 文件系统的 block 主要有下面一些特点:

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

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

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

若文件小于 block,则该 block 的剩余容量就不能够再被使用了

Block Group
Block 在逻辑上被划分为多个 Block Group,每个 Block Group 包含的 Block 数量相同,具体是在 SuperBlock 中通过 s_block_per_group 属性定义的(最后一个 Block Group 除外,最后剩下的 Block 数量可能小于 s_block_per_group,这些 Block 会被划分到最后一个 Block Group 中)。dumpe2fs 命令会列出所有的 Block Group 信息,但是在统计信息中却没有说明当前的文件系统中包含有多少个 Block Group。下面是 dumpe2fs 输出的 Block Group 信息的节选:

... Group 0: (Blocks 1-8192) [ITABLE_ZEROED] Checksum 0xa22b, unused inodes 501 Primary superblock at 1, Group descriptors at 2-81 Reserved GDT blocks at 82-337 Block bitmap at 338 (+337), Inode bitmap at 354 (+353) Inode table at 370-497 (+369) 5761 free blocks, 501 free inodes, 2 directories, 501 unused inodes Free blocks: 2432-8192 Free inodes: 12-512 Group 1: (Blocks 8193-16384) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED] Checksum 0xea71, unused inodes 512 Backup superblock at 8193, Group descriptors at 8194-8273 Reserved GDT blocks at 8274-8529 Block bitmap at 339 (bg #0 + 338), Inode bitmap at 355 (bg #0 + 354) Inode table at 498-625 (bg #0 + 497) 7855 free blocks, 512 free inodes, 0 directories, 512 unused inodes Free blocks: 8530-16384 Free inodes: 513-1024 ...

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11875.html