关于os持久化的一些学习

硬件基础(磁盘)

几何结构

访问机制

RAID

初始化与os访问机制(文件系统与挂载)

磁盘进行格式化的方式无非就是加入一些元信息来让os实现软件式的数据交互与管理,初始化为不同的文件系统的类型有多种多样的管理方式,但是机制无非就那几种。

核心还是理解数据结构,算法的话,有多种多样的实现

文件系统的整体架构(以VSFS为例)

S:为文件系统挂载之后所需用来描述文件系统的一些核心信息,在ELF中类似于fileheader

i:inode位图,用来描述哪个inode为空

d:数据位图,用来描述哪个数据块为空

inodes:在每个inode中,实际上是所有关于文件的信息:文件类型(例如,常规文件、目录等)、大小、分配给它的块数、保护信息(如谁拥有该文件以及谁可以访问它)、一些时间信息(包括文件创建、修改或上次访问的时间文件下),以及有关其数据块驻留在磁盘上的位置的信息(如某种类型的指针)。我们将所有关于文件的信息称为元数据(metadata)。实际上,文件系统中除了纯粹的用户数据外,其他任何信息通常都称为元数据。

fs

inode机制

在每个inode中,实际上是所有关于文件的信息:文件类型(例如,常规文件、目录等)、大小、分配给它的块数、保护信息(如谁拥有该文件以及谁可以访问它)、一些时间信息(包括文件创建、修改或上次访问的时间文件下),以及有关其数据块驻留在磁盘上的位置的信息(如某种类型的指针)。我们将所有关于文件的信息称为元数据(metadata)。实际上,文件系统中除了纯粹的用户数据外,其他任何信息通常都称为元数据。

如何获取inode所在的扇区地址

blk    = (inumber * sizeof(inode_t)) / blockSize;
sector = ((blk * blockSize) + inodeStartAddr) / sectorSize;

数据位置的引用

设计inode时,最重要的决定之一是它如何引用数据块的位置。

这里学习了三种,一种为多级索引的方法,一种为基于范围的方法,基于链表的方法

多级索引主要用于解决指针数不够,以至于无法支持大文件的情形。

基于范围的方法主要是用指针加范围的形式来定位数据

基于链表的方法则是通过数据块的末尾加上指针将数据串接起来

目录存储方式

在VSFS中(像许多文件系统一样),目录的组织很简单。一个目录基本上只包含一个二元组(条目名称,inode号)的列表。对于给定目录中的每个文件或目录,目录的数据块中都有一个字符串和一个数字。对于每个字符串,可能还有一个长度(假定采用可变大小的名称)。

通常,文件系统将目录视为特殊类型的文件。因此,目录有一个inode,位于inode表中的某处(inode表中的inode标记为“目录”的类型字段,而不是“常规文件”)。该目录具有由inode指向的数据块(也可能是间接块)。这些数据块存在于我们的简单文件系统的数据块区域中。

访问过程

关于open("/foo/bar", O_RDONLY)

文件系统首先需要找到文件bar的inode,文件系统必须遍历(traverse)路径名,从而找到所需的inode。

  1. 遍历根目录(root directory),它就记为/,文件系统的第一次磁盘读取是根目录的inode,根的inode号必须是“众所周知的”。根的inode号为2。因此,要开始该过程,文件系统会读入inode号2的块(第一个inode块)。
  2. 寻找foo的条目。通过读入一个或多个目录数据块,它将找到foo的条目。一旦找到,文件系统也会找到下一个需要的foo的inode号
  3. 文件系统读取包含foo的inode及其目录数据的块,最后找到bar的inode号。在每个进程的打开文件表中,为此进程分配一个文件描述符,并将它返回给用户。

关于写入,文件已存在

每次写入操作不仅需要将数据写入磁盘,还必须首先决定将哪个块分配给文件,从而相应地更新磁盘的其他结构(例如数据位图和inode)。

  1. 首先,文件必须打开(如上所述)
  2. 一个读取数据位图(然后更新以标记新分配的块被使用),2次IO
  3. 一个写入位图(将它的新状态存入磁盘),再有两次I/O,其中一次是读取inode,另一次是写inode(为了更新块的位置)
  4. 写入真正的数据块本身
  5. 综上所用5次IO

文件创建

  1. 一个读取inode位图(查找空闲inode)
  2. 一个写入inode位图(将其标记为已分配)
  3. 一个写入新的inode本身(初始化它)
  4. 一个写入目录的数据(将文件的高级名称链接到它的inode号)
  5. 以及一个读写目录inode以便更新它。
  6. 如果目录需要增长以容纳新条目,则还需要额外的I/O(即数据位图和新目录块)。

何为挂载?

挂载即把文件系统装入到内存中,可以直接通过文件资源管理器来访问文件。