Skip to content

5.4 文件目录管理

Giovanna

About 4036 wordsAbout 13 min

2024-08-31

一、文件目录概述

目录通常保存的文件信息

  • 基本信息:文件名、文件类型、文件组织

  • 地址信息:卷、起始地址、使用大小、分配大小

  • 访问控制信息:所有者、访问信息、许可的行为

  • 使用信息:数据创建、创建者身份、最后一次读访问的日期、最后一次读用户的身份、最后一次修改的日期、最后一次修改者的身份、最后一次备份的日期、当前使用

不同系统保存文件目录的方式不同。有的系统将其中部分信息保存在文件头部,只将一些必要信息如文件名、文件大小、外存中的存储位置等保存在文件目录中。

对目录文件的典型操作

查找、创建文件、删除文件、显示目录、修改目录

对目录管理的要求如下

  • 实现“按名存取”。

  • 提高对目录的检索速度。

  • 文件共享。

  • 允许文件重名。

二、文件控制块和索引结点

1. FCB

  • 用于描述和控制文件的数据结构,用于记载文件在内存中的使用情况 。

  • FCB包含的内容

    • 基本信息类:文件名,文件物理位置,文件逻辑结构,文件的物理结构。
    • 存取控制信息类:权限。
    • 使用信息类:记录信息,如日期等。

典型的FCB

image.png

2. 索引结点

引入

  • 索引结点:含文件描述信息。

  • 为何引入:FCB中含文件名、描述信息,它们较占空间,当文件很多时,文件目录可能要占用大量的盘块。

  • 对该文件进行描述的信息,在检索目录时一概不用。

  • 把文件名与文件描述信息分开,在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针所构成。

image.png

磁盘索引结点

  • 文件主标识

  • 文件类型

  • 文件存取权限

  • 物理地址(表达出盘块号)

  • 文件长度

  • 连接(共享)计数

  • 存取时间

内存索引节点

文件打开后,将磁盘索引结点的内容部分或全部子集拷贝到内存,并增加以下内容。

  • 编号

  • 状态(上锁、修改)

  • 共享计数

  • 逻辑设备号

  • 链接指针:i节点的组织结构。

三、目录结构

1. 单级目录结构

  • 整个系统中,所有用户的全部文件目录保存在一张目录表中,每个文件的目录项占用一个表项。

  • 目录项中主要记载的信息有:文件名及扩展名,文件的物理地址,其它属性,如文件长度、建立日期、文件类型等。单级目录如图。

image.png

  • 优点

    • 简单且能实现目录管理的基本功能——按名存取。
  • 缺点

    • 查找速度慢
    • 不允许重名
    • 不便于实现文件共享

2. 两级目录

为每一个用户建立一个单独的用户文件目录UFD,再建立一个主文件目录MFD。在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录文件的指针。

image.png

  • 优点

    • 提高了检索目录的速度。
    • 在不同的用户目录中,可以使用相同的文件名。
    • 不同用户还可使用不同的文件名来访问系统中的同一个共享文件。

3. 多级目录结构

  • 树型目录结构

    • 主目录在这里被称为根目录,把数据文件称为树叶,其它的目录均作为树的结点。

image.png

  • 路径名

    • 从树的根(即主目录)开始,把全部目录文件名与数据文件名,依次地用“/”连接起来,即构成该数据文件的路径名(path name)。
  • 当前目录

    • 为每个进程设置一个“当前目录”,又称为“工作目录”
    • 进程对各文件的访问都相对于“当前目录”而进行,通常称为相对路径

4. 增加和删除目录

  • 增加目录

    • 在用户要创建一个新文件时,只需查看在自己的UFD及其子目录中,有无与新建文件相同的文件名。若无,便可在UFD或其某个子目录中增加一个新目录项。
  • 目录删除采用下述两种方法处理

    • 不删除非空目录
    • 可删除非空目录

四、目录查询技术

  • 过程

    • 文件名——目录项(FCB)或索引结点——盘块号——启动磁盘——驱动程序。
  • 例:/usr/ast/mbox。

    • 根中得usr的索引结点号6。
    • 6中得usr目录文件为132#。
    • 132#中得/usr/ast的索引结点是26。
    • 26中的/usr/ast目录文件中406。
    • 406#中得/usr/ast/mbox的索引结点是60。
    • 60中得/usr/ast/mbox的物理地址 。

五、FAT文件系统

在微软公司的早期MS-DOS中,所使用的是12位的FAT12文件系统,后来为16位的FAT16文件系统;在Windows95和Windows98操作系统中则升级为32位的FAT32;上述的几种文件系统所采用的文件分配方式基本上都是类似于前一节所介绍的显式链接方法。

1. FAT12

  • 以盘块为基本分配单位。

  • 在每个分区中都配有两张文件分配表FAT1和FAT2,整个系统有一张文件分配表FAT。在FAT的每个表项中存放下一个盘块号(下一个盘块的指针)。

  • 当达到文件尾的时候,存入0xFFF,标志结束。

image.png

簇的引入

  • FAT12所支持的最大磁盘容量

    • 4096×512B×4=8M(表项为12位,因此最多有4096项)。
    • 为了适应更大容量的磁盘,因而以簇为单位进行分配。
    • 簇越小磁盘浪费的空间就越小。
  • 簇一般由2n个盘块组成,与扇区的数量、磁盘容量的大小直接有关。

FAT12的问题

  • 对所允许的磁盘容量存在着严重的限制。

  • 虽然可以用继续增加簇的大小来提高所允许的最大磁盘容量,但随着支持的硬盘容量的增加,相应的簇内碎片也将随之成倍地增加。

2. FAT16

为了解决FAT12的上述问题,因而引进了FAT16。

FAT表的宽度增至16位,最大表项数将增至65536个,此时便能将一个磁盘分区分为65536(2的16次方)个簇。可以管理的最大分区空间为216×64×512B=2048MB。

FAT16存在的问题

当磁盘容量迅速增加时,如果再继续使用FAT16,由此所形成的簇内碎片所造成的浪费也越大。(簇越大,一般磁盘的碎片就越多)。

文件分配表举例

image.png

  • 每个文件的目录项中都给出了它在卷上的首簇号。
  • 每个已分配簇包含指向文件的下一个簇的簇编号。

3. FAT32

FAT32可以更好的适应容量更大的磁盘。

每一簇在FAT表中的表项占据4字节,FAT表可以表示4294967296项(2的32次方),即FAT32允许管理比FAT16更多的簇。

允许在FAT32中采用较小的簇,FAT32的每个簇都固定为4KB,即每簇用8个盘块代替FAT16的64个盘块,每个盘块仍为512字节,FAT32分区格式可以管理的单个最大磁盘空间大到4KB×232=16TB。

注意

计算得到的16TB是理论上支持,受操作系统中其他条件的限制,实际支持的最大空间是2TB。

按照FAT32上数据的不同特点和作用可以把硬盘分为5个部分

  • MBR区

  • DBR区(操作系统引导记录区)

  • FAT区

  • FDT区

  • DATA区

FAT32文件系统逻辑空间可以分为三部分:

  • 引导区

  • 文件分配表区(FAT区)

  • 数据区(DATA区)。

MBR

(MBR)主引导记录及硬盘分区表等占用硬盘0柱面、0 磁道、1扇区。总共512B,MBR占用了446B,主要包括:

  • 引导系统启动的程序代码

  • 硬盘的分区数据

  • 主引导扇区的有效标志

image.png

DBR

上图所示,第一个保留扇区512字节就是操作系统引导记录区DBR,由跳转指令、厂商标志和操作系统版本号、基本输入输出参数块BPB(BIOS Parameter Block)、扩展BPB、OS引导程序和结束标志几部分组成。

image.png

FAT

在DBR之后的是FAT区,FAT表是分区信息的映射表,指示簇是如何存储的。在FAT文件系统中,包含有两份完全一样的文件分配表。

FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。

格式化FAT分区时,格式化程序根据分区的大小确定簇的大小,然后根据保留扇区的数目、根目录的扇区数目、数据区可分的簇数与FAT表本身所占空间来确定FAT表所需的扇区数目,然后将计算后的结果写入DBR的相关位置。

FAT32保留扇区的数目默认为32个而不是FAT16的1个。

FAT32的根目录等同于普通的文件。根目录储在分区内可寻址的任意簇内,不过通常根目录是最早建立的。

image.png

FDT

根目录下的所有文件及其子目录在根目录的文件目录表FDT中都有一个“目录项”,系统以32个字节为单位进行目录文件所占簇的分配,因此32个扇区的根目录FDT最多可以记录32*512/32=512个文件或子目录。

DATA

DATA区是实际的文件和目录数据存储的区域,它占据了分区的绝大部分。

每个簇只能被一个文件占有,因而常常文件的尾部会出现不可利用的空间,所以簇越大,文件数目越多时,零头就越多,造成资源浪费,因此簇的大小不应该太大。

FAT32采用4KB的簇的大小。

也不能采用太小的单位进行分配。如采用大小为512B的扇区管理会增加FAT表的项数,对大文件存取增加消耗,文件系统效率不高。

4. 文件系统格式化

格式化程序并没有把DATA区的数据清除,只是重写了FAT表而已,至于分区硬盘,也只是修改了MBR和DBR,绝大部分的DATA区的数据并没有被改变。因而进行上述操作后,数据仍然可以得到恢复。

六、NTFS

1. NTFS的新特征

  • 它使用了64位磁盘地址。

  • 很好地支持长文件名。

  • 具有系统容错功能。

  • 提供了数据的一致性。

2. 磁盘组织

  • 以簇作为磁盘空间分配和回收的基本单位。

    • 卷上簇的大小称为“卷因子” (一个簇包含2n个盘块)。
  • 对于簇的定位,采用逻辑簇号LCN和虚拟簇号VCN进行的。

3. 文件的组织

在NTFS中,以卷为单位,将一个卷中的所有文件信息、目录信息以及可用的未分配空间信息,都以文件记录的方式记录在一张主控文件表MFT中。

卷中的每个文件作为一条记录,在MFT表中占有一行,其中还包括MFT自己的这一行。每行大小固定为1KB,每行称为该行所对应文件的元数据(metadata),也称为文件控制字。

NTFS文件不能被FAT等文件系统所存取,缺乏兼容性。

文件通过主文件表(MFT)来确定其在磁盘上的存储位置。主文件表是一个对应的数据库,由一系列的文件记录组成--卷中每一个文件都有一个文件记录(对于大型文件还可能有多个记录与之相对应)。

NTFS卷上的每个文件都有一个64位(bit)称为文件引用号(File Reference Number,也称文件索引号)的唯一标识。文件引用号由两部分组成:一是文件号,二是文件顺序号。

NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来进行簇的定位。LCN是对整个卷中所有的簇从头到尾所进行的简单编号。VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。VCN可以映射成LCN,而不必要求在物理上连续。

4. NTFS文件系统结构

  • 启动扇区文件$BOOT位于磁盘头部,$BOOT中包含MFT的位置数据。

  • 主文件表索引的第一个文件为$MFT。主文件的每一个表项表示一个文件索引,每个文件索引由一系列的属性组成。

image.png

image.png

5. NTFS元文件

image.png

MFT中的第1个记录就是MFT自身。

由于MFT文件本身的重要性,为了确保文件系统结构的可靠性,系统专门为它准备了一个镜像文件($MftMirr),也就是MFT中的第2个记录。

第3个记录是日志文件($LogFile)。该文件是NTFS为实现可恢复性和安全性而设计的。当系统运行时NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,例如复制,从而在系统失败时能够恢复NTFS卷。

第4个记录是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一个标明该磁盘是否损坏的标志位。

第5个记录是属性定义表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。

第6个记录是根目录,其中保存了存放于该卷根目录下所有文件和目录的索引。在访问了一个文件后, NTFS就保留该文件的MFT引用,第二次就能够直接进行对该文件的访问。

第7个记录是位图文件($Bitmap)。NTFS卷的分配状态都存放在位图文件中,其中每一位(bit)代表卷中的一簇,标识该簇是空闲的还是已被分配了的,由于该文件可以很容易的被扩大,所以NTFS的卷可以很方便的动态的扩大,而FAT格式的文件系统由于涉及到FAT表的变化,所以不能随意的对分区大小进行调整。

第8个记录是引导文件($Boot),它是另一个重要的系统文件。

第9个记录是坏簇文件($BadClus),它记录了磁盘上该卷中所有的损坏的簇号,防止系统对其进行分配使用。

第10个记录是安全文件($Secure),它存储了整个卷的安全描述符数据库。NTFS文件和目录都有各自的安全描述符,为了节省空间,NTFS将具有相同描述符的文件和目录存放在一个公共文件中。

第11个记录为大写文件($UpCase,upper case file),该文件包含一个大小写字符转换表。

第12个记录是扩展元数据目录($Extended metadata directory)。

第13个记录是重解析点文件($Extend$Reparse)。

MFT的前16个元数据文件非常重要,为了防止数据的丢失,NTFS系统在该卷文件存储部分的正中央对它们进行了备份。

image.png