20191223-第11章学习笔记
学习笔记-第11章
一、梗概
- 多年来,Linux 一直使用EXT2(Card等 1995)作为默认文件系统。EXT3(EXT3,14)是 EXT2 的扩展。EXT3 中增加的主要内容是一个日志文件,它将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的 EXT3 文件系统与 EXT2 文件系统相同。EXT3 的最新扩展是 EXT4(Cao 等 2007)。EXT4 的主要变化是磁盘块的分配。在 EXT4中,块编号为48位。EXT4不是分配不连续的磁盘块,而是分配连续的磁盘块区,称为区段。除了这些细微的更改之外,文件系统结构和文件操作保持不变。本书的目的是讲授文件系统的原理。主要目标并非实现大的文件存储容量,而是重点论述文件系统设计和实现的原则,强调简单性以及与 Linux 的兼容性。
二、知识点归纳
-
1、超级块
如果说inode块是Unix操作系统中文件的核心,那么超级块就是文件系统的心脏。启动Unix操作系统后,发现某个文件系统无法使用,很有 可能就是超级块出现了问题。为什么这个超级块有这么大的作用呢?主要是因为在超级块中保存了全局文件信息,如硬盘已用空间、数据块可用空间、inode结 点信息等等。做一个形象的比喻,这个超级块就好像是企业的资产负债表,一个文件系统中有哪些资源都记录在这个表中。
2、块组描述符
块组描述符表的起始地址位于超级块所在块的下一个块,在整个文件系统中有很多块 组描述符表的备份,备份的方式具体分为两种:
(1) 文件系统不具备稀疏超级块特性。
如果文件系统不具备稀疏超级块特性,那么在每个块组中都会有一个超级块的备份, 同时也有块组描述符表的备份。
(2) 文件系统具备稀疏超级块特性。
如果文件系统具备稀疏超级块特性,那么只在块组号是3、5、7的幂的块组(如1、3、 5、7、9、25、49等)内才对超级块和块组描述符表做备份,其他块组内则没有备份。 -
3、索引节点
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。 -
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。 -
inode包含文件的元信息,具体来说有以下内容:
1)文件的字节数
2)文件拥有者的User ID
3)文件的Group ID
4)文件的读、写、执行权限
5)文件的时间戳,共有三个:
ctime指inode上一次变动的时间
mtime指文件内容上一次变动的时间
atime指文件上一次打开的时间。
6)链接数,即有多少文件名指向这个inode
7)文件数据block的位置
可以用stat命令,查看某个文件的inode信息:
stat example.txt
i_block[15]数组包含的磁盘块指针:
- 4、文件系统结构
EXT2文件系统的主要组成结构有:inode table(inode表格)、data block(信息区块)、superblock(超级区块)、filesystem description(文件系统描述说明)、inode bitmap(inode对照表)、block bitmap(区块对照表)等。
在EXT2文件系统中,文件的权限、属性与文件的内容是分开存储的,文件的权限和属性都存储在inode中,而文件内容则存储在block中。inode和block的大小和数量都是在格式化(即文件系统创建)的时候就已经固定了的。每个inode的大小均为128bytes(ext4与xfs可以设置256bytes),每个文件仅占用一个inode,所以文件系统中能够建立的文件数量与inode的数量有关。block有1k,2k和4k三种大小,所以当文件内容的大小超出block的大小时就需要多个block来存储了。
每个inode和block都是有编号的。inode中不仅存储了文件的权限和属性,也存储了文件内容存放的所有block的编号,这样只要找到文件的inode就能根据inode中记录的block的编号一次性把所有存放该文件内容的block的数据全部读取出来了。如图:
问题来了,记录一个block编号需要4bytes的空间,如果一个文件比较大的话,需要的block的数量是比较多的,但是inode只有128bytes啊,怎么记录得了那么多的block编号呢?其实并不是所有的block编号都直接记录在inode中的,当文件占用的block数量比较多的时候,系统会拿出一些block专门来记录文件内容block的编号,然后inode只要记录这些block的编号就可以读取到文件内容block的编号了。EXT2把inode中记录blok编号的区域定义为12个直接,一个间接,一个双间接,和一个三间接记录区。如图
三、实践内容
通过mkfs创建虚拟磁盘
- Linux下的命令:
mke2fs [-b blksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。
例:
在一个名为vdisk上的虚拟磁盘文件上创建一个EXT2文件系统,有2880个大小为1KB的块。
四、问题与解决
-
1、既然block的大小有1K,2K和4K三种类型,那我们是应该选择大一点的还是小一点的好呢?
答:由于一个block只能存储一个文档的内容,一个文件不管多小,它至少都会占用一个block的空间,所以如果block的空间很大,但是系统中有很多很小的文件,那会就浪费很多的空间了。如果把block定得很小,但是系统中有很多大文件的话,那么一个文件就需要存放到很多个block中,读取文件内容的时候需要到多个block中读取,而且inode需要记录的block的编号很多,系统还需要拿出更多的block来记录文件内容block的编号,这在时间和空间上都是比较浪费的。所以,block的大小定多少合适,还是需要根据文件系统预计使用情况来决定的。
五、最有收获的内容
- 这一章我最有收获的内容是学习安装文件系统。当超级用户试图安装一个文件系统时,Linux核心首先使系统调用中的参数有效化。尽管mount程序会做一些基本的检查, 但是它并不知道核心构造时已经支持那些文件系统,同时那些建议的安装点的确存在。看如下的一个mount命令:
$ mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom
mount命令将传递三个参数给核心:文件系统名,包含文件系统的物理块设备以及此新文件系统要安装到的已存在的目录名。
虚拟文件系统首先必须做的是找到此文件系统。它将通过由链指针file_systems指向的file_system_type结 构来在所有已知文件系统中搜寻。
如果找到了一个相匹配的文件系统名,那么它就知道核心支持此文件系统并可得到读取此文件系统超块相关例程的指针。如果找不到,但文件系统使用了可动态加载核心模块,则操作仍可继续。此时核心将请求核心后台进程加载相应的文件系统模块。