Linux系统编程23 文件系统 - UFS文件系统解析

前面聊的FAT 文件系统最怕 大文件,我们这里聊一聊 UFS文件系统,他们是同一时期的产物,FAT 是闭源,UFS是开源。

在这里插入图片描述

在这里插入图片描述

图中的inode部分 是一个inode结构体数组,我们的文件 几乎所有的信息都存放在 该文件的 inode 结构体当中

struct {
stat 结构
亚数据信息
隐藏内容
数据块指针组[15] ,15个指针

1  数据块指针
2  数据块指针
3  数据块指针
... 数据块指针
12 数据块指针

13  一级间接块指针
14  二级间接块指针
15  三级间接块指针

}

以下所有计算都是加上数据块大小是1K一块,而实际是4K 起步。

数据块指针组中的前12个指针中的每个指针都指向 图中块区域的中的某个小格子,即1K 一块,而实际的环境中都是4K起步。也就说是 如果12个数据块指针都用上了的话,能保存一个12K大小的文件,实际是48K+大小,所以如果我们的文件大小在12K(48K+)大小以内,那么这12个数据块指针就够了。

如果我们的文件大小超过了12K 的大小,那么就会动用 一级间接块指针,该指针也只想 块区域的一个 1K 大小的小格子,但是该格子中存储的不是文件数据,而是指针,假如是32位系统,一个指针的大小就是4个字节,那么该1k大小的块,就能够存储256个指针,然后每个指针又指向块区域中某个1K大小的块,用于存储文件数据。所以 一级间接块指针中的全部空间就是 256K 的大小。

如果文件大于 12K+256K, 那么就会动用 二级间接块指针, 二级间接块指针也指向块区域中1K 大小的小格子,该格子依然存放指针,可以存放256个指针,而这里的每个指针并非指直接指向 1K 的块,存放数据,而是指向 一级间接块指针指向的 1K 的地址块,也就说 二级间接块指针块 中的256个指针中的每个指针分别指向一个 一级间接块指针的 1K 地址块,即 二级间接块指针 可以保存
256*256 K 的大小

如果 二级间接块指针 加上前面的空间 依然不能满足文件的大小,那么就会动用 三级间接块指针。三级间接块指针 和 二级间接块指针类似,他的指针块中的每个指针 指向一个 二级间接块指针 块,即三级间接块指针 可以保存 256256256 大小的文件。

所以可见 UFS文件系统不怕大文件。

UFS文件系统的缺点:
很多人说 UFS文件系统 不善于或者不能管理小文件。我们每次产生一个新文件,都会分配一个新的 inode,位于inode块区域,那么就会有一种情况,当 inode inode块区域中的所有inode 都被耗尽了,但是 块区域还存在大量的空白块没有被使用,这种情况就是大量的小文件造成的,有些文件几乎不占磁盘空间,如符号链接文件等 ,但是也要分配inode。这样的话 当在使用某个文件的时候,就会在 inode区域,即inode结构体数组中查找目标inode结构体,这样查找就很耗时。

还有一种情况 inode结构体数组 大段的空白,但是数据块被耗尽,这种情况就是 大文件比较多造成的。

那么我们怎么知道 当前那个inode已经被使用了,那些inode还没有被使用。比如我touch一个新文件,系统是怎么快速的给他分配一个现在没有被使用的inode ?? 这就用到了 inode 位图。inode 区域有多少个格子,inode 位图区域就有多少个格子,他们一一对应,即可以理解为也是一个数组,该数组与inode结构体数组 数组元素个数相同, inode 位图数组中的每一项 按顺序对应一 一 inode结构体数组 中的每一项, inode 位图中用0/1代表该 inode 有没有被使用,所以寻找哪个 inode 没有被使用,就直接查找位图中的0项就可以。

同理 块位图中的格子 与 块区域中的格子是一一对应的,也是用0/1 代表对应数据块有没有被使用。所以我们的 统计磁盘使用量的命令就可以使用了,直接查 0,1 的数量就行了。

块是我们存储有效数据的数据块,为了方便计算和理解,我们假设块中的每个小格式1K 的大小,实际上每个小格子的大小都是4K起步的,这里假设是1K 是为了方便理解。

问题:文件名信息在哪儿?

我们发现上述图解中并没有文件名的信息,那么文件名在哪里?文件名存在目录文件中,目录文件是一个存放在某个文件下的一个常规文件,该文件中每一项叫目录项。目录项包含 inode信息和文件名。

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/105932257
今日推荐