Skip to content

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:例如 proc file 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 nextwrite 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。