铅笔小新z个人主页博客专栏Linux学习滴水不绝可穿石步履不休能至渊。本节重点理解磁盘物理结构掌握 CHS 和 LBA 地址掌握 Ext 系列文件系统原理理解分区、格式化、路径解析、挂载等过程和操作理解软硬链接的使用和用途一、理解硬件1.1 磁盘、服务器、机柜、机房机械磁盘是计算机中唯一的一个机械设备。它属于外设特点是速度慢——靠机械臂转动读写比内存、CPU 慢得多容量大、价格便宜——一块机械硬盘能做到几 TB价格远低于同容量的固态硬盘正因为磁盘慢操作系统在设计文件系统时会想尽办法减少磁盘 I/O 次数这就引出了后面块的概念和缓存机制。1.2 磁盘物理结构磁盘内部主要由以下几部分组成盘片platter圆形的磁性盘片数据就存储在上面磁头head每个盘片有上下两个面每一面对应 1 个磁头用来读写数据传动臂actuator arm连接所有磁头所有磁头共进退这个细节很重要主轴spindle带动盘片高速旋转磁道track盘片上每一个同心圆环就是一个磁道从外圈向内编号0 磁道、1 磁道……柱面cylinder所有盘片上相同半径的磁道构成一个柱面数量上等于单个盘面的磁道数扇区sector每个磁道被划分成若干扇形区域每个扇区存储 512 字节是磁盘读写的最小单位磁盘容量计算公式磁盘容量 磁头数 × 磁道柱面数 × 每道扇区数 × 每扇区字节数关键理解传动臂上的磁头是共进退的——也就是说所有磁头永远停留在同一半径位置。当磁头移动到某个柱面时所有盘面上的该柱面都能被访问只不过需要切换磁头电子切换速度很快。知识点总结磁盘本质上是一个机械设备靠磁头在旋转的盘片上读写数据。数据的最小读写单位是扇区512 字节。要定位一个扇区需要知道三个信息用哪个磁头、在哪个柱面、扇区编号是多少——这就是 CHS 寻址。磁盘的容量 磁头数 × 磁道数 × 每道扇区数 × 512 字节。理解磁盘物理结构是后续理解文件系统的基础因为文件系统的终极目标就是高效地组织和管理磁盘上的数据。1.3 磁盘的存储结构与 CHS 寻址如何定位一个扇区要找到磁盘上的某个扇区需要三步确定磁头Head——决定用哪个盘面的哪个面确定柱面Cylinder——决定磁头移动到哪个半径位置确定扇区Sector——决定在磁道上的哪个扇形区域这种定位方式叫做CHS 寻址Cylinder-Head-Sector。CHS 寻址的局限性CHS 对早期小容量磁盘很有效但在大容量磁盘上存在瓶颈系统用8 bit存储磁头地址 → 最多 256 个磁头用10 bit存储柱面地址 → 最多 1024 个柱面用6 bit存储扇区地址 → 最多 63 个扇区编号从 1 开始每个扇区 512 字节最大容量 256 × 1024 × 63 × 512 B ≈8.064 GB这个容量在现代看来太小了因此引入了更先进的 LBA 寻址方式。补充文件 内容 属性本质上都是数据存储到磁盘上就是占据若干个扇区的问题。只要能定位一个扇区就能通过连续读取定位多个扇区。知识点总结CHS 寻址是早期磁盘的数据定位方式通过柱面号 磁头号 扇区号三维坐标确定一个扇区。但由于 CHS 用固定的位数来存储这三部分信息10bit 8bit 6bit导致最大只能管理约 8GB 的磁盘空间远远无法满足现代存储需求。所以后来出现了 LBA 寻址把磁盘拉直成一维线性地址来访问。1.4 磁盘的逻辑结构理解过程——把磁盘想象成拉直的磁带磁盘虽然是硬质的圆盘但逻辑上我们可以把它想象成一根卷在一起的磁带把磁带拉直就形成了一条线性结构每个扇区在这条线上都有一个唯一的编号类似于数组的下标这种编号就叫LBALogical Block Address逻辑块地址真实过程——为什么可以这样想核心原因就是传动臂上的磁头是共进退的。所有磁头永远停留在同一个柱面位置切换不同盘面上的磁头只是电子切换非常快因此从逻辑上看磁盘不像是多个盘片而像是把柱面一层层卷起来的线性磁带磁道某一盘面的某一个磁道展开即一维数组柱面整个磁盘所在盘面的同一个磁道即柱面展开柱面上的每个磁道扇区个数是一样的这就是二维数组整盘整个磁盘就是多张二维的扇区数组表三维数组所有寻址一个扇区先找到那一个柱面在确定柱面内那一个磁道其实就是磁头位置Head)在确定扇区(Sector)所以就有了CHS。我们之前学过 C/C 的数组在我们看来其实全部都是一维数组所以磁盘物理上有多个盘面、多个磁道但从逻辑角度我们可以把整个磁盘看作一个一维数组数组的每个元素就是一个扇区数组下标就是 LBA 地址。知识点总结由于所有磁头共进退我们无需关心复杂的物理三维结构完全可以把磁盘抽象成一个一维数组扇区就是数组元素LBA 就是数组下标。这种抽象极大地简化了操作系统和文件系统对磁盘的管理——用一个数字就能直接访问任意扇区。1.5 CHS 与 LBA 地址的互相转换CHS → LBALBA C × (H总 × S每道) H × S每道 S - 1其中H总 × S每道 一个柱面的扇区总数扇区号S从 1 开始LBA 从 0 开始所以要减 1柱面号和磁头号都是从 0 开始编号LBA → CHSC LBA ÷ (H总 × S每道) // 取整 H (LBA % (H总 × S每道)) ÷ S每道 // 取整 S (LBA % S每道) 1计算机开机时磁盘内部会自动维护柱面数、磁头数、每道扇区数等参数操作系统启动时会获取这些参数来完成地址转换。知识点总结LBA 是线性地址从 0 开始编号CHS 是三维地址扇区从 1 开始编号。两者可以互相转换转换公式其实就是一个进制换算的过程。有了 LBA操作系统就可以用一个简单的整数来访问磁盘的任意扇区不再需要关心复杂的磁盘物理结构。从此以后磁盘在 OS 眼中就是一个以扇区为元素的一维大数组。二、引入文件系统2.1 引入块的概念为什么需要块磁盘是典型的块设备。如果操作系统一个个扇区512 字节地读取效率太低了。因此操作系统采用了一次性读取多个连续扇区的策略——这些连续扇区合在一起就叫一个块Block。块的大小块的大小在格式化时确定之后不可更改最常见的块大小是4 KB 8 个扇区8 × 512 B块是文件存取的最小单位即使文件只有 1 个字节也要占用一个块块与 LBA 的关系知道 LBA块号 LBA ÷ 8 知道块号该块的第一个扇区 LBA 块号 × 8一句话总结磁盘是三维的 → 抽象成 LBA 一维数组 → 再把 8 个连续扇区合并成一个块 → 最终以块为单位管理数据。知识点总结块是文件系统管理存储空间的基本单位通常为 4KB8 个扇区。引入块的原因很简单每次只读 512 字节太慢了操作系统希望一次多读点数据来提高 I/O 效率。块在格式化时确定大小后续不可更改并且文件哪怕只有 1 字节也要占用整整一个块。这不是浪费而是为了效率必须付出的代价。2.2 引入分区概念什么是分区分区就是把一块物理磁盘逻辑上分成多个独立区域。以 Windows 为例一块磁盘可以分成 C 盘、D 盘、E 盘这些就是分区。分区的本质分区的本质是对硬盘的一种格式化通过设定起始柱面和结束柱面来划分区域。柱面是分区的最小单位。Linux 下的分区Linux 下一切皆文件磁盘设备也是以文件形式存在的比如/dev/sda1、/dev/sda2等。思考分区后每个分区可以独立格式化不同的文件系统ext4、NTFS、FAT32 等互不干扰。知识点总结分区就是把一块硬盘切成几个独立的逻辑区域每一个区域都可以单独格式化成不同的文件系统。柱面是分区的最小单位分区本质上就是设定起始柱面和结束柱面。在 Linux 中分区设备也以文件形式呈现如/dev/sda1体现了一切皆文件的思想。2.3 引入inode概念文件的本质文件 数据 属性数据文件的内容比如文本里的文字、图片的像素信息属性文件的元数据大小、权限、所有者、修改时间等使用ls -l可以看到文件的属性-rw-r--r--. 2 root root 0 Dec 25 10:00 abc共 7 列模式文件类型 权限硬链接数文件所有者所属组大小最后修改时间文件名使用stat命令可以看到更详细的属性信息。inode 是什么inodeindex node索引节点是存储文件属性的数据结构Linux 下文件的属性和内容是分离存储的每一个文件都有一个对应的 inode每个 inode 有唯一的标识符叫做inode 号inode 数据结构ext2 中的定义structext2_inode{__le16 i_mode;/* 文件模式类型 权限 */__le16 i_uid;/* 所有者 UID低 16 位 */__le32 i_size;/* 文件大小字节 */__le32 i_atime;/* 最后访问时间 */__le32 i_ctime;/* 创建时间 */__le32 i_mtime;/* 最后修改时间 */__le32 i_dtime;/* 删除时间 */__le16 i_gid;/* 所属组 GID低 16 位 */__le16 i_links_count;/* 硬链接计数 */__le32 i_blocks;/* 文件占用的块数 */__le32 i_flags;/* 文件标志 */// ...__le32 i_block[EXT2_N_BLOCKS];/* 数据块指针数组用于映射数据块位置 */// ...};/* 块指针常量定义 */#defineEXT2_NDIR_BLOCKS12/* 12 个直接块指针 */#defineEXT2_IND_BLOCKEXT2_NDIR_BLOCKS/* 第 13 个一级间接块指针 */#defineEXT2_DIND_BLOCK(EXT2_IND_BLOCK1)/* 第 14 个二级间接块指针 */#defineEXT2_TIND_BLOCK(DIND_BLOCK1)/* 第 15 个三级间接块指针 */#defineEXT2_N_BLOCKS(EXT2_TIND_BLOCK1)/* 总共 15 个块指针 */关于 inode 的重要说明文件名不在 inode 中——文件名存储在目录文件的数据块里与 inode 号组成映射关系inode 大小固定——一般为 128 字节或 256 字节文件内容可以大小不一但 inode 大小是固定的每个文件都有一个 inode——包括目录文件本身知识点总结inode 就是文件的身份证里面存储了文件的所有属性信息大小、权限、时间戳等但不包含文件名。Linux 把文件的内容和属性分开存储属性放在 inode 中内容放在数据块中。每个 inode 有一个唯一的 inode 号操作系统通过 inode 号来识别和管理文件。inode 的大小是固定的128B 或 256B无论文件内容多大inode 占用的空间都一样。三、ext2 文件系统3.1 宏观认识要在一个分区上存储文件必须先将其格式化写入文件系统。文件系统的作用就是组织和管理磁盘上的文件。ext2Second Extended File System是 Linux 中最经典的文件系统之一。它的核心设计思想是将整个分区划分成若干个大小相同的块组Block Group只要能管理好一个块组就能管理所有块组也就能管理整个分区的所有文件。知识点总结ext2 文件系统把分区切成若干个同样大小的块组每个块组内部结构完全相同。这种分而治之的设计思想使得文件系统结构清晰、易于管理。只要理解了单个块组的组成就理解了整个 ext2 文件系统。3.2 Block Group块组每个块组内部包含以下 6 个组成部分组成部分存放内容作用超级块Super Block文件系统全局信息描述整个分区的 inode 总量、block 总量、空闲数等块组描述符表GDT块组属性信息每个块组对应一个描述符记录该块组的位置信息块位图Block Bitmap数据块占用情况每个 bit 表示一个数据块是否被占用inode 位图Inode Bitmapinode 占用情况每个 bit 表示一个 inode 是否被占用inode 表Inode Table所有 inode 的集合存储该块组内所有文件的属性信息数据块区Data Block文件实际内容存放文件数据的真正区域知识点总结每个块组就像一个小社区里面有户口本超级块GDT记录全局信息“门牌号”位图标记哪些位置被占了“居民信息”inode 表记录每个人的身份“住房”数据块存放实际物品。这种分层管理的方式让文件系统能够高效地分配和回收存储空间。3.3 块组内部各组成部分详解3.3.1 超级块Super Block超级块存放文件系统本身的结构信息是整个分区的总目录。记录的信息包括但不限于block 和 inode 的总量未使用的 block 和 inode 数量一个 block 和 inode 的大小文件系统的挂载时间、最近写入时间等注意超级块在每个块组的开头都有一份拷贝第一个块组必须有后面的块组可以没有。这么做是为了冗余备份——如果第一个块组的超级块损坏了可以从后面的块组恢复。3.3.2 GDTGroup Descriptor Table——块组描述符表GDT 描述每个块组的属性信息例如该块组的块位图存放在哪个块该块组的 inode 位图存放在哪个块该块组的 inode 表起始位置分区分成多少个块组GDT 中就有多少个块组描述符。3.3.3 块位图Block Bitmap块位图用一个 bit 对应一个数据块bit 0该数据块空闲可用bit 1该数据块已被占用这样文件系统要分配新数据块时只需要在位图中找到第一个为 0 的 bit 即可。3.3.4 inode 位图Inode Bitmap和块位图原理相同但管理的是inodebit 0该 inode 空闲可用bit 1该 inode 已被占用3.3.5 inode 表Inode Tableinode 表是当前块组内所有 inode 的集合每个 inode 存储一个文件的属性信息大小、权限、时间戳等。重要inode 编号以分区为单位整体划分不可跨分区。也就是说不同分区的 inode 号可能重复。3.3.6 数据块区Data Block数据块区是真正存放文件内容的区域。对于不同类型的文件用途不同普通文件数据块存放文件内容目录文件数据块存放该目录下所有文件名与 inode 号的映射关系符号链接如果链接路径较短直接存在 inode 中较长则占用数据块重要块号也以分区为单位划分不可跨分区。知识点总结块组的六个组成部分各司其职超级块是全局户口本GDT 是各社区地址簿块位图和 inode 位图是占用标记表inode 表是居民信息档案数据块区是真正的储物空间。文件系统通过这套机制把文件的内容和属性有条理地组织在磁盘上。3.4 inode 与 Data Block 的映射核心问题文件内容可能非常大而 inode 里只有 15 个块指针i_block[15]如何映射任意大小的文件解决方案——多级索引重点ext2 采用直接 间接的多级索引方案i_block[0] ~ i_block[11] → 12 个直接块指针直接指向数据块 i_block[12] → 一级间接块指针 i_block[13] → 二级间接块指针 i_block[14] → 三级间接块指针假设块大小为 4KB每个块指针占 4 字节级别可管理的块数可管理的最大数据量直接12 个12 块12 × 4KB 48KB一级间接1024 块1024 × 4KB 4MB二级间接1024² 1,048,576 块4GB三级间接1024³ 1,073,741,824 块4TB合计≈ 1,074,790,436 块≈ 4TB一个 4KB 的块可以存放 1024 个指针4KB ÷ 4B 1024这就是间接块能管理 1024 个块的原因。创建新文件的 4 个步骤当你创建一个新文件时文件系统做了以下 4 件事存储属性内核在 inode 位图中找到一个空闲的 inode将文件信息记录到其中存储数据在块位图中找到空闲的数据块将数据写入记录分配情况在 inode 的i_block[]数组中记录数据块的位置添加文件名到目录在目录文件的数据块中添加一条记录——(inode号, 文件名)知识点总结inode 通过 15 个块指针12 个直接 1 个一级间接 1 个二级间接 1 个三级间接实现了对大文件的灵活映射。小文件直接用直接块指针访问速度快大文件通过多级索引逐层跳转虽然多几次读取但能支持最大 TB 级别的文件。这种设计在空间利用率和访问效率之间取得了很好的平衡。创建文件时系统依次完成分配 inode → 写入数据 → 记录块位置 → 添加到目录四步缺一不可。3.5 目录与文件名目录也是文件你可能觉得目录是一个文件夹但在 Linux 文件系统中磁盘上没有目录这个概念只有文件属性和文件内容目录本质上是一个特殊文件——它的内容是文件名与 inode 号的映射关系表目录的数据块里存了什么目录文件的数据块存储的是这样的一张表inode 号文件名2.2…263466abc263467def.和..也是目录项分别代表当前目录和父目录。问题解答问我们访问文件都是用的文件名没用过 inode 号啊答当你输入文件名时操作系统会去目录文件中查找该文件名对应的 inode 号然后通过 inode 号找到文件的属性和数据。文件名只是给用户看的标签内核真正关心的是 inode 号。读取目录内容的代码示例/* readdir.c - 读取目录内容显示文件名和 inode 号 */#includestdio.h#includedirent.h#includesys/types.hintmain(){/* 打开当前目录 */DIR*diropendir(.);if(dirNULL){perror(打开目录失败);return1;}structdirent*entry;/* 循环读取目录中的每一项 */while((entryreaddir(dir))!NULL){/* 打印 inode 号和文件名 */printf(inode: %lu, 文件名: %s\n,entry-d_ino,entry-d_name);}/* 关闭目录 */closedir(dir);return0;}知识点总结目录也是文件它的特殊之处在于数据块存储的不是普通内容而是文件名 → inode 号的映射表。我们平时用文件名访问文件操作系统会通过目录文件找到对应的 inode 号然后通过 inode 找到文件的属性和数据块位置。所以文件名只是给人类看的标签inode 才是内核识别文件的真正依据。3.6 路径解析什么是路径解析当我们访问一个文件路径比如/home/whb/code/test/test.c操作系统需要从根目录开始依次查找每一级目录最终定位到目标文件。这个过程就叫路径解析。路径解析的过程从根目录/开始根目录的 inode 号固定为 2读取根目录的数据块找到home目录对应的 inode 号根据 inode 号读取home目录的属性再读取其数据块找到whb目录的 inode 号重复上述步骤依次找到code→test→test.c最终得到test.c的 inode 号通过 inode 找到文件的属性和数据块为什么要这么做因为文件名存储在目录文件中而文件属性和数据在其他地方。所以每一步都需要先读目录的内容才知道下一步该查哪个 inode。知识点总结路径解析就是从根目录开始一层层地翻目录每次读取当前目录的数据块找到下一级目录的 inode 号直到最终找到目标文件。这个过程体现了 Linux 文件系统目录名 → inode → 数据块的三层访问结构。路径越长需要读取的目录层数就越多I/O 次数也越多——所以路径缓存机制就显得尤为重要。3.7 路径缓存dentry问题每次访问文件都重新做路径解析效率太低特别是频繁访问的目录。解决办法Linux 内核在内存中维护了一个树状缓存结构叫做dentryDirectory Entry。它缓存了已经解析过的路径路径中每个节点对应的 inode 信息这样下次访问同一个路径时内核可以直接从 dentry 缓存中获取 inode 信息省去了反复读取目录磁盘块的开销。struct dentry是内核中用于路径缓存的核心结构体。知识点总结dentry 是 Linux 内核中的路径缓存机制它把已经解析过的路径记住在内存中。下次再访问同样的路径时就不需要重新从磁盘读取目录数据了直接走内存缓存速度会快很多。这是一种典型的空间换时间策略——用内存空间换取磁盘 I/O 时间的节省。3.8 挂载分区什么是挂载分区格式化为文件系统后不能直接使用必须将它关联到系统目录树上的某个目录这个操作就叫挂载mount。挂载实验# 第一步制作一个 5MB 的磁盘镜像文件ddif/dev/zeroof./disk.imgbs1Mcount5# 第二步格式化写入 ext4 文件系统mkfs.ext4 disk.img# 第三步创建一个空目录作为挂载点mkdir/mnt/mydisk# 第四步挂载将 disk.img 关联到 /mnt/mydisksudomount-text4 ./disk.img /mnt/mydisk/# 第五步查看系统已挂载的分区df-h# 第六步卸载分区sudoumount/mnt/mydisk/结论分区必须挂载才能使用——不挂载的操作系统不知道该分区的文件从哪个目录开始找路径前缀决定分区归属——系统根据访问路径的前缀来判断属于哪个分区。比如/mnt/mydisk下的文件就去 disk.img 分区找/home下的文件去对应分区找知识点总结挂载就是把一个分区粘到系统目录树的某个目录节点上这样访问该目录及其子目录就相当于访问那个分区。不挂载的分区无法被用户直接使用——操作系统根本不知道它在哪里。挂载点是目录树上的一个空目录一个分区只能挂载到一个挂载点一个挂载点也只能挂载一个分区。路径的前缀决定了文件属于哪个分区。四、软硬链接4.1 硬链接原理真正找到磁盘上文件的不是文件名而是inode。Linux 允许多个文件名指向同一个 inode这就是硬链接。示例# 创建原始文件 abctouchabc# 创建硬链接 def指向同一个 inodelnabc def# 查看两个文件的 inode 号和属性ls-liabc def输出结果263466 -rw-r--r--. 2 root root 0 abc 263466 -rw-r--r--. 2 root root 0 def可以看到abc和def的 inode 号完全相同263466硬链接数变为 2在-rw-r--r--.后面的那个数字删除文件时发生了什么删除文件时系统做了两件事在目录中删除该文件名对应的记录将 inode 中的硬链接计数减 1只有当硬链接计数变为 0 时系统才真正释放 inode 和数据块。所以 Linux 中删除文件的操作准确叫解除链接unlink。知识点总结硬链接的本质就是给同一个 inode 起多个不同的名字。删除任意一个名字只是删除目录中的一条记录只要还有别的名字指向这个 inode文件数据就还在。只有当所有硬链接都被删除链接计数归零文件才被真正从磁盘上抹去。ls -l输出中第二列显示的就是硬链接数。4.2 软链接原理软链接符号链接和硬链接不同它通过文件名引用目标文件而不是通过 inode。示例# 创建原始文件 abctouchabc# 创建软链接 abc.s 指向 abcln-sabc abc.s# 查看详细信息ls-li输出结果263466 -rw-r--r--. 2 root root 0 abc 261678 lrwxrwxrwx. 1 root root 3 abc.s - abc可以看到abc和abc.s的 inode 号不同一个是 263466另一个是 261678abc.s的文件类型是llink表示这是一个软链接abc.s的文件大小是 3 个字节刚好等于abc这个字符串的长度权限是lrwxrwxrwx软链接的权限通常是 777但实际权限由目标文件决定知识点总结软链接是一个独立的文件有自己的 inode 和数据块。它的数据块里存储的是目标文件的路径名字符串。访问软链接时操作系统会自动跳转到这个路径。软链接的用途类似于 Windows 的快捷方式——它可以跨分区、跨文件系统甚至指向一个不存在的文件创建后目标被删除软链接就变成断链。4.3 软硬链接对比对比项硬链接软链接inode 号与原文件相同与原文件不同独立文件跨分区不可以可以跨文件系统不可以可以链接目标被删除文件数据还在其他硬链接仍可访问变成断链无法访问对目录链接不可以但.和..是特例可以本质文件名 → inode 的额外映射独立的文件内容存的是路径知识点总结硬链接是 inode 层面的链接软链接是文件名层面的链接。硬链接不能跨分区、不能链接目录但更稳固——只要还有一个硬链接存在文件数据就不会丢。软链接可以跨分区、可以链接目录但目标被删除后就变成死链接。4.4 软硬链接的用途硬链接的用途目录中的.和..就是硬链接.指向当前目录..指向父目录这也是目录的硬链接数至少为 2 的原因文件备份创建硬链接实现即时备份不占用额外磁盘空间只在原文件被彻底删除时才占用空间的特性适合做快照软链接的用途快捷方式——就像 Windows 的桌面快捷方式简化路径——将长路径映射为短路径版本管理——如linux - linux-5.10.1更新时只需改链接指向跨分区引用——硬链接做不到的事软链接可以知识点总结硬链接的典型应用是目录中的.和..以及文件快照备份——多个名字共享同一个 inode不额外占用磁盘空间删除任何一个都不影响其他名字。软链接则像 Windows 的快捷方式灵活轻便、可以跨分区适合做路径简化和版本切换。两者各有适用场景理解它们的区别能在实际工作中做出更合适的选择。总结完整的数据访问流程通过以上学习我们终于可以串起一条完整的数据访问链路用户输入路径 → 路径解析逐层查找目录→ dentry 缓存加速 → 找到目标文件的 inode → 读取 inode 属性 → 通过 i_block[] 找到数据块 → 读取文件内容整个过程涉及的关键概念概念作用扇区磁盘读写的最小单位512 字节块文件系统管理的最小单位通常 4KB分区将磁盘划分为独立区域块组ext 文件系统划分分区的基本单元超级块文件系统全局信息inode存储文件属性数据块存储文件内容dentry路径缓存挂载将分区与目录树关联硬链接多个文件名共享同一 inode软链接一个文件存储另一个文件的路径知识点总结从磁盘物理结构到文件系统逻辑从 CHS 到 LBA从 inode 到数据块从路径解析到挂载从软硬链接到实际用途——这就是 Ext 系列文件系统的完整知识体系。核心思想可以归纳为一句话磁盘是硬件文件系统是软件文件系统的作用就是把硬件的存储能力包装成方便用户使用的文件和目录结构。理解了这一整套机制你就掌握了 Linux 文件系统的底层密码。