os文件系统
关于os持久化的一些学习
硬件基础(磁盘)
几何结构
访问机制
RAID
初始化与os访问机制(文件系统与挂载)
磁盘进行格式化的方式无非就是加入一些元信息来让os实现软件式的数据交互与管理,初始化为不同的文件系统的类型有多种多样的管理方式,但是机制无非就那几种。
核心还是理解数据结构,算法的话,有多种多样的实现
文件系统的整体架构(以VSFS为例)
S:为文件系统挂载之后所需用来描述文件系统的一些核心信息,在ELF中类似于fileheader
i:inode位图,用来描述哪个inode为空
d:数据位图,用来描述哪个数据块为空
inodes:在每个inode中,实际上是所有关于文件的信息:文件类型(例如,常规文件、目录等)、大小、分配给它的块数、保护信息(如谁拥有该文件以及谁可以访问它)、一些时间信息(包括文件创建、修改或上次访问的时间文件下),以及有关其数据块驻留在磁盘上的位置的信息(如某种类型的指针)。我们将所有关于文件的信息称为元数据(metadata)。实际上,文件系统中除了纯粹的用户数据外,其他任何信息通常都称为元数据。
inode机制
在每个inode中,实际上是所有关于文件的信息:文件类型(例如,常规文件、目录等)、大小、分配给它的块数、保护信息(如谁拥有该文件以及谁可以访问它)、一些时间信息(包括文件创建、修改或上次访问的时间文件下),以及有关其数据块驻留在磁盘上的位置的信息(如某种类型的指针)。我们将所有关于文件的信息称为元数据(metadata)。实际上,文件系统中除了纯粹的用户数据外,其他任何信息通常都称为元数据。
如何获取inode所在的扇区地址
blk = (inumber * sizeof(inode_t)) / blockSize; |
数据位置的引用
设计inode时,最重要的决定之一是它如何引用数据块的位置。
这里学习了三种,一种为多级索引的方法,一种为基于范围的方法,基于链表的方法
多级索引主要用于解决指针数不够,以至于无法支持大文件的情形。
基于范围的方法主要是用指针加范围的形式来定位数据
基于链表的方法则是通过数据块的末尾加上指针将数据串接起来
目录存储方式
在VSFS中(像许多文件系统一样),目录的组织很简单。一个目录基本上只包含一个二元组(条目名称,inode号)的列表。对于给定目录中的每个文件或目录,目录的数据块中都有一个字符串和一个数字。对于每个字符串,可能还有一个长度(假定采用可变大小的名称)。
通常,文件系统将目录视为特殊类型的文件。因此,目录有一个inode,位于inode表中的某处(inode表中的inode标记为“目录”的类型字段,而不是“常规文件”)。该目录具有由inode指向的数据块(也可能是间接块)。这些数据块存在于我们的简单文件系统的数据块区域中。
访问过程
关于
open("/foo/bar", O_RDONLY)
文件系统首先需要找到文件bar的inode,文件系统必须遍历(traverse)路径名,从而找到所需的inode。
- 遍历根目录(root directory),它就记为/,文件系统的第一次磁盘读取是根目录的inode,根的inode号必须是“众所周知的”。根的inode号为2。因此,要开始该过程,文件系统会读入inode号2的块(第一个inode块)。
- 寻找foo的条目。通过读入一个或多个目录数据块,它将找到foo的条目。一旦找到,文件系统也会找到下一个需要的foo的inode号
- 文件系统读取包含foo的inode及其目录数据的块,最后找到bar的inode号。在每个进程的打开文件表中,为此进程分配一个文件描述符,并将它返回给用户。
关于写入,文件已存在
每次写入操作不仅需要将数据写入磁盘,还必须首先决定将哪个块分配给文件,从而相应地更新磁盘的其他结构(例如数据位图和inode)。
- 首先,文件必须打开(如上所述)
- 一个读取数据位图(然后更新以标记新分配的块被使用),2次IO
- 一个写入位图(将它的新状态存入磁盘),再有两次I/O,其中一次是读取inode,另一次是写inode(为了更新块的位置)
- 写入真正的数据块本身
- 综上所用5次IO
文件创建
- 一个读取inode位图(查找空闲inode)
- 一个写入inode位图(将其标记为已分配)
- 一个写入新的inode本身(初始化它)
- 一个写入目录的数据(将文件的高级名称链接到它的inode号)
- 以及一个读写目录inode以便更新它。
- 如果目录需要增长以容纳新条目,则还需要额外的I/O(即数据位图和新目录块)。
何为挂载?
挂载即把文件系统装入到内存中,可以直接通过文件资源管理器来访问文件。