第十一章学习笔记

读书笔记

这一章学习了linux当中的文件系统EXT2。只要我们充分理解了一个文件系统,那么就可以轻松改编其他任何文件系统。本章首先描述了EXT2文件系统在Linux中的历史地位以及EXT3/EXT4文件系统的当前状况;用编程示例展示了各种EXT2数据结构以及如何遍历EXT2文件系统树;介绍了如何实现支持Linux内核中所有文件操作的EXT2文件系统;展示了如何通过虚拟磁盘的mount_root 来构建基本文件系统;将文件系统的实现划分为3个级别,级别1扩展了基本文件系统,以实现文件系统树,级别2实现了文件内容的读/写操作,级别3实现了文件系统的挂载/装载和文件保护;描述了各个级别文件系统函数的算法,并通过编程示例演示了它们的实现过程;将所有级别融合到一个编程项目中;最后,将所有编程示例和练习整合到一个完全有效的文件系统中。

知识点总结

1、Linux最传统的磁盘文件系统(filesystem)使用的是EXT2
2、硬盘组成与分割
磁盘的物理组成,整颗磁盘的组成主要有:
圆形的磁盘盘(主要记录数据的部分);
机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);
主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据
扇区(Sector)为最小的物理储存单位,每个扇区为 512 bytes;
将扇区组成一个圆,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小单位;
第一个扇区最重要,里面有:(1)主要启动区(Master boot record, MBR)及分割表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
各种接口的磁盘在Linux中的文件名分别为:
/dev/sd[a-p][1-15]:为SCSI, SATA, U盘, Flash闪盘等接口的磁盘文件名;
/dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名;
3、data block (数据区块)
data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。 由于 block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:
Block 大小 1KB 2KB 4KB
最大单一文件限制 16GB 256GB 2TB
最大文件系统总容量 2TB 8TB 16TB
原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
每个 block 内最多只能够放置一个文件的数据;
如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
4、 EXT2文件系统由以下几个部分组成:
Boot Sector:上图启动块(Boot Sector),是用来存储磁盘分区信息和启动信息,任何文件系统给都不能缺少启动块。启动块大小并不是我们前面所说的4KB,而是1KB,是由PC标准定义的。
Block Group:启动块之后才是ext2文件系统的开始。ext2文件系统将整个分区划分为大小相等的块组(Block Group),每个块组由以下部分组成:
Super Block:超级块主要有两个功能:1)超级块结构给出了文件系统的全局信息。例如块大小,文件系统的版本等等。2)超级块结构包含一些函数指针,例如super_operation的成员函数read_inode提供了读取inode信息的功能。每个具体的文件系统一般都要提供这个函数来实现对inode信息的读取,例如ext2文件系统提供的具体函数是ext2_read_inode。
GDT(Group Descriptor Table),组描述符表。由很多组描述符组成,整个分区分成多少个组就对应有多少个组描述符。每个组描述符(Group Descriptor)存储一个组的描述信息,例如在这个组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。
Block Bitmap,块位图。块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。
5、EXT2的索引节点inode
在EXT2文件系统中每个文件与目录由惟一的inode来描述。每个数据块组的EXT2 inode被保存在inode表中,同时还有一个位图被系统用来跟踪已分配和未分配的inode。
EXT2通过索引节点中的数据块指针数组进行逻辑块到物理块的映射。在EXT2索引节点中,数据块中数组共有15项,前12个为直接指针,后三个分别为“一次间接指针”、“二次间接指针”、“三次间接指针”,EXT2默认的物理块大小为1KB,块地址占4个字节,所以每个物理块可以存储256个地址。这样,文件大小最大可达12KB+256KB+64MB+16GB。但实际上,Linux是32位系统,故文件大小最大只能为4GB,及整个文件系统都被一个文件所占用。

6、EXT2文件系统的节点信息结构
与EXT2超级块类似,当磁盘上的索引节点调入内存后,除了要填写VFS的索引节点外,系统还要根据它填写另一个数据结构ext2_inode_info,其作用也是为了存储特定文件系统自己的特性。
结构ext2_inode_info分析如下:

7、EXT2文件系统的组描述符
在块组中紧跟着超级块后面的块是组描述符,在start_sect+block_size*2位置上。乘以2的原因是block_size是KByte为单位,我们用扇区访问。组描述符表每一项为组描述符,是一个叫ext2_group_desc的数据结构,供32字节。它用来描述某个块组的整体信息。
找到了组描述符,可得到很多信息,如该组块组位图的位置,该组块inode位图位置,该组块inode表的位置等。
组描述符的定义如下:

最有收获的内容

通过学习文件系统,可以从系统层面去理解文件的存储,比如要存一个hello的文件,有以下步骤:
1)内核加载块组0中的GDT,从GDT中找出inode bitmap,从inode bitmap中找出inode table中空闲的inode。
2)申请一个inode。inode主要包含两部分内容:文件属性(68Bytes),数据块指针(60Bytes)。数据块指针指向存储hello文件目录项和文件内容的Data Block。
3)将文件内容和文件的目录信息分别存在对应的Data Block中。
4)修改对应的inode Bitmap 和 Block Bitmap。
此外,可以根据给定文件路径名,利用OS找到文件的位置,比如对路径“/home/hello”,找到文件位置有以下步骤:
1)查找根目录的目录项。Linux有规定,根目录的目录项必须存放在2号inode中。
2)根目录的目录项中存着根目录下的子目录目录项和文件的数据块信息。通过根目录的目录项可以找到home对应的inode。
3)根据home对应的inode找到home的目录项。
4)在home目录项中找到hello文件的inode。
5)根据hello文件的inode中的数据块指针找到存储有hello文件内容的数据块。

问题和解决思路

1、查看文件操作系统


无论是Ext2文件系统还是Ext3文件系统又或者是Ext4文件系统,写入cache memory区块的这个过程是不会改变的。以上示例效果中还有一个叫做buffers memory的内存区块,这个区块缓存了文件系统的部分Inode信息,这样保证了操作系统不会随时到文件系统上寻找Inode——优化文件系统的读性能。cache memory区块和buffers memory区块由操作系统自行管理,它们只会使用当前没有被应用程序占用的空闲内存。当应用程序请求新的内存区块且空闲内存不够时,操作系统会释放部分cache memory区块或者buffers memory区块。后文我们讲解Linux下的Page Cache技术时,还会对这部分知识进行详细讲解。当cache memory区块写满或者到达一个等待时间后,操作系统就会正式开始向文件系统写数据了。
在Ext2文件系统中,完成文件写入的过程可以简要的进行如下描述:首先文件系统会在收到文件写入请求后根据算法寻找一个还没有使用的Inode,这个算法过程根据不同文件系统小版本和Linux内核版本的不同而有所变化,但寻找原则都是一样的,即尽可能为文件寻找连续的inode和data block。上文已经提到Ext文件系统中,每一个block group都有Block bitmap区域和Inode bitmap区域分别用于记录block group中的block和Inode的使用情况。在寻找Inode的这个步骤中,block group的Block bitmap、Inode bitmap区域还不会被写入任何变化,block group的Group description table区域也不会被写入任何变化。
Linux支持的文件操作系统
可以通过命令ls -l /lib/modules/$(uname -r)/kernel/fs来查看

2、df、du命令的学习

df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。
使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。
用一个-i选项的df命令的输出显示inode信息而非块使用量。
-h选项,通过它可以产生可读的格式df命令的输出
--total 可以显示所有的信息

du命令,查看目录和文件容量

只显示当前目录下面的子目录的目录大小和当前目录的总的大小。

posted @ 2021-10-16 17:29  爱冒险的丁丁  阅读(27)  评论(0编辑  收藏  举报