OS- -文件系统(四)

文章目录

  • OS- -文件系统(四)
    • 一、文件系统的管理和优化
      • 1.磁盘配额
      • 2.文件系统备份
        • 物理转储和逻辑转储
      • 3.文件系统的一致性
      • 4.文件系统性能
        • 高速缓存
        • 块提前读
        • 减少磁盘臂运动
        • 磁盘碎片整理

一、文件系统的管理和优化

1.磁盘配额

  • 为了防止一些用户占用太多的磁盘空间,多用户操作通常提供一种磁盘配额(enforcing disk quotas)的机制。
  • 系统管理员为每个用户分配最大的文件和块分配,并且操作系统确保用户不会超过 其配额
  • 在用户打开一个文件时,操作系统会找到文件属性和磁盘地址,并把它们送入内存中的打开文件表
  • 其中一个属性告诉文件所有者是谁。任何有关文件的增加都会记到所有者的配额中。
  • 第二张表包含了每个用户当前打开文件的配额记录,即使是其他人打开该文件也一样。
  • 如上图所示,该 表的内容是从被打开文件的所有者的磁盘配额文件中提取出来的。当所有文件关闭时,该记录被写回配 额文件
  • 在打开文件表中建立一新表项时,会产生一个指向所有者配额记录的指针。每次向文件中添加一个块 时,文件所有者所用数据块的总数也随之增加,并会同时增加硬限制和软限制的检查。
  • 可以超出软限 制,但硬限制不可以超出。当已达到硬限制时,再往文件中添加内容将引发错误。同样,对文件数目也 存在类似的检查。
  • 什么是硬限制和软限制?硬限制是软限制的上限。
  • 软限制是为会话或进程实际执行的限制。
  • 这允许管理员(或用户)将硬限制设置为允许它们希望允许的最大使用上限。
  • 然后,其他用户和进程可以根据需要使用软限制将其资源使用量自限制到更低的上限。
  • 当一个用户尝试登陆,系统将检查配额文件以查看用户是否超出了文件数量或磁盘块数量的软限制。
  • 如果违反了任一限制,则会显示警告,保存的警告计数减1,如果警告计数为0,表示用户多次忽略该 警告,因而将不允许该用户登录。要想再得到登录的许可,就必须与系统管理员协商
  • 如果用户在退出系统时消除所超过的部分,他们就可以再一次终端会话期间超过其软限制,但无论什么 情况下都不会超过硬限制。

2.文件系统备份

  • 文件系统的毁坏要比计算机的损坏严重很多。无论是硬件还是软件的故障,只要计算机文件系统被破坏,要恢复起来都是及其困难的,甚至是不可能的。因为文件系统无法抵御破坏,因而我们要在文件系 统在被破坏之前做好数据备份

但是备份也不是那么容易,下面我们就来探讨备份的过程。

许多人认为为文件系统做备份是不值得的,并且很浪费时间,直到有一天他们的磁盘坏了,他们才意识 到事情的严重性。相对来说,公司在这方面做的就很到位。

  • 磁带备份主要要处理好以下两个潜在问题中 的一个:
  • •从意外的灾难中恢复
  • 这个问题主要是由于外部条件的原因造成的,比如磁盘破裂,水灾火灾等。
  • •从错误的操作中恢复
  • 第二个问题通常是由于用户意外的删除了原本需要还原的文件。
  • 这种情况发生的很频繁,使得Windows的设计者们针对 删除 命令专门设计了特殊目录,这就是 回收站(recycle bin)
  • 也就是 说,在删除文件的时候,文件本身并不真正从磁盘上消失,而是被放置到这个特殊目录下,等以后需要 的时候可以还原回去。
  • 文件备份更主要是指这种情况,能够允许几天之前,几周之前的文件从原来备份 的磁盘进行还原。
  • 做文件备份很耗费时间而且也很浪费空间,这会引起下面几个问题。首先,是要备份整个文件还是仅备份一部分呢?一般来说,只是备份特定目录及其下的全部文件,而不是备份整个文件系统
  • 其次,对上次未修改过的文件再进行备份是一种浪费,因而产生了一种增量转储(incremental dumps)的思想。
  • 最简单的增量转储的形式就是周期性的做全面的备份,而每天只对增量转储完成后 发生变化的文件做单个备份。
  • 周期性:比如一周或者一个月
  • 稍微好一点的方式是只备份最近一次转储以来更改过的文件。当然,这种做法极大的缩减了转储时间,但恢复起来却更复杂,因为最近的全面转储先要全部恢复,随后按逆序进行增量转储。为了方便恢复, 人们往往使用更复杂的转储模式。
  • 第三,既然待转储的往往是海量数据,那么在将其写入磁带之前对文件进行压缩就很有必要。但是,如 果在备份过程中出现了文件损坏的情况,就会导致破坏压缩算法,从而使整个磁带无法读取。所以在备 份前是否进行文件压缩需慎重考虑
  • 第四,对正在使用的文件系统做备份是很难的。如果在转储过程中要添加,删除和修改文件和目录,则 转储结果可能不一致。
  • 因此,因为转储过程中需要花费数个小时的时间,所以有必要在晚上将系统脱机 进行备份,然而这种方式的接受程度并不高。
  • 所以,人们修改了转储算法,记下文件系统的瞬时快 照,即复制关键的数据结构,然后需要把将来对文件和目录所做的修改复制到块中,而不是到处更新他 们。
  • 磁盘转储到备份磁盘上有两种方案:物理转储和逻辑转储
  • 物理转储(physical dump)是从磁盘的0块开始,依次将所有磁盘块按照顺序写入到输出磁盘,并在复制最后一个磁盘时停止。这种程序的万无 一失性是其他程序所不具备的。
  • 第二个需要考虑的是坏块的转储。制造大型磁盘而没有瑕疵是不可能的,所以也会存在一些坏块(bad blocks)。有时进行低级格式化后,坏块会被检测出来并进行标记,这种情况的解决办法是用磁盘末尾 的一些空闲块所替换。
  • 然而,一些块在格式化后会变坏,在这种情况下操作系统可以检测到它们。通常情况下,它可以通过创 建一个由所有坏块组成的文件来解决问题,确保它们不会出现在空闲池中并且永远不会被分配
  • 那么 此文件是完全不可读的。如果磁盘控制器将所有的坏块重新映射,物理转储还是能够正常工作的。
  • Windows系统有 分页文件(paging files)和 休眠文件(hibernation files) ,它们在文件还原 时不发挥作用,同时也不应该在第一时间进行备份。

物理转储和逻辑转储

  • 物理转储的主要优点是简单、极为快速(基本上是以磁盘的速度运行),缺点是全量备份,不能跳过指定目录,也不能增量转储,也不能恢复个人文件的请求。因此句大多数情况下不会使用物理转储,而 使用逻辑转储。
  • 逻辑转储(logical dump)从一个或几个指定的目录开始,递归转储自指定日期开始后更改的文件和 目录。因此,在逻辑转储中,转储磁盘上有一系列经过仔细识别的目录和文件,这使得根据请求轻松还 原特定文件或目录。
  • 既然逻辑转储是最常用的方式,那么下面就让我们研究一下逻辑转储的通用算法。

此算法在UNIX系统 上广为使用,如下图所示:

  • 待转储的文件系统,其中方框代表目录,圆圈代表文件。黄色的项目表是自上次转储以来修改过。 每个目录和文件都被标上其inode号。
  • 此算法会转储位于修改文件或目录路径上的所有目录(也包括未修改的目录),原因有两个。
  • 第一是能 够在不同电脑的文件系统中恢复转储的文件。通过这种方式,转储和重新存储的程序能够用来在两个电 脑之间传输整个文件系统
  • 第二个原因是能够对单个文件进行增量恢复
  • 辑转储算法需要维持一个inode为索引的位图(bitmap),每个inode包含了几位。随着算法的进 行,位图中的这些位会被设置或清
  • 算法的执行分成四个阶段:
  • 第一阶段从起始目录(本例为根目 录)开始检查其中所有的目录项。对每一个修改过的文件,该算法将在位图中标记其inode。算法还会 标记并递归检查每一个目录(不管是否修改过)。
  • 在第一阶段结束时,所有修改过的文件和全部目录都在位图中标记了,如下图所示
  • 从转储磁盘上还原文件系统非常简单。一开始,需要在磁盘上创建空文件系统。然后恢复最近一次的完 整转储。
  • 由于磁带上最先出现目录,所以首先恢复目录,给出文件系统的框架(skeleton),然后恢复 文件系统本身。在完整存储之后是第一次增量存储,然后是第二次重复这一过程,以此类推
  • 尽管逻辑存储十分简单,但是也会有一些棘手的问题。首先,既然空闲块列表并不是一个文件,那么在 所有被转储的文件恢复完毕之后,就需要从零开始重新构造
  • 另外一个问题是关于链接。如果文件链接了两个或者多个目录,而文件只能还原一次,那么并且所有 指向该文件的目录都必须还原
  • 还有一个问题是,UNIX文件实际上包含了许多空洞(holes)。打开文件,写几个字节,然后找到文 件中偏移了一定距离的地址,又写入更多的字节,这么做是合法的。但两者之间的这些块并不属于文件 本身,从而也不应该在其上进行文件转储和恢复。
  • 最后,无论属于哪一个目录,特殊文件,命名管道以及类似的文件都不应该被转储。

3.文件系统的一致性

  • 影响可靠性的一个因素是文件系统的一致性。许多文件系统读取磁盘块、修改磁盘块、再把它们写回磁盘。如果系统在所有块写入之前崩溃,文件系统就会处于一种不一致(inconsistent)的状态。如果某些尚未写回的块是索引节点块,目录块或包含空闲列表的块,则此问题是很严重的
  • 为了处理文件系统一致性问题,大部分计算机都会有应用程序来检查文件系统的一致性。例如,UNIX 有fsck ; Windows有sfc ,每当引导系统时(尤其是在崩溃后),都可以运行该程序。
  • 可以进行两种一致性检查:块的一致性检查和文件的一致性检查。为了检查块的一致性,应用程序会建 立两张表,每个包含一个计数器的块,最初设置为0。第一个表中的计数器跟踪该块在文件中出现的次 数,第二张表中的计数器记录每个块在空闲列表、空闲位图中出现的频率。
  • 然后检验程序使用原始设备读取所有的inode,忽略文件的结构,只返回从零开始的所有磁盘块。从 inode开始,很容易找到文件中的块数量
  • 每当读取一个块时,该块在第一个表中的计数器+ 1,应用 程序会检查空闲块或者位图来找到没有使用的块。空闲列表中块的每次出现都会导致其在第二表中的计 数器增加。
  • 如果文件系统一致,则每一个块或者在第一个表计数器为1,或者在第二个表计数器中为1,如下图所 示:
  • 其中,磁盘块2没有出现在任何一张表中,这称为 块丢失(missing block)。
  • 尽管块丢失不会造成 实际的损害,但它的确浪费了磁盘空间,减少了磁盘容量
  • 块丢失的问题很容易解决,文件系统检验程 序把他们加到空闲表中即可。

有可能出现的另外一种情况如下所示:

  • 比如上图的磁盘块5,如果其中一个文件被删除,块5会被添加到空闲表中,导致一个块同时处于使用 和空闲的两种状态。如果删除这两个文件,那么在空闲表中这个磁盘块会出现两次。
  • 文件系统检验程序采取的处理方法是,先分配一磁盘块,把块5中的内容复制到空闲块中,然后把它插 入到其中一个文件中。这样文件的内容未改变,虽然这些内容可以肯定是不对的,但至少保证了文件的 一致性。这一错误应该报告给用户,由用户检查受检情况。
  • 除了检查每个磁盘块计数的正确性之外,文件系统还会检查目录系统。这时候会用到一张计数器表, 但这时是一个文件(而不是一个块)对应于一个计数器。程序从根目录开始检验,沿着目录树向下查 找,检查文件系统的每个目录。对每个目录中的文件,使其计数+ 1。
  • 注意,由于存在硬连接,一个文件可能出现在两个或多个目录中。而遇到符号链接是不计数的, 不会对目标文件的计数器+ 1
  • 在检验程序完成后,会得到一张由inode索引的表,说明每个文件和目录的包含关系。检验程序会将这 些数字与存储在文件inode中的链接数目做对比。
  • 如果inode节点的链接计数大户目录项个数,这时即 使所有文件从目录中删除,这个计数仍然不是0 , inode不会被删除。这种错误不严重,却因为存在不 属于任何目录的文件而浪费了磁盘空间。
  • 另一种错误则是潜在的风险。如果同一个文件链接两个目录项,但是inode链接计数只为1,如果删除 了任何一个目录项,对应inode链接计数变为0。
  • 当inode计数为0时,文件系统标志inode为 未使 用,并释放全部的块。这会导致其中一个目录指向一未使用的inode,而很有可能其块马上就被分配给 其他文件

4.文件系统性能