第十一章学习笔记
第十一章
本章描述了EXT2文件系统在Linux中的历史地位以及EXT3/EXT4文件系统的当前状况;用编程示例展示了各种EXT2数据结构以及如何遍历EXT2文件系统树;介绍了如何实现支持Linux内核中所有文件操作的EXT2文件系统;展示了如何通过虚拟磁盘的mount root来构建基本文件系统;将文件系统的实现划分为3个级别,级别1扩展了基本文件系统,以实现文件系统树,级别2实现了文件内容的读/写操作,级别3实现了文件系统的挂载/装载和文件保护;描述了各个级别文件系统函数的算法。
一、EXT2文件系统数据结构
1. EXt2文件系统
多年来, Linux一直使用exT2作为默认文件系统。EXT3(eXT3,2014)是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,它将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新扩展是XT4。EXT4的主要变化是磁盘块的分配。=
在EXT4中,块编号为48位。EXT4不是分配不连续的磁盘块,而是分配连续的磁盘块区,称为区段。除了这些细的更改之外,文件系统结构和文件操作保持不变。本书的目的是讲授文件系统的原理。主要目标并非实现大的文件存储容量,而是重点论述文件系统设计和实现的原则,强调简单性以及与 Linux I的兼容性。
2. 在 Linux下,命令
mke2fs [-b blksize -N inodes] device blocks
在设备上创建一个带有 blocks个块和 inodes个索引节点的EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定 E blksize,则默认块大小为1KB。如果未指定 ninnies,mke2s将根据 blocks计算一个默认的 I inodes数。得到的EXT2文件系统可在 Linux中使用。
3.块组描述符
Bock#2:块组描述符块eXT2将磁盘块分成几个组。
每个组有8192个块(硬盘上的大小为32K)每组用一个块组描述符结构体来描述由于一个虚拟软盘(FD)只有1440个块,B2就只包含一个块组描述符。其余的都是0在有大量块组的硬盘上,块组描述符可以跨越多个块。
块组描述符中最重要的字段是bgblock bitmap、 bg inode bitmap和 bg inode table,它们分别指向块组的块位图、索引节点位图和索引节点起始块。
4. 索引(开始)节点
在i_mode字段中,前4位指定了文件类型,接下来三位ugs表示文件的特殊用法。最后9位是用于文件保护的rwx权限位。
i_size字段表示文件大小(以字节为单位)。各时间字段表示自1970年1月1日0时0分0秒以来经过的秒数。所以,每个时间字段都是一个非常大的无符号整数。可借助以下库函数将它们转换为日历形式:
char *ctime(&time_field)
将指针指向时间字段,然后返回一个日历形式的字符串
5.目录条目
目录包含dir_entry结构,即
6.遍历算法
-
(1)读取超级块。检查幻数 s magic(0xEF53),验证它确实是EXT2FS。
-
(2)读取块组描述符块(1+ s first data block),以访问组0描述符。从块组描述符的bg inode table条目中找到索引节点的起始块编号,并将其称为 InodesBegin Block
-
(3)读取 Inode Begin Block,获取/的索引节点,即 INODE#2。
-
(4)将路径名标记为组件字符串,假设组件数量为n。例如,如果路径名=/ab/c,则组件字符串是“a”“b"“c”,其中n=3。用nme[0],name1],…,name[n-1]来表示组件。
-
(5)从(3)中的根索引节点开始,在其数据块中搜索name[0]为简单起见,我们可以假设某个目录中的条目数量很少,因此一个目录索引节点只有12个直接数据块。有了这个假设,就可以在12个(非零)直接块中搜索nme[0].
7.文件系统的结构
(1)是当前运行进程的PROC结构体;
(2)是文件系统的根指针;
(3)是一个openTable条目;
(4)是内存索引节点;
(5)是已挂载的文件系统表。
8.索引节点
索引节点大小(128或256)用于平均分割块大小(1B或4KB),所以,每个索引节点块都包含整数个索引节点。在简单的EXT2文件系统中,索引节点的数量是184个(inux默认值)。索引节点块数等于184/8-23个。
因此,索引节点块为B10至B32。每个索引节点都有一个唯一的索引节点编号,即索引节点在索引节点块上的位置+1。注意,索引节点位置从0开始计数,而索引节点编号从1开始计数。0索引节点编号表示没有索引节点根目录的索引节点编号为2。同样,磁盘块编号也从1开始计数,因为文件系统从未使用块0。块编号0表示没有磁盘块。
9.文件系统项目的扩展
简单的EXT2文件系统使用1KB块大小,只有一个磁盘块组它可以轻松进行以下扩展。
(1)多个组:组描述符的大小为32字节对于1KB大小的块,一个块可能包含
1024/32=32组描述符。32个组的文件系统大小可以扩展为32*8=256MB
(2)4KB大小的块:对于4KB大小的块和一个组,文件系统大小应为4*8=32MB。
对于一个组描述符块,文件系统可能有128个组,可将文件系统大小扩展到128*32=4GB
对于2个组描述符块,文件系统大小为8GB等。大多数扩展都很简单,适合用于编程项目。
(3)管道文件:管道可实现为普通文件,这些文件遵循管道的读/写协议。此方案的优点是:它统一了管道和文件索引节点,并允许可被不相关进程使用的命名管道。为支持快速读/写操作,管道内容应在内存中,比如在 RAMdisk中。必要时,读者可将命名管道实现为FIFO文件。
(4)I/O缓冲:在编程项目中,每个磁盘块都是接读写的。这会产生过多的物理磁盘I/O操作。为提高效率,实际文件系统通常使用一系列I缓冲区作为磁盘块的缓存内存。文件系统的IO缓冲将会在第12章中讨论,但是可把它合并到文件系统.
### 实践内容与截图,代码链接
#### 1、查看文件操作系统
![](https://img2020.cnblogs.com/blog/2562335/202110/2562335-20211017194211512-1051224561.png)
以上示例效果中还有一个叫做buffers memory的内存区块,这个区块缓存了文件系统的部分Inode信息,这样保证了操作系统不会随时到文件系统上寻找Inode——优化文件系统的读性能。cache memory区块和buffers memory区块由操作系统自行管理,它们只会使用当前没有被应用程序占用的空闲内存。当应用程序请求新的内存区块且空闲内存不够时,操作系统会释放部分cache memory区块或者buffers memory区块。
#### 2、df、du命令学习
##### df(英文全拼:disk free)用于显示目前在Linux系统上的文件系统磁盘使用情况统计。
![](https://img2020.cnblogs.com/blog/2562335/202110/2562335-20211017194228914-1234474348.png)
第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。
使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。
用一个-i选项的df命令的输出显示inode信息而非块使用量
##### du命令 查看目录和文件容量
![](https://img2020.cnblogs.com/blog/2562335/202110/2562335-20211017194237726-2040806811.png)