基本概念
1. 文件系统和文件
1. 1 文件系统
一种用于持久性存储(掉电不会丢失数据,例如硬盘)的系统抽象。
1. 2 文件
文件系统中一个单元的相关数据在操作系统中的抽象。
1. 3 文件系统的功能
- (在磁盘角度)分配文件磁盘空间:
- 管理文件块(哪一块属于哪一个文件)
- 管理空闲空间(哪一块是空心啊的)
- 分配算法
- (在用户角度)管理文件集合:
- 定位文件及其内容
- 命名:通过名字找到文件的接口
- 文件系统类型
- 提供的便利及特征
- 保护:分层来保护数据安全
- 可靠性/持久性:保持文件的持久即使发生崩溃、媒体错误、攻击等。
1. 4 文件属性
名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间
1. 5 文件头
- 在存储元数据中保存了每个文件的信息
- 保存文件的属性
- 跟踪哪一块存储块属于逻辑上文件结构的哪个偏移
2. 文件描述符
操作系统内核中,为每个进程维护一打开文件表,一个打开文件描述符石这个表的索引,每一个项保存了该文件的信息。
需要元数据信息来管理打开文件:
- 文件指针:指向最近的一次读写位置,每个打开了这个文件的进程都指向这个指针
- 文件打开计数:记录文件打开的次数(允许不同的进程同时打开一个文件)。当最后一个进程关闭了文件时,允许将其从打开文件表中移除。
- 文件磁盘位置:打开文件一般用于读或者写,需要知道文件在磁盘中的位置。
- 访问权限:每个程序访问模式信息
2. 1 不同视角下
- 用户视图:持久的数据结构
- 系统访问接口:字节的集合
- 操作系统内部视角:块的集合(块是逻辑转换单元,而山区是物理转换单元)
注意:在文件系统中的所有操作都是在整个块空间上进行的(即使每次只访问1字节的数据,也会缓存整个buffer的数据)
例如,当用户需要给他2-12字节空间时:操作系统会获取字节所在的块然后返回块内对应部分。
2. 2 用户怎么访问文件
在系统层面需要知道用户的访问模式
- 顺序访问:按字节依次读取
- 随机访问:从中间读取
- 基于内容访问:通过特征
2. 3 文件内部结构
- 无结构:单词、bit的结构
- 简单记录结构:列、固定长度、可变长度
- 复杂结构:格式化的文档(word、PDF)、可执行文件
2. 4 多用户系统中的文件共享
-
访问控制
谁能获得哪些文件的哪些访问权限
访问模式:读、写、执行、删除、列举等
-
文件访问控制列表ACL
<文件实体,权限>
-
Unix模式
<用户|组|其他人,读|写|可执行>
用户ID识别用户/创建者,表明每个用户所允许的权限及保护模式
组ID允许用户组成组,并指定了组访问权限
-
指定多用户/客户如何同时访问共享文件
-
Unix文件系统语义
对打开文件的写入内容立即对其他打开同一文件的其他用户可见。
共享文件指针允许多用户同时读取和写入文件
-
会话语义
写入内容只有当文件关闭时可见
-
锁
3. 目录
-
文件以目录的方式组织起来
-
目录是一类特殊的文件:每个目录都包含了一张表<name, pointer to file header>
-
典型操作:搜索文件、创建文件、删除文件、枚举目录、重命名文件、在文件系统中遍历一个路径
-
操作系统应该只允许内核模式修改目录
-
名字解析:逻辑名字转换成物理资源的过程(遍历文件目录知道找到目标文件)
-
当前工作目录:每个进程都会指向一个文件目录用于解析文件名
允许用户指定相对路径来代替绝对路径
-
挂载
- 一个文件系统需要先挂载才能被访问
- 一个未挂载的文件系统被挂载在挂载点上(挂载点类似于目录)
4. 文件别名
两个或多个文件名关联同一个文件。
-
硬链接:多个文件项指向一个文件
-
软链接:以“快捷方式”指向其他文件。该文件中的内容是真实文件的逻辑路径名。
-
若删除一个有别名的文件这个别名将成为一个悬空指针
-
如何保证没有循环:
- 只允许到文件的链接,不允许到子目录的链接。
- 每增加一个新的链接都用循环检测算法确定是否合理
5. 文件系统种类
- 磁盘文件系统
- 文件存储在数据存储设备上,如磁盘。
- 例如:FAT、NTFS等
- 数据库文件系统
- 文件根据其特征是可被寻址的
- 例如:WinFS
- 日志文件系统
- 记录文件系统的修改/事件
- 例如:journaling file system
- 网络/分布式文件系统
- 例如NFS、SMB
- 文件可以通过网络被共享:文件位于远程服务器,客户端远程挂载服务器文件系统,标准系统文件访问被转换成远程访问
- 分布式文件系统的问题:客户端和客户端上的用户辨别起来很困难。
- 特殊/虚拟文件系统