文件系统的基本概念
文件系统的基本要求
- 必须能够存储大量的信息。
- 在使用信息的进程终止时,信息必须保存下来。
- 多个进程可以并发地存取信息。
文件
文件命名
文件是一个抽象机制,它提供了一种把信息保存在磁盘上而且便于以后读取的方法。它必须这样来实现,使用户不必了解信息存储的方法、位置以及磁盘实际运作方式等细节。
文件结构
- 文件是一个无结构字节序列,Unix采用这种方式
- 文件是一个固定长度记录的序列,每条记录都有内部结构
- 文件由一棵记录树构成,每条记录长度不等。在记录的固定位置包含一个关键字域。记录树按关键字域进行排序,这便于对特定关键字进行快速查找。
文件类型
- 常规文件(regular file)中包含有用户信息。
- 是ASCII文件或者二进制文件。
- ASCII文件由多行文本组成。
- ASCII文件的最大优点是可以原样地显示和打印,也可以用通常的文本编辑器进行编辑。
- 二进制文件,无法直接查看,但对于使用它的程序而言,其具有一定的内部结构。
- 目录(directory)是管理文件系统结构的系统文件。
- 字符设备文件(character special file)和输入/输出有关,用于处理串行I/O设备。
- 块设备文件(block special file)则用于处理磁盘。
文件访问
- 顺序访问(sequential access)
- 进程可以从文件开始处顺序读取文件中所有字节或者记录,但不能够略过某些内容,也不能够非顺序读取。
- 顺序存取文件可以重绕,只要需要,可以多次读取该文件。
- 主要用于磁带
- 随机访问(random access)
- 可以非顺序地读取文件中的字节或记录,或者根据关键字而不是位置来存取记录
- 主要用于磁盘
文件属性
每个文件除了文件名和数据本身之外,操作系统还给文件赋以其他信息,比如,文件创建日期、文件长度等等。
目录
为了记录文件,文件系统通常需要用到目录,在许多系统中,目录本身也是文件。
- 一个目录通常包含多个目录项,每个目录项代表一个文件
- 目录项包含了文件名字、属性和文件数据存储地址等信息
- 目录项仅包含文件名字、以及一个指向另一个数据结构的指针
目录系统
- 每个系统的目录数目各不相同,最简单的设计方案是维护一个单独的目录,其中包含所有用户的全部文件
- 对于整个系统中使用单独一个目录管理所有文件的想法的改进是,每个用户拥有一个目录
- 这种设计消除了不同用户之间的文件名冲突,但仍然难以使那些有许多文件的用户感到满意(需要子目录)。
- 更进一步,需要的是一般的层次结构(即目录树)。
- 使用层次结构,每个用户可以拥有所需的多个目录,以便自然地组织他们的文件。
路径名
- 使用目录树来组织文件系统时,需要相应的方法指定文件名
- 每个文件都赋予一个绝对路径名(absolute path name),它由从根目录到文件的路径组成。
- 另一种文件名是相对路径名(relative path name)。它常和工作目录(也称作当前目录)的概念一起使用。用户可以指定一个目录作为当前的工作目录。这时,所有的路径名,如果不是从根目录开始,都是相对于工作目录的。
文件系统实现
文件系统布局
- 主引导记录(MBR):磁盘的扇区0,用于启动计算机。
- 在MBR未尾有一个分区表,里面记录了每个分区的起始地址和结束地址,其中有一个活动分区。
- 机器启动后,BIOS读入并执行MBR中的代码。
- MBR程序确定活动分区,并读入它的第一个磁盘块,即引导块,然后执行之。
- 引导块把保存在该分区中的操作系统装入内存并运行。
- 在类UNIX中,文件系统由超级块管理,它包含了关于文件系统的所有关键参数,当文件系统第一次被加载时,超级块的内容被装入内存。其后,是空闲空间管理,记录文件系统中的空闲物理块信息。之后是索引节点,每个索引节点对应于一个文件,记录了文件的属性信息及在磁盘上的存储地址。
文件实现
连续分配法
- 把每个文件作为连续数据块存储在磁盘上。例如,在具有1K大小块的磁盘上,50K的文件要分配50个连续的块。
优点
- 简单、容易实现,记录每个文件用到的磁盘块仅需记住一个数字即可,也就是第一块的磁盘地址。
- 性能较好,在一次操作中,就可以从磁盘上读出整个文件。
缺点
- 首先,除非在文件创建时就知道了文件的最大长度,否则这一方案是行不通的。
- 该分配方案会造成磁盘碎片
链表分配法
- 为每个文件构造磁盘块的链接表,每个块的第一个字用于指向下一块的指针,块的其他部分存放数据。
优点
- 每个磁盘块都可以被利用,不会因为磁盘碎片而浪费存储空间;目录项中只需记录一个整数(起始块号)
缺点
- 尽管顺序读取文件非常方便,但是随机存取却相当缓慢。
- 此外,因为指针占去了一些字节,每个磁盘块存储数据的字节数不再是2的幂。可能造成性能损失
文件分配表法(FAT)
- 如果取出每个磁盘块的指针字,把它放在内存的表或索引中,就可以消除链接表法的两个不足,即文件分配表法(FAT)
优点
- 整个磁盘块都可以存放数据;随机存取容易;目录项中只需记录一个整数(起始块号) 。MS-DOS就使用这种方法进行磁盘分配。
缺点
- 主要缺陷是必须把整个链表都存放在内存中,占用较多的存储空间。
索引节点法
给每个文件赋予一张称为i-node(索引节点)的数据结构,其中列出了文件属性和各块在磁盘上的地址。
目录实现
- 在读文件前,必须先打开文件。打开文件时,操作系统利用用户给出的路径名找到相应目录项,目录项中提供了查找文件磁盘块所需的信息
- 由于系统不同,这些信息可能是整个文件的磁盘地址(连续分配方案)、第一个块的块号(对于两种链接表分配方案)或者是i-节点号。
共享文件
提供文件共享的方法:利用多个目录中的不同文件名来描述同一共享文件(即文件别名,该方法的访问速度快,但会影响文件系统的树状结构,适用于经常访问的文件共享,同时存在一定的限制)。
硬链接
基于改进的多级目录结构,将目录内容分为两部分:文件名和索引结点。
前者包括文件名和索引结点编号,后者包括文件的其他内容(包括属主和访问权限)。
例如:
ln source target ; rm source
通过多个文件名链接(link)到同一个索引结点,可建立同一个文件的多个彼此平等的别名。别名的数目记录在索引结点的链接计数中,若其减至0,则文件被删除。
限制:不能指向另一个文件系统中的i-node。
软链接
一种特殊类型的文件,其内容是到另一个目录或文件路径名。建立符号链接文件(软链接),并不影响原文件,实际上它们各是一个文件。可以建立任意的别名关系,甚至原文件是在其他计算机上。
ln -s /user/a /tmp/b
"cd /tmp/b ; cd .."是进入目录"/user"而不是"/tmp";
当一个文件被删除时,相应的所有链接都无效。
磁盘空间管理
- 存储n个字节的文件可以有两种策略:分配n个字节的连续磁盘空间,或者把文件分成许多个(并不一定要)连续的块。
- 几乎所有的文件系统都把文件分割成固定大小的块来存储,各块不必相邻。
块大小
书中P352给出了块大小与访问速率、磁盘空间利用率的关系,可以发现,性能与空间利用率是相互冲突的。
空闲块管理
- 使用磁盘块的链接表
- 磁盘块中包含尽可能多的空闲磁盘块号
- 使用位图
- n个块的磁盘需要n位位图。
- 在位图中,空闲块用1表示,分配块用0表示(或者反之)。
文件系统的可靠性
备份
- 备份整个文件系统、还是部分备份
- 增量备份、常规备份
- 是否采取数据压缩
- 快照技术
- 存储介质的物理安全
备份策略
物理转储
当将磁盘的内容备份至磁带上时,从磁盘的第0个块开始,按照顺序把所有的磁盘块依次写到输出磁带中。
- 优点:简单快捷
- 缺点:备份了一些无用的信息(空闲块、坏块),不支持增量备份、不能根据需要恢复特定的数据
逻辑转储
从一个或多个指定目录开始,对该目录下的每个文件和目录,进行备份,或以某个时间基点备份其文件和目录的修改数据
- 优点:支持增量备份、避免备份无效的数据
- 不足:相对物理转储,需要一定的技巧,以避免引入错误
文件系统的一致性
分为数据块和文件的一致性。
数据块
对于数据块,可能出现快丢失(不严重),重复块(严重)。
文件
检验程序从根目录开始,沿着目录树递归下降,检查文件系统中的每个目录。对每个目录中的文件,其i节点对应的计数器加1。
当全部检查完成后,得到一张表,对应于每个i节点号,表中给出了指向这个i节点的目录数目。
i节点的链接数大于指向i节点的目录项个数
- 这一错误并不严重,可是却浪费了磁盘空间。即使所有的文件都被删除,文件链接数仍然为非0值,该i节点不会被删除。
- 措施:把i节点中的文件链接数设置成正确的值。
i节点的链接数小于指向i节点的目录项个数
- 该错误具有严重的潜在问题。如果两个目录项都链接到同一个文件,但其i节点的文件链接数只为1,如果删除任何一个目录项,i节点链接数变为0。文件系统将该i节点标志为“未使用”,并释放该文件的所有磁盘块。这将导致另一个文件数据丢失
- 措施:把i节点中的链接数设置为目录项的实际数目
文件系统性能
高速缓存
- 减少磁盘访问次数最常用技术是块高速缓存,其中,高速缓存是一些块,它们逻辑上属于磁盘,但基于性能的考虑而保存在内存中。
- 一般来说,使用一个哈希表查找需要的数据块,而使用LRU算法将所有块用双向链表连接起来。
- 高速缓存向磁盘的写入
- 直写,即当数据块被修改,写高速缓存时亦立即写入磁盘中
- 写回,当数据块被修改,只将其写到高速缓存中,之后再根据需要(需要被换出、关系一致性问题而特意保存、定时强制被保存)再写回到磁盘中
块预读
- 在数据块被访问之前,预先把它们读入高速缓存,从而提高高速缓存的命中率
- 适用于顺序访问文件,不适用于随机访问
减少磁头臂移动技术
- 将可能顺序访问的块存放在一起,最好在同一个柱面上,从而减少磁头臂的移动次数
- 对于位图法管理空闲块的情况,在分配新的数据块时,尽量找与顺序访问时前一个块(已分配了)最邻近的空闲块
- 对于链表法管理空闲块的情况,在分配新的块时,一次分配一组连续的块,在顺序访问亦可减少寻道时间
- 控制信息与数据信息的存放位置
- 在使用i节点或者与i节点等价结构的系统中,另一个性能瓶颈在于,即使读取一个很短的文件也要访问两次磁盘:一次是读取i节点,另一次是读取文件块
- 改进方法一:把i节点放在磁盘中部,在i节点和第一块之间的平均寻道时间减为原来的一半
- 改进方法二:把磁盘分成多个柱面组,每个柱面组有自己的i节点、数据块和空闲表,在创建文件时,可以选取任一个i节点,然而分配块时,在该i节点所在的柱面组上进行查找
文件系统的安全性
安全环境
- 数据的机密性
- 确保敏感数据处于机密状态下,保证未被授权的用户无法看到这些数据
- 数据的完整性
- 未被授权的用户不能去修改任何数据,防止数据被篡改
- 系统可用性
- 确保系统的正常运行,防止拒绝服务攻击
恶意程序
- 病毒
- 拒绝服务(大量消耗计算机资源)
- 蠕虫
- 独立的程序,通过网络来传播
- 特洛伊木马
- 逻辑炸弹
保护机制
- 采用机制与策略分离
- 使用参照监视器(reference monitor)
- 保护域
- 保护矩阵
- 访问控制列表(按列存储保护矩阵)
- 主体:一个主动的实体,通常是用户和进程
- 客体(对象):一个被动的实体,通常是文件和资源
- 权能表(capability list)或称C表(按行表存储保护矩阵)
- 秘密通道
- 调节CPU使用强度
- 调节页面率、文件锁
- 申请和释放专用资源
参考资料
- Operating System:Design and Implementation,Third Edition