硬盘实际上是由一些磁性盘片组成的计算机系统的一个设备, 文件系统是对该设备的一种多层次的抽象
第一层抽象: 从磁盘到分区
一个磁盘能够存储大量数据. 可被划分成分区, 以便在一个大的实体内创建独立的区域, 每个分区都可以看作是一个独立的磁盘
第二层抽象: 从磁盘到块序列
(此处假设你了解机械硬盘的形状)为每个磁盘块分配连续的编号以一个磁盘接着一个磁盘从上到下给所有的块编号, 或者以一个磁道接着一个磁道的从外向里给所有的块编号, 一个磁盘扇区编号的系统是的我们可以把磁盘视做一系列块地组合
第三层抽象: 从块序列到三个区域的划分
文件系统可以用来存储文件内容, 文件属性(文件所有者, 日期等)和目录, 这些不同类型的数据是如何存储在被编号的磁盘块上的呢?
一部分称为数据区, 用来存放文件内容. 另一部分称为i-节点(inode table), 用来存放文件属性. 第三部分称为超级块(superblock), 用来存放文件系统本身的信息. 文件系统由这3部分组合而成, 其中任一部分都由很多有序磁盘块组成的
(1) 超级块
文件系统中的第一个块被称为超级块. 这个块存放文件系统本身的结构信息. 例如, 超级块记录了每个区域的大小. 超级块也存放未被使用的磁盘块的信息. 不同unix的超级块的内容和结构稍有不同
(2) i-节点表
文件系统的第一个块被称为i-节点表. 每个文件都有一些属性, 如大小, 文件所有者和最近修改时间等.这些性质被记录在一个称为i-节点表是这些结构的一个列表. 文件系统中的每个文件在该表中都有一个i-节点.
表中的每个i-节点都通过位置来标识. 例如, 标识为2的i-节点(inode 2)位于文件系统i-节点表中的第3个位置
(3) 数据区
文件系统的第三个部分是数据区. 文件的内容保存在这个区域, 磁盘上所有块的大小都是一样的. 如果文件包含了超过一个块的内容. 则文件内容会存放在多个磁盘块中. 一个较大的文件很容易分布在上千个独立的磁盘块中. 那么, 系统是如何跟踪这些独立的磁盘块呢?
文件系统的实现
创建一个新文件的4个主要步骤如下:
(1) 存储属性
文件的存储属性: 内核先找到一个空的i-节点, 把文件的信息记录其中
(2) 存储数据
文件内容的存储: 内核从自由块的列表中找出需要的自由块找出空闲的.
(3) 记录分配情况
内核在i-节点的磁盘分布区记录上述的块序列
(4) 添加文件名到目录
内核将入口(inode, 文件名)添加到目录文件. 文件名和i节点之间的对应关系将文件名和文件的内容及属性连接了起来.
目录的工作过程
目录是一种包含了文件名字列表的特殊文件, 不同版本的Unix目录的内部结构不同. 但是他们的抽象模型总是一致的-- 一个包含i-节点号和文件名的表
i-节点和大文件
Unix文件系统如何跟踪大文件呢?
事实1: 一个大的文件需要多个磁盘块
事实2: 在i-节点中存放有磁盘块分配列表
问题: 一个固定大小的i-节点如何存储较长的分配列表?
解决方案: 将分配列表的大部分存储在数据块, 在i-节点中存放指向那些块的指针
假设一个文件需要14个数据块存储它的内容. 因此, 分配链表包含14个块的编号. 但是, 很遗憾, 文件的i-节点只包含一个含有13个项地分配链表. 14个编号如何放在13个项? 其实很简单, 将分配链表中的前10个编号放在i-节点中, 将最后4个编号放到一个数据块中.
注意到这个文件实际上用来15个数据块. 其中14个用来存储文件的内容, 剩下的1个存放着i–节点的分配链表无法存放的那部分内容. 这个额外的块被称为间接块.
间接块饱和时如何处理?
当越来越多的字节被添加到文件, 内核将分配更多的数据块