磁盘和文件系统的管理,也是操作系统最核心的功能。
磁盘为系统提供了最基本的持久化存储。
文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。
Linux 文件系统的工作原理
文件系统,本身是对存储设备上的文件,进行组织管理的机制。组织方式不同,就会形成
不同的文件系统。
在 Linux 中一切皆文件。不仅普通的文件和目录,就连块设备、 套接字、管道等,也都要通过统一的文件系统来管理。
索引节点和目录项
为了方便管理,Linux 文件系统为每个文件都分配两个数据结构,索引节点(index
node)和目录项(directory entry)。它们主要用来记录文件的元信息和目录结构。索引节点和目录项纪录了文件的元数据,以及文件间的目录关系
索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问
权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会
被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。
目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联
关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目
录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。
换句话说,索引节点是每个文件的唯一标志,而目录项维护的正是文件系统的树状结构。
目录项和索引节点的关系是多对一,可以简单理解为,一个文件可以有多个别名。
磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数 据块区。
其中:
超级块,存储整个文件系统的状态。
索引节点区,用来存储索引节点。
数据块区,则用来存储文件数据
虚拟文件系统
目录项、索引节点、逻辑块以及超级块,构成了 Linux 文件系统的四大基本要素。不过,
为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个
抽象层,也就是虚拟文件系统 VFS(Virtual File System)。
VFS 定义了一组所有文件系统都支持的数据结构和标准接口。这样,用户进程和内核中的
其他子系统,只需要跟 VFS 提供的统一接口进行交互就可以了,而不需要再关心底层各种
文件系统的实现细节
文件系统,要先挂载到 VFS 目录树中的某个子目录(称为挂载点),然后才能访问其
中的文件。
文件系统 I/O
文件读写方式的各种差异,导致 I/O 的分类多种多样。最常见的有,缓冲与非缓冲 I/O、
直接与非直接 I/O、阻塞与非阻塞 I/O、同步与异步 I/O