Chapter 8 File System Interface¶
引入
有了大容量存储设备与 I/O 硬件后,问题在于应用到底如何使用存储。
最原始的方式是直接使用 disk,但这要求程序理解 track、sector、block allocation、bad block、concurrent access 等大量细节,既困难也不安全。
文件系统实现了磁盘的抽象封装,使得用户进程看到的是文件而不是 track / sector。
文件系统为一批文件提供统一规整的访问视图,同时提供访问保护机制。Unix 中文件可理解为连续的 logical byte stream。
1 File Concept¶
文件(File) 是用于保存信息的一段连续 logical space。文件内容可以是 database、audio、video、web pages、program、text 等。
File 的类型
- Data file:character data、binary data、application-specific data
- Program file:可执行程序或可加载代码
- Special file:例如
procfile system 使用 file-system interface 暴露 system information
File Attributes
| Attribute | 含义 |
|---|---|
| Name | 人类可读的文件名 |
| Identifier | 文件系统内唯一标识,如 inode number |
| Type | 文件类型,某些系统需要 |
| Location | 文件在设备上的位置指针 |
| Size | 当前文件大小 |
| Protection | 谁能 read、write、execute |
| Time / date / user identification | 用于 protection、security、usage monitoring |
| Extended attributes | 例如 checksum、label、自定义 metadata |
文件信息保存在 directory structure 中,而 directory structure 本身也存储在磁盘上。
示例
# 查看main.c文件类型
file main.c
# main.c: C source, ASCII text → C语言源码、ASCII文本文件
# 查看编译后的可执行程序a.out类型
file a.out
# ELF64位、x86_64架构、PIE动态链接可执行文件,依赖/lib64/ld-linux-x86-64.so.2动态链接器,未剥离符号
# 查看a.out的inode元数据
stat a.out
# File: a.out 文件名
# Size: 15960 文件逻辑大小15960字节
# Blocks:32 占用32个512B磁盘块
# IO Block:4096 系统最优IO块4KB,普通文件
# Inode:3670041 inode编号,Links:1 硬链接数1
# Access:(0775/-rwxrwxr-x) 权限775,属主/组UID/GID=1000(wentbo)
# Access: 最后访问时间
# Modify: 文件内容修改时间
# Change: inode属性变更时间
# Birth: 文件创建时间
OS 提供基本 file operations,其它复杂操作通常可由这些基本操作组合出来。
- create:在 file system 中找到空间,在 directory 中分配一个 entry
- open:返回 handler / file descriptor,供后续操作使用,多数操作前需要先 open
- read / write:需要维护当前 file pointer
- seek:改变当前读写位置
- close:释放本进程打开文件的相关状态
- delete:释放文件占用空间,对 hardlink 需要维护 link count,最后一个 link 删除后才真正删除文件
- truncate:清空文件内容,但保留 attributes
Open Files
打开文件后,OS 需要维护额外状态。
| 数据 | 说明 |
|---|---|
| Open-file table | 跟踪系统中打开的文件 |
| File pointer | 标记上一次读写位置,对每个打开该文件的进程分别维护 |
| File-open count | 文件被打开的次数,最后一次 close 后才能移除 open-file table 项 |
| Disk location of file | 缓存文件位置相关信息,减少重复查找 |
| Access rights | 本次 open 的访问模式,如 read-only、write-only、read-write |
如果每次 read / write 都从路径名重新查目录、查权限、查磁盘位置,开销会很高。open 把这些查找结果缓存成一个 handle,后续操作直接使用该 handle。
某些文件系统提供 file lock,用于协调多个进程对同一文件的访问。
| 锁类型 | 含义 |
|---|---|
| Shared lock | 多个进程可同时持有,常用于读共享 |
| Exclusive lock | 一次只能一个进程持有,常用于写独占 |
| 锁机制 | 含义 |
|---|---|
| Mandatory lock | OS 根据锁状态强制拒绝不允许的访问 |
| Advisory lock | OS 提供锁状态,进程自愿遵守并决定如何处理 |
OS 和应用可以通过多种方式识别文件类型。
识别 File Type 的方式
- 作为文件名的一部分,例如 file extension:
.c、.txt、.jpg - 通过 magic number 判断,例如 ELF 可执行文件头
- 通过文件系统 metadata 或 application-specific metadata 判断

文件可以有不同结构,具体由 OS 或应用决定。
| 结构 | 含义 | 示例 |
|---|---|---|
| No structure | byte stream / word stream | Linux / Unix 常见模型 |
| Simple record structure | 固定或可变长度 records | 数据库、记录文件 |
| Complex structure | 复杂内部格式 | Word document、relocatable object file |
Unix / Linux 通常把文件视作 byte stream。文件系统不理解 Word 文档、数据库页、图片格式等语义,这些结构由 user programs 自己解释。
2 Access Methods¶
- 顺序访问(Sequential access):按预定顺序访问文件元素,磁带这类介质天然适合顺序访问。通过
read next和write next自动推进 current file pointer,可 rewind 回到开头。

- 直接访问(Direct access):允许在序列中任意位置访问元素,访问时间大致相同,与文件大小无关,也常称随机访问(random access)。磁带虽能模拟随机访问,但访问时间长短差异很大。
Sequential Access on Direct-access File

- 索引访问(Indexed Access):基于直接访问机制实现,为文件建立索引,索引项指向数据块。查找文件内一条记录时先检索索引,再凭借指针访问对应数据块。可采用多层索引结构。
3 Directory Structure¶
3. 1 Basic Concepts¶
一块磁盘可以划分为多个分区(partitions),不同分区可搭载不同的文件系统。
| 概念 | 含义 |
|---|---|
| Partition | 磁盘上的一个逻辑分区,也称 minidisk / slice |
| Volume | 包含 file system 的 partition |
| Table of contents | 每个 volume 跟踪本文件系统信息的数据结构 |
| Raw disk | 不使用 file system,应用直接管理 blocks |
磁盘或分区可作为裸设备使用(不格式化文件系统),数据库这类应用常选用裸磁盘。

Directory 是一组 nodes 的集合,每个 node 包含某个文件的信息,Directory structure 和 file contents 都存放在磁盘上。

常见 directory operations 包括:
- Create a file:新文件需要加入 directory
- Delete a file:从 directory 中移除文件
- List a directory:列出目录中所有文件
- Search for a file:按名字或 pattern 查找
- Traverse the file system:递归访问目录下每个文件和子目录
3. 2 Directory organization¶
| 目标 | 含义 |
|---|---|
| Efficiency | 快速定位文件 |
| Naming | 提供用户方便理解的命名结构 |
| Grouping | 支持按项目、用户、类型等方式组织文件 |
| Sharing | 支持同一文件有多个名字或被多个用户访问 |
- Single-level directory:为所有用户维护一个全局 directory,命名冲突严重,难以分组管理,文件数量大时搜索和浏览都不方便。

- Two-level directory:为每个用户提供独立的 UFD(User File Directory),所有 UFD 由 MFD(Master File Directory) 管理。用户文件彼此隔离,不同用户可以拥有同名文件,搜索效率比 single-level 更好。若想在不同用户之间共享文件需要引入 path concept。

- Tree-structured directory:把文件组织成树,是现代 OS 中最常见的基本模型。

| 概念 | 示例 |
|---|---|
| Absolute path name | /home/alice/file.txt |
| Relative path name | 相对于 current directory,例如 ../tmp/a |
| Current directory | pwd 所显示的目录 |
- 创建新文件:
touch <file-name> - 删除文件:
rm <file-name> - 创建子目录:
mkdir <dir-name>
严格 tree structure 不允许一个文件或目录同时有多个父目录。因此如果要共享同一个文件 / 目录,需要突破 tree,进入 graph structure。
删除非空目录
删除 directory 时有两种策略:
- Option I:只有空目录才能删除
- Option II:递归删除目录下所有 files、directories 和 sub-directories
sudo rm -rf / 是递归删除根目录的危险例子,真实系统通常会有额外保护。
- Acyclic-graph directory:将目录组织为无环图结构,允许通过 links 共享文件或目录。

Dangling Pointer Problem
若某个文件被多个 directory entries 指向,其中一个路径删除了文件实体,其它路径就可能变成 dangling pointer,例如删除源文件 /dict/all 后,/dict/w/list、/spell/words/list 两个链接变为无效悬空指针
- 反向指针(Back pointers):记录所有指向该实体的 pointers,但记录长度可变
- 引用计数(Reference counter / link count):记录 link 数,只有计数为 0 时才真正删除实体
- General graph directory:允许任意 links,因此可能形成 cycles。

处理 Cycle 的方法
- 允许 cycle,但使用 garbage collection 回收不可达 disk space
- 每次新增 link 时运行 cycle detection algorithm,阻止形成 cycle
3. 3 File System Mounting¶
文件系统必须挂载(mount)之后才可访问。挂载把文件系统接入系统,整体形成统一命名空间
| 概念 | 含义 |
|---|---|
| Mount point | 被挂载文件系统接入的位置 |
| Mounted file system | 已接入 namespace 的文件系统 |
| Hidden old directory | mount point 原有目录内容在挂载期间被遮蔽 |

若把某个 partition mount 到 /users,则访问 /users 时看到的是该 partition 的 root,而不是原来 root file system 中 /users 目录下的旧内容。
3. 4 File Sharing¶
Remote file sharing 使用网络让不同系统之间访问文件。
| 方式 | 特点 |
|---|---|
| FTP 等手动程序 | 用户显式上传 / 下载 |
| Distributed file systems | 自动、透明地把远程 FS 接入本地 namespace |
| World Wide Web | 半自动共享和访问内容 |
Client-Server Model
- 单台服务器可同时为多个客户端提供服务
- 客户端可挂载服务器上的远程文件系统
- 客户端与客户端用户的身份校验较为复杂,服务端不能简单信任客户端
- 系统原生文件调用会被转换为远程网络调用
- NFS(Network File System):标准 UNIX file sharing protocol
- CIFS / SMB:Windows 常见 file sharing protocol
4 Protection¶
- ACL(Access Control List):为每个 file / directory 维护访问控制列表,访问粒度细,但构造和存储 list 复杂。
- Unix Access Control:Unix 传统权限模型使用三类用户和三种权限。
| 权限 | 含义 | bit |
|---|---|---|
| read | 读文件或列目录 | r |
| write | 写文件或修改目录 | w |
| execute | 执行文件或进入目录 | x |
| 用户类别 | 含义 | RWX |
|---|---|---|
| owner | 文件所有者 | 7 = 0b111 |
| group | 文件所属组 | 6 = 0b110 |
| others | 其他用户 | 1 = 0b001 |
在 Linux 中可用 chmod 修改权限,用 chgrp 修改所属组。
Unix 模型比 ACL 粗粒度,但非常紧凑、容易检查、容易缓存。实际系统常同时支持传统 mode bits 和更细粒度 ACL。