# 文件管理
## 文件
- 基本概念
- 元数据和索引结点
- 文件的操作
- 文件的保护
- 文件的逻辑结构
- 文件的物理结构
## 目录
- 基本概念
- 树形目录
- 目录的操作
- 硬链接和软链接
## 文件系统
- 全局结构
- 外存空闲空间管理方法
- 虚拟文件系统
- 文件系统挂载
文件管理
1 - 文件
文件元信息
在 UNIX 和类 UNIX 操作系统中, inode(索引节点)用于存储文件的元数据,它包含了关于该文件的大部分元数据,但不包括文件名和文件实际内容。
inode 中包含如下信息:
- 文件类型:文件是普通文件、目录还是链接文件等。
- 权限:文件的访问控制信息,如用户、组和其他用户的读、写、执行权限。
- 所有者:文件的所有者和组 ID。
- 大小:文件的大小(字节数)。
- 时间戳:文件的创建时间、最后修改时间和最后访问时间。
- 链接计数:指向该文件的硬链接数量。当计数为 0 时,文件会被删除。
- 数据块指针:文件内容所在的数据块(block)的位置信息。这包括直接指针、间接指针、二级间接指针和三级间接指针,用于指向存储文件内容的磁盘块。
进程文件管理
在进程中可能会打开若干文件,操作系统需要以某种方式对进程打开的文件信息进行记录。这就需要用到三个数据结构:文件描述符表、文件表、inode 表。
- 文件描述符表(File Descriptor Table):每个进程都有自己的文件描述符表,这个表对应于该进程打开的文件描述符。文件描述符是进程范围内的一个小的非负整数。
- 文件打开表(Open File Table):操作系统维护一个全局的文件表,该表记录了所有打开文件的状态信息。每次 open 调用成功时,都会创建一个新的文件表条目。
- INode 表(INode Table):系统还维护了一个 inode 表,该表包含了文件的元数据和指向文件实际数据的指针。如果多个进程打开同一个文件,它们的文件表条目将指向 inode 表中的同一 inode。
inode 表
inode 表(inode table)一个固定的、专门的区域,用来存储文件系统中所有文件和目录的 inode 结构。每个 inode 占用一个表项,表中的每个 inode 编号(inode number)对应一个唯一的文件或目录。
注意 inode 表是存储所有 inode 的唯一容器:
- 每个文件/目录都有一个唯一的 inode 编号
- 文件系统通过该编号在 inode 表中找到对应的 inode
📊 下表给出了一个简化的 inode 表示例:
inode 编号 | 文件类型 | 权限 | 所有者 | 文件大小 (字节) | 数据块指针(简略) | 创建时间 | 修改时间 |
---|---|---|---|---|---|---|---|
1 | 目录 | drwxr-xr-x | root | 4096 | [100, 101, 102] | 2024-01-01 10:00 | 2024-01-02 10:00 |
2 | 文件 | -rw-r–r– | user | 1024 | [200, 201] | 2024-01-01 11:00 | 2024-01-01 12:00 |
3 | 符号链接 | lrwxrwxrwx | user | 14 | [路径字符串: “/etc/abc”] | 2024-01-01 13:00 | 2024-01-01 13:00 |
4 | 文件 | -rwxr-xr-x | user | 8192 | [300, 301, 302, 303] | 2024-01-02 08:00 | 2024-01-02 08:00 |
… | … | … | … | … | … | … | … |
inode 表中的每一行就是一个 inode。
系统打开文件表
系统打开文件表(System-wide Open File Table)是整个操作系统内核维护的一个全局结构,它记录了所有进程当前打开的文件的状态信息。
每当一个进程调用 open()
打开一个文件时,系统会:
- 创建一项“系统打开文件表”记录(如果该文件尚未打开,或者是独立打开的)
- 创建/更新该进程的“文件描述符表”项,让它指向这条系统表项
举个例子:
int fd = open("file.txt", O_RDWR); // 进程 A 打开
write(fd, "Hello", 5); // offset 从 0 到 5
这次 open 会创建一个系统文件表项:
- 偏移量 0 → 写入 5 字节后变成 5
- 文件模式:O_RDWR
- inode 指针:指向 file.txt 的 inode
📊 下表给出了一个系统文件打开表实例:
表项编号(索引) | inode 编号 | 打开模式 | 当前偏移量 | 状态标志 | 引用计数 | 指向的文件路径 |
---|---|---|---|---|---|---|
0 | 1024 | 读写 (rw) | 120 | 无 | 2 | /home/user/a.txt |
1 | 1050 | 只读 (r) | 0 | 非阻塞 | 1 | /etc/hosts |
2 | 1024 | 读写 (rw) | 120 | 无 | 共享同表项 0 | /home/user/a.txt |
3 | 2001 | 只写 (w) | 45 | O_APPEND | 1 | /var/log/sys.log |
文件描述符表
文件描述符表(File Descriptor Table)是进程级别的表,它将整数类型的“文件描述符”(如 0, 1, 2, 3, …)映射到系统打开文件表的条目上。
每个进程在内核中有自己的文件描述符表。当你调用 open()
打开一个文件时,操作系统:
- 在系统打开文件表中新建或复用一项(记录 inode、偏移等)
- 在该进程的文件描述符表中添加一个条目(索引号)
📊 下表给出了一个进程的文件描述符表实例:
文件描述符(fd) | 指向系统文件表项编号 |
---|---|
0 | 5 |
1 | 6 |
2 | 7 |
3 | 9 |
4 | 10 |
总体视角
在进程 1 中执行 fdA1 = open("fileA.txt", O_RDONLY)
和 fdAdup = dup(fdA)
系统调用,在进程 2 中执行 fdA2 = open("fileA.txt", O_RDONLY)
,系统中的三种用于进程文件管理的表如下图所示:
三张表的逻辑关系可以理解为:进程描述符表(进程级) → 系统文件打开表(系统级) → inode 表(系统级)
每个进程有自己的文件描述符表,记录文件描述符(如 3、4 等)指向系统打开文件表中的某一项;系统打开文件表是全局共享的,记录当前文件的读写偏移量、打开模式,并指向对应的 inode;inode 表保存了所有文件的元数据和数据块地址,是文件的最终物理信息所在。通过这三层结构,系统实现了多个进程共享文件、独立管理偏移量和统一访问底层文件的能力。
系统调用
在 Unix 操作系统中,“一切皆文件”是一项核心设计哲学。无论是普通文件、设备文件,还是网络连接,操作系统都通过统一的机制进行管理——这套机制的核心,就是一组用于文件管理的系统调用。
其中,open
、close
、read
、write
和 lseek
是最基本、最常用的五个调用,很多考试题目都会以间接形式考查它们的工作原理与使用方式。
所谓“打开一个文件”,并不仅仅是打开字面上的内容,而是操作系统在后台完成了两个关键步骤:
- 检查文件是否存在、权限是否允许访问
- 在内核中创建一个文件描述符,用于追踪该文件的使用状态
因此,open
实际上是一次向内核“申请访问权限”的操作,它返回文件描述符(file descriptor),文件描述符会被存储到进程的 文件描述符表 中,并将 系统文件打开表 中的引用计数 +1。此外,如果文件是第一次被打开时,该文件的 inode 也会从外存中被加载到内存中。
相对应的,close
的作用是通知内核:该文件不再使用,可以释放相关资源。若程序未正确调用 close
,文件描述符将无法释放,可能导致资源泄露,最终耗尽进程可用的文件句柄。close
可以理解为 open
的反向操作:从文件描述符表中删除文件描述符;将系统文件打开表中的引用计数 -1;如果引用计数为 0 时,内存中的 inode 会被释放。
文件一旦成功打开,程序即可通过 read
和 write
系统调用与其进行交互:
read(fd, buf, count)
:将文件内容从内核空间读取到用户缓冲区write(fd, buf, count)
:将用户缓冲区的内容写入内核缓存区
每次读写操作结束后,系统会自动更新当前的读写偏移量(文件偏移指针),下一次操作会从上次结束的地方继续。
为提高读写效率,现代操作系统在 read
和 write
调用背后引入了多种 缓存与优化策略,常见包括:
1. 延迟写
在 Unix 系统中,write
系统调用并不会立即将数据写入磁盘,而是将其暂存在内核的页缓存(page cache)中。只有在特定时机——如缓存空间不足、文件被关闭,或系统周期性同步——才会将缓存中的数据统一刷新到磁盘(思路与 cache 中的 回写法 一致,需要使用到脏位)。
这种设计显著减少了磁盘 I/O 操作,提高了写入效率,尤其是在对同一数据区域频繁写入的场景下,还能合并多次写操作,从而进一步降低成本。
然而,这种“延迟写”机制也带来了风险:如果在数据尚未刷盘前系统发生异常(如断电或崩溃),这些暂存在内存中的数据可能会丢失。为此,如果应用场景对数据持久性要求较高,可以使用 fsync(fd)
显式触发缓存刷盘,确保数据安全地写入磁盘。
- 预读取
与写入类似,read
操作在内核层面也进行了性能优化。当系统识别到程序正在顺序读取文件时,会自动启用“预读取”机制,提前将后续的多个页加载到页缓存中,即使用户当前并未发出读取请求。
这样一来,后续的读取请求很可能直接命中缓存,从而避免了等待磁盘 I/O 的开销。这一机制充分利用了磁盘的顺序读取特性,在处理大文件或进行流式读取时,能够显著提升整体读性能。
定位在某些情况下,程序需要跳过部分内容、从文件中任意位置读取或写入数据,这就涉及到了 lseek
系统调用。
lseek
允许显式地移动文件的读写位置,从而实现“随机访问”。常见用途包括:
- 跳过文件前面的若干字节
- 返回文件开头重新读取
- 移动到文件末尾以进行追加写入
lseek
为文件操作提供了更高的灵活性,使得程序不仅能顺序处理数据,也能高效地实现定位和修改。
文件的逻辑结构
文件的 逻辑结构指的是文件内部数据的组织方式,是用户和程序员所看到和使用的数据排列形式。根据记录的排列和访问方式,逻辑结构通常分为以下两种:
顺序文件 是将记录按一定顺序依次存储的一种文件逻辑结构,每条记录紧跟在前一条之后。在访问时,通常采用顺序读取的方式,即从文件的开头开始,依次读取每条记录,直到找到目标记录或读完整个文件。
随机文件(也称为直接文件)则不要求记录按固定顺序排列,记录可以以任意顺序存放在文件中。其显著特点是支持随机访问,程序可以依据记录号、关键字等定位信息直接访问某条记录,而无需逐条读取。
文件的物理结构
文件的 物理结构(或称 存储结构)是指文件在物理存储介质(如磁盘、SSD)上的实际存放方式。它关注的是操作系统如何管理文件的块(block)或簇(cluster)等单位,并将逻辑上的文件映射到磁盘上的物理地址空间。
与逻辑结构面向用户和程序不同,物理结构更多反映了操作系统和文件系统层面的实现细节,决定了文件的实际读写效率、空间利用率以及文件访问策略的复杂性。
文件的物理结构和逻辑结果的 对应关系 如下图所示:
连续分配
连续分配该方案中,每个文件占用磁盘上一个连续的块集。例如,如果一个文件需要 n 个块,并且给定一个块 b 作为起始位置,那么分配给该文件的块将是 b, b+1, b+2,……b+n-1。这意味着给定起始块地址和文件的长度,我们可以确定文件占用的块。具有连续分配的文件的目录条目包含分配部分的起始块长度的地址。
连续分配方案对应的目录包含如下信息:
- 文件的其实地址
- 分配块数量
下图中的文件 “file3” 从区块 19 开始,长度为 6 个区块。因此,它占用 19、20、21、22、23、24 个块。
- 优点:因为由于文件块的连续分配,查找的次数很少,访问速度非常快。
- 缺点:存在内部和外部碎片化的问题,使得内存利用效率低下。增加文件大小困难,因为它取决于特定实例中连续内存的可用性。
链式分配
在这个方案中,每个文件都是一个不需要连续的磁盘块链表。磁盘块可以分散在磁盘上的任何地方。目录项包含指向起始和结束文件块的指针。每个块包含一个指针,指向文件所占用的下一个块。
目录项包含指向起始和结束文件块的指针。每个块包含一个指针,指向文件所占用的下一个块。
下图中的文件 “file1” 显示了块是如何随机分布的。最后一个块 (25) 包含 -1,表示空指针,不指向任何其他块。
- 优点:可以充分利用磁盘空间,不会遭遇到碎片的问题。
- 缺点:因为文件是在磁盘上随机分配的,所以访问一个文件的过程需要经历多次磁盘的检索,这使得文件读取的速度变慢。
文件分配表
基于链表的链接为隐式链接,每个磁盘块的末尾包含文件的下一个盘块号。
文件分配表 FAT 也是基于链接的方式,不过文件的链接方式是存储在一个表格当中,表格包含两列,一列是盘块号,另一列是在该文件盘块之后的下一个盘块号,这种方式也叫做显式链接。
索引分配
在索引分配中,一个文件所占用的所有盘块号被存储在另一个盘块中,这个盘块叫做叫做索引块。
假设一个文件的大小是 4MB,一个盘块的大小为 4KB,盘块编号的大小为 4B(32 位)。 在这种情况下,文件需要用 1K 个盘块存储,索引块的内容如下图所示:
4KB 的盘块刚好可以存储下 1K 个盘块号作为索引,在读取文件时,操作系统先读取索引块,确定存储文件的所有盘块号,再去读取所有存储有文件数据的盘块,如下图所示:
上图给出的索引是一级索引,索引块的层级只有一层,索引块中直接存储数据块的盘块号。
在实践中还有多级索引,其思路与 多级页表 一致。一级索引块中存储的是二级索引块的盘块号,最后一级索引块中才存储有数据块的盘块号。
混合索引
N 级索引有一个显著的缺点,就是对于非常小的文件,比如大小只有两三个盘块的文件,仍然需要使用一个完整的索引块来存储这些数据块的盘块号,这样索引块中的很多空间都没有使用,这导致盘块利用率非常的低。
还有一种混合索引的方式,可以解决上述提到的缺点,这种方式针对小文件或者大文件进行不同的处理。如果文件比较小的话,使用直接块即可,如果文件比较大的话,可以使用单级或多级索引。
UNIX 系统采用的就是这种方式,文件的 inode 结构如下图所示:
其中 direct blocks 中存储的就是直接块的盘块号,如果文件的大小只有几个盘块,直接将数据块的盘块号存储在 direct blocks 中即可。
此外,混合索引中还包含不同层次的索引块。 single indirect 是一级索引,double indirect 是二级索引,triple indirect 是三级索引。 通过多级索引,可以尽量避免文件碎片的存在,增大磁盘块的利用率。
2 - 目录
目录概念
目录是计算机文件系统中用于组织和存储文件和其他目录的一种重要概念。目录也被称为文件夹,它是文件系统中的一个重要组成部分,用于创建层次结构,方便用户管理和浏览文件。
树形目录
树形目录是一种 层次化 的文件组织结构,就像一棵倒置的树:
- 根目录(Root) 是整个目录结构的起点,通常记为
/
。 - 根目录下可以包含多个 子目录 和 文件,每个子目录下又可以包含更多的目录或文件,以此类推。
- 每个目录都可以看作是一个“节点”,通过“路径”连接起来,形成一棵树。
举例目录结构如下(见图):
示例路径:
/docs/report.txt
:表示在根目录下的docs
子目录中存在一个名为report.txt
的文件。/img/photos/summer.jpg
:表示文件summer.jpg
位于img/photos/
目录下。
这种结构具备以下特点:
- 层次清晰:便于用户查找和管理文件
- 路径唯一性:每个文件或目录都有唯一的绝对路径
- 支持相对路径:可使用
.
表示当前目录,..
表示上级目录
存储结构
在文件系统中,目录本质上就是一个特殊类型的文件,它的“内容”是一个个目录项(directory entry),用于记录当前目录下的文件和子目录的名字,以及它们对应的 inode 编号。
下图给出了目录的核心简化结构🧩:
目录文件内容(一个个目录项):
┌────────────────────────────┐
│ 文件名:. → inode 100 │ ← 当前目录
│ 文件名:.. → inode 99 │ ← 父目录
│ 文件名:a.txt → inode 123 │
│ 文件名:docs/ → inode 200 │
│ 文件名:img.jpg → inode 150 │
└────────────────────────────┘
每个目录项包括:
- 文件名(如 “a.txt”)
- 对应的 inode 编号(如 123),通过 inode 号查询 inode表 可以获取文件的元信息。
这些信息保存在磁盘上的 目录文件 中,文件系统通过这些记录来解析路径。
操作
树形目录不仅提供了结构化的存储方式,用户还可以通过命令行对 目录 和 文件其进行多种操作:
mkdir dir_name # 创建新目录
mv old_dir new_dir # 移动或重命名目录
rm -r dir_name # 递归删除目录及其内容
ls -l dir_name # 列出目录内容(详细信息)
touch filename # 创建一个空文件
rm filename # 删除文件
mv old new # 重命名或移动文件
cp src dest # 复制文件
cat filename # 显示文件内容
cd /path/to/dir # 进入指定目录(绝对路径)
cd .. # 返回上级目录
cd # 回到当前用户的主目录
pwd # 显示当前路径
文件链接
在 Linux 文件系统中,一个文件的“名字”其实只是目录项中的一个 链接(link)。文件的实际内容和元信息是保存在 inode 中的,而文件名只是“指向这个 inode 的引用”。基于这一设计,系统允许我们为同一个文件创建多个“名字”,这些名字就是所谓的文件链接。文件链接分为两种:硬链接 和 软链接,它们实现方式不同,行为也有所差异。
硬链接
硬链接(hard link)的本质,是在文件系统的目录存储结构中,为同一个索引节点(inode)创建多个目录项。这些目录项分别对应不同的文件名,但它们都指向同一个 inode,从而共享同一份文件数据。
在 Linux 中你可以使用命令 ln A D
创建 A
的硬链接 D
,它的含义是:在当前目录下创建一个名为 D
的新目录项,该目录项与 A
指向同一个 inode,从而实现两个文件名共享同一份文件内容。
$ echo "hello" > A
$ ln A B
$ ls -li A D
123456 -rw-r--r-- 2 user group 6 Jul 2 A
123456 -rw-r--r-- 2 user group 6 Jul 2 D
执行上述创建硬链接的命令后,系统中的目录会变为如下结构(简化):
因此,硬链接实现了 多个文件名访问同一个文件内容 的效果:
- 所有硬链接文件共享同一个 inode 号,指向同一个数据块,不会创建数据副本;
- 删除某一个硬链接,只是移除了对应的目录项,并减少 inode 的链接计数,不会影响其他链接;
- 只有当所有指向该 inode 的目录项都被删除时,该 inode 所占的数据块才会真正被释放;
- 出于文件系统一致性考虑,硬链接不能用于目录,以防目录结构形成环;
- 硬链接仅限于同一个文件系统内部,不能跨越挂载点或磁盘分区。
软链接
软链接(也叫做 符号链接,symbolic link)的本质,是在文件系统中 创建一个特殊类型的文件,其内容是 指向目标文件路径的字符串。软链接自身拥有独立的 inode 和数据块,但并不直接指向目标文件的 inode,而是通过路径进行间接访问。
在 Linux 中你可以使用命令 ln -s A L
创建 A
的软链接 L
,它的含义是:在当前目录下创建一个名为 L
的链接文件,其内容是 "A"
,即指向文件 A
的路径。
$ echo "hello" > A
$ ln -s A L
$ ls -li A L
123456 -rw-r--r-- 1 user group 6 Jul 2 A
234567 lrwxrwxrwx 1 user group 1 Jul 2 L -> A
执行上述创建软链接的命令后,系统中的目录结构会变为如下形式(简化):
因此,软链接实现了 路径级别的引用关系,其行为特性如下:
- 软链接是一个独立的文件,拥有自己的 inode 和数据块,数据块中存储的是目标路径(如
"A"
); - 删除原文件后,软链接不会失效为独立文件,但会变成悬挂链接(dangling link),无法再访问目标内容;
- 软链接 可以跨文件系统使用,也可以链接目录,灵活性更高;
- 访问软链接时,系统会先读取其路径内容,再根据该路径查找目标文件;
- 文件属性显示中,软链接使用
l
类型标识,显示类似L -> A
的引用关系。
3 - 文件系统
功能
文件系统(File System)作为操作系统与存储设备之间的桥梁,负责数据的存储、访问、管理和保护。简单来说,文件系统主要包含以下功能:
- 数据存储与组织
- 文件系统以文件和目录的形式组织数据,将存储设备的物理空间划分为逻辑单元(如文件、文件夹),便于用户和应用程序访问与管理数据。
- 空间管理
- 通过空闲块管理(分配、回收、组织),文件系统高效利用存储空间,减少碎片,支持文件的创建、扩展和删除。常见方法包括连续分配、链接分配和索引分配。
- 数据访问与操作
- 提供标准接口(如读、写、打开、关闭)支持对文件的访问和操作,确保数据的高效检索和修改,同时支持随机访问和顺序访问。
- 数据保护和安全
- 权限管理
- 数据完整性校验
文件系统和磁盘的功能区别
文件系统和磁盘在存储管理中扮演不同角色。磁盘负责物理存储,提供固定大小的扇区(通常为512字节或4KB),作为数据读写的 最小物理单位。文件系统则在磁盘之上构建逻辑结构,负责数据的组织和管理,以 盘块(或簇) 为单位进行空间分配和操作。
盘块/簇是文件系统定义的 逻辑单位,其大小在格式化时确定(常见如4KB、8KB等),用于管理文件的存储和访问。盘块通常是扇区的整数倍,便于将逻辑操作映射到物理存储。扇区则是磁盘的物理单位,硬件层面的最小读写单位,固定且不可更改。
全局结构
如上图所示,磁盘从逻辑上分为如下部分:
- 引导区(Master Boot Sector,MBR):引导区位于磁盘的起始位置,通常是磁盘的第一个扇区。它包含引导加载程序(boot loader),用于引导操作系统。引导加载程序负责启动计算机并加载操作系统内核。
- 分区表(Partition Table):分区表通常存储在磁盘的第一个扇区之后,用于记录磁盘上的分区信息。分区表指示了磁盘上每个分区的起始位置、大小和文件系统类型。不同操作系统使用不同的分区表格式,如 MBR(Master Boot Record)和 GPT(GUID Partition Table)。
- 分区(Partition):分区中存储有文件系统,文件系统中包含元数据和数据区这两个部分。
- 元数据:
- 超级块(Superblock):包含文件系统的关键信息,在计算机启动时,超级块会被载入内存。超级块中包含的典型信息包括分区的块的数量、块的大小、空闲空间的管理方式等。
- 空闲块信息:管理磁盘中空闲块的存储数据,具体方法见下文空闲空间管理方法
- inodes:管理文件的元数据
- 数据区:文件系统的数据区存储了实际的文件数据。这是存储文件内容的地方。文件系统会将文件数据分为一个或多个块或簇,并将这些块分布在磁盘上的不同位置。文件系统的数据区通常占据了磁盘上的大部分空间。
- 元数据:
下图是一个文件系统在分区(Partition)上的存储示例,文件系统的元数据由 superblock、inode 位图区(inode bmap)、数据块位图区(data bmap)、inode 存储区(inode region)这四个部分构成。
外存空闲管理
文件存储设备(如硬盘、SSD)将存储空间划分为多个大小相同的物理块(通常为 512 字节、4KB 或更大),以块为单位进行数据的读写和交换。因此,文件系统的外存管理实质上是对这些物理块(特别是空闲块)的组织、分配与回收的管理。以下详细说明空闲块管理的关键问题和方法:
空闲表法
与文件连续分配方案中的目录保存内容类似,这里用一个表格记录连续空闲块在存储空间中的位置。
空闲链表法
使用链表数据结构,其中每个节点代表一个空闲数据块。链表的头节点存储了第一个空闲块的位置(磁盘块号),每个节点的下一个节点指向下一个空闲块。因此,整个链表由一系列相邻的空闲块组成。
位示图法
位图是一个二进制位数组,其中的每个位对应于磁盘上的一个数据块。位图中的每个位可以表示两个状态:
- 0:表示相应的数据块是空闲的,可以分配给文件。
- 1:表示相应的数据块已经被分配给文件,不再空闲。
成组链接法
成组链接法的细节比较复杂,这里仅掌握其思想即可(较小概率在选择题中考察):
与文件混合索引分配方式思路类似,用一个磁盘块 A 来存储所有的空闲盘号,如果 A 满了,就用一个新的空闲磁盘 B 来作为头结点,并且将其中的一个盘块号标记为 A 的盘块号(作为一阶间址)。
虚拟文件系统
虚拟文件系统(Virtual File System,简称 VFS)是一种操作系统内核中的抽象层设计,它为不同类型的文件系统提供了统一的接口。通过 VFS,操作系统可以屏蔽底层文件系统的具体实现细节,使上层的应用程序和系统调用能够以一致的方式访问各种存储设备和文件系统,而无需了解其底层结构。
VFS 的主要目标是提供一个标准接口,使不同类型的文件系统(如本地文件系统、网络文件系统、CD-ROM 文件系统等)能够以一致的方式与操作系统内核进行通信。这有助于增强操作系统的可扩展性和可移植性,同时使应用程序更容易编写,因为它们可以依赖统一的文件系统接口。
在 VFS 的架构下,每种文件系统通过注册相应的驱动程序或模块与 VFS 接口进行对接。当应用程序执行文件操作(如打开、读取、写入或关闭文件)时,这些请求会通过 VFS 统一调度到对应的底层文件系统,从而实现跨文件系统的透明访问。
文件系统挂载
文件系统挂载是指将一个文件系统与操作系统的目录结构关联起来,以便可以访问文件和目录。在大多数操作系统中,文件系统挂载是一种将存储设备(如硬盘分区、CD-ROM、网络共享等)上的文件系统连接到操作系统的文件树中的过程。
文件系统挂载是文件系统管理中的一个重要概念,它使操作系统能够有效地访问和管理不同类型的存储设备上的数据。通过挂载,不同文件系统可以在一个统一的文件树中协同工作,使文件和目录对用户和应用程序来说似乎是在同一个系统中。