我们每天在电脑上创建、编辑、删除文件,却很少思考:这些文件是如何被磁盘 "记住" 的?为什么删除文件后空间能回收?其实这一切的背后,都是文件系统在默默工作。它就像磁盘的 "管理员",负责组织、管理和调度磁盘上的所有数据。今天我们就从最基础的 "块、分区、inode" 说起,揭开文件系统的底层逻辑
一、先搞懂 3 个核心概念:块、分区、inode
1. 块(Block):磁盘的 "最小存储单元"
磁盘的最小物理存储单位是扇区(512 字节),但操作系统读取数据时不会逐个扇区读取 ------ 效率太低。于是文件系统引入了 "块" 的概念:一个块是连续的多个扇区,最常见的大小是 4KB(相当于 8 个扇区)
块是文件存取的最小单位:无论文件大小是 1 字节还是 3KB,都会占用至少一个块。这就像我们租仓库,哪怕只放一个箱子,也得租一整个储物间
2. 分区(Partition):磁盘的 "功能分区"
一块磁盘容量可能很大(比如 1TB),如果全用来存一种数据,管理起来会很混乱。文件系统允许我们把磁盘分成多个 "分区",比如 Windows 的 C 盘、D 盘,Linux 的/根分区、/home分区
分区的本质是 "划定磁盘的一段连续柱面"(柱面是磁盘的物理结构,由所有盘片的同编号磁道组成)。每个分区都是独立的 "存储区域",可以单独格式化、单独管理,就像把一栋大楼分成多个独立的房间,各自用途不同
3. inode:文件的 "身份证"
我们知道 "文件 = 内容 + 属性":内容是文件的实际数据(存在块里),属性是文件的元信息(比如大小、所有者、创建时间、权限)。那么属性存在哪里?答案是inode(索引节点)
- 每个文件对应一个唯一的 inode,里面存储了所有属性(唯独不包含文件名)
- inode 有唯一的编号(inode 号),是文件的 "身份证号"
- 一个分区的 inode 数量是固定的(格式化时确定),如果 inode 用完,哪怕磁盘还有空间,也无法创建新文件
举个例子:用ls -li命令查看文件,第一列就是 inode 号,后面的权限、大小、时间等,都来自 inode 存储的属性
二、文件是如何被 "找到" 的?inode 与块的映射
文件的内容存在块里,属性存在 inode 里,两者如何关联?答案藏在 inode 的结构中:每个 inode 都有一个 "块指针数组"(比如 ext2 文件系统有 15 个指针),这些指针直接或间接指向存储文件内容的块。
这个指针数组的设计很巧妙:
- 前 12 个指针是 "直接块指针",直接指向存储数据的块(适合小文件)
- 第 13 个是 "一级间接块指针",指向一个 "索引块",索引块里存储的是多个数据块的地址(适合中文件)
- 第 14、15 个分别是二级、三级间接块指针,支持更大文件的存储
简单说:找到文件的 inode,就能通过指针数组找到所有存储内容的块,进而读取完整文件
三、目录的本质:文件名与 inode 的 "映射表"
我们访问文件时用的是文件名(比如test.txt),但文件系统认的是 inode 号 ------ 这中间的桥梁就是 "目录"
很多人不知道:目录也是一种文件!它的属性同样存在 inode 里,而它的 "内容" 非常特殊 ------ 是一张 "文件名→inode 号" 的映射表
比如我们在/home目录下创建test.txt,/home目录的内容会新增一行记录:test.txt → 1052007(1052007 是test.txt的 inode 号)。当我们访问/home/test.txt时,文件系统会先读取/home目录的映射表,通过文件名找到 inode 号,再通过 inode 找到文件的属性和内容
四、总结
文件系统的基础逻辑其实很简单:
- 用 "块" 存储文件内容,提高读写效率;
- 用 "分区" 划分磁盘功能,方便管理;
- 用 "inode" 存储文件属性,作为文件的唯一标识;
- 用 "目录" 维护文件名与 inode 的映射,让我们能通过文件名访问文件。