Unix/Linux系统编程第十一章读书笔记
作者:20191322wyl
知识点总结
EXT2文件系统数据结构
多年来,Linux一直使用EXT2(Card等1995)作为默认文件系统。EXT3(EXT3,2014)是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,它将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。
通过mkfs创建虚拟磁盘
在Linux下,命令
mke2fs [-b biksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的
EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定blksize,则默
认块大小为1KB。如果未指定ninoides,mke2f将根据nblocks计算一个默认的ninodes数。
得到的EXT2文件系统可在Linux中使用。
虚拟磁盘布局
上述EXT2文件系统的布局如图所示
Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,
从磁盘引导操作系统。
超级块
Block#1:超级块(在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳整个文
件系统的信息。下文说明了超级块结构中的一些重要字段。
s_first_data_block : 0表示4KB块大小,1表示 1KB块大小。它用于确定块组描述符的起始块,即s_first_data_block +1。
s_log_block_size :确定文件块大小,为1KB(2s_log_block_size),例如:0表示1KB块大小,1表示2KB块大小,2表示4KB块大小等。最常用的块大小是用于小文件系统的1KB*和用于大文件系统的4KB.
s_mnt_count : 已挂载文件系统的次数。当挂载计数达到max_mnt_count时,fsck 会话将被迫检查文件系统的一致性。
s_magic:标识文件系统类型的幻数。EXT2/3/4文件系统的幻数是0xEF53。
块组描述符
Block#2:块组描述符块(硬盘上的s_first_data_block+1) EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。
由于一个虚拟软盘(FD)只有1440个块,B2就只包含一个块组描述符。其余的都是0。
在有大量块组的硬盘上,块组描述符可以跨越多个块。块组描述符中最重要的字段是bg_block_bitap、bg_inode_bitmap和bg_inode_table,它们分别指向块组的块位图、索引节
点位图和索引节点起始块。对于Linux格式的EXT2文件系统,保留了块3到块7。所以,
bmap=8,imap=9,inode_table=10。
块和索引节点图
Block#8: 块位图(Bmap)(bg_blockbitmap)位图是用来表示某种项的位序列,例如
磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,
1位表示对应项处于IN_USE状态。一个软盘有1440个块,但是Block#0未被文件系统使
用。所以,位图只有1439个有效位。无效位被视作INUSE,设置为1。
Block#9:索引节点位图(Imap)(bg_inode_bitmap)一个索引节点就是用来代表一个
文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用
B9的Imap中的一个位表示。在EXT2 FS中,前10个索引节点是预留的。所以,空EXT2
FS的Imap以10个1开头,然后是0。无效位再次设置为1。
索引节点
Block#10:索引(开始)节点(bginode_able)每个文件都用一个128字节(EXT4中
是256字节)的唯一索引节点结构体表示。下面列出了主要索引节点字段。
数据块
紧跟在索引节点块后面的是文件存储数据块。假设有184个索引节点,第一个实际数据
块是B33,它就是根目录/的i_block[0]。
邮差算法
C语言中的Test-Set-Clear位
该结构体将var.定义为一个32位无符号整数,具有单独的位或位范围。那么,var.bi0=0;将1赋值给第0位,则有var.bit123=5;将101赋值给第1位到第3位等。但是,生成的代码仍然依赖于邮差算法和位屏蔽来访问各个位。我们可以用邮差算法直接操作位图中的位,无须定义复杂的C语言结构体。
遍历EXT2文件系统树
EXT2文件系统的实现
文件系统的结构
基本文件系统
type.h文件
这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。
global.c文件
这类文件包含文件系统的全局变量。
实践
使用free
显示内存状态,并使用df
查看当前挂载的装置
问题与解决
问题
EXT2文件系统有什么优点
解决
1、当创建Ext2文件系统时,系统管理员可以根据预期的文件平均长度来选择最佳的块大小(从1024B——4096B)。例如,当文件的平均长度小于几千字节时,块的大小为1024B是最佳的,因为这会产生较少的内部碎片——也就是文件长度与存放块的磁盘分区有较少的不匹配。另一方面,大的块对于 大于几千字节的文件通常比较合合适,因为这样的磁盘传送较少,因而减轻了系统的开销 。
2、当创建Ext2文件系统时,系统管理员可以根据在给定大小的分区上预计存放的文件数来选择给该分区分配多少个索引节点。这可以有效地利用磁盘的空间。
3、文件系统把磁盘块分为组。每组包含存放在相邻磁道上的数据块和索引节点。正是这种结构,使得可以用较少的磁盘平均寻道时间对存放在一个单独块组中的文件并行访问。
4、在磁盘数据块被实际使用之前,文件系统就把这些块预分配给普通文件。因此当文件的大小增加时,因为物理上相邻的几个块已被保留,这就减少了文件的碎片。
5、支持快速符号链接。如果符号链接表示一个短路径名(小于或等于60个字符),就把它存放在索引节点中而不用通过由一个数据块进行转换。