在 Linux 系统中,文件系统是连接用户数据与硬件磁盘的核心桥梁。无论是日常的文件读写,还是系统的启动与运行,都离不开文件系统的高效管理。Ext 系列(Ext2/Ext3/Ext4)作为 Linux 下最经典的文件系统,其设计思想深刻影响了后续诸多文件系统的发展。本文将从磁盘物理结构入手,逐步剖析 Ext 系列文件系统的原理,带你理解分区、格式化、路径解析、挂载等关键过程,最终掌握软硬链接的本质与用途,构建完整的文件系统知识体系。
一、磁盘基础:从物理结构到逻辑地址
要理解文件系统,首先需要搞清楚 “文件存储的载体 —— 磁盘” 的工作原理。磁盘作为计算机中唯一的机械设备,其物理结构决定了数据的存储与读取方式,而逻辑地址则是操作系统与磁盘交互的 “通用语言”。
1.1 磁盘物理结构:机械臂与扇区的协作
机械磁盘的核心结构可类比为 “多叠光盘 + 可移动读写笔”,具体包括以下组件:
盘片(Platter):圆形金属盘,表面涂有磁性材料,用于存储数据;一个磁盘通常包含多个盘片(如 2-8 片)。
磁头(Head):每片盘片的上下两面各对应一个磁头,用于读取 / 写入磁盘表面的磁性信号;所有磁头固定在同一根磁头臂上,只能 “共进退”(同时移动到相同半径的磁道)。
磁道(Track):盘片表面被划分成多个同心圆,每个同心圆就是一个磁道;磁道从外圈到内圈编号(0 磁道、1 磁道...),靠近主轴的磁道不存储数据(用于磁头停靠)。
柱面(Cylinder):所有盘片中,半径相同的磁道共同构成一个柱面;由于磁头 “共进退”,柱面是磁盘访问的最小单位(切换柱面需要移动磁头臂,耗时较长)。
扇区(Sector):每个磁道被切分成多个扇形区域,即扇区;扇区是磁盘最小存储单位,默认大小为 512 字节(部分新磁盘支持 4KB 扇区)。
磁盘容量的计算公式为:磁盘容量 = 磁头数 × 柱面数 × 每磁道扇区数 × 每扇区字节数例如,一个磁盘有 2 个磁头、1024 个柱面、每磁道 63 个扇区,则容量为 2 × 1024 × 63 × 512B = 64.8MB。
1.2 磁盘寻址方式:CHS 与 LBA 的转换
要读取磁盘上的数据,必须先定位到具体的扇区。操作系统早期采用 CHS 寻址,后来发展为更通用的 LBA 寻址。
1.2.1 CHS 寻址:基于物理结构的定位
CHS(Cylinder-Head-Sector,柱面 - 磁头 - 扇区)是最早的磁盘寻址方式,直接对应磁盘的物理结构:
步骤 1:移动磁头臂,将所有磁头定位到目标柱面(确定半径);
步骤 2:选择目标磁头(确定盘片的某一面);
步骤 3:等待磁盘旋转,当目标扇区到达磁头下方时,开始读写。
局限性:CHS 寻址的地址位数有限(早期系统用 8 位存磁头、10 位存柱面、6 位存扇区),最大支持容量仅为 256 × 1024 × 63 × 512B = 8.4GB,无法满足大磁盘需求。
1.2.2 LBA 寻址:线性化的逻辑地址
为解决 CHS 的容量限制,操作系统引入了 LBA(Logical Block Address,逻辑块地址),将磁盘抽象为一个 “扇区数组”:
每个扇区对应一个唯一的线性地址(从 0 开始编号),例如磁盘有 83886080 个扇区,则 LBA 地址范围是 0~83886079;
操作系统只需使用 LBA 地址即可访问扇区,磁盘内部的固件(硬件电路) 会自动将 LBA 转换为 CHS 物理地址。
LBA 与 CHS 的转换公式(假设磁盘参数:磁头数 H、每磁道扇区数 S):
CHS 转 LBA:LBA = 柱面号 C × (H × S) + 磁头号 Hd × S + 扇区号 Se - 1(扇区号从 1 开始,LBA 从 0 开始,需减 1);
LBA 转 CHS:柱面号 C = LBA // (H × S)(整除,得到目标柱面);磁头号 Hd = (LBA % (H × S)) // S(取余后整除,得到目标磁头);扇区号 Se = (LBA % S) + 1(取余后加 1,得到目标扇区)。
例如,磁盘参数为 H=2、S=63,LBA=1000:C = 1000 // (2×63) = 7(第 7 个柱面);Hd = (1000 % 126) // 63 = 1(第 1 个磁头);Se = (1000 % 63) + 1 = 49(第 49 个扇区)。
从此,操作系统无需关心磁盘的物理结构,只需通过 LBA 地址即可访问任意扇区 —— 磁盘在逻辑上成为了一个 “一维扇区数组”。
二、文件系统的核心概念:块、分区与 inode
磁盘的逻辑地址解决了 “如何定位单个扇区” 的问题,但文件系统需要解决 “如何组织多个扇区存储文件” 的问题。为此,文件系统引入了 “块”“分区”“inode” 三个核心概念,构建了从磁盘到文件的分层管理模型。
2.1 块(Block):文件存取的最小单位
扇区(512B)太小,若每次读写都操作单个扇区,会导致系统调用频繁、效率低下。因此,文件系统将连续的多个扇区组合成一个 “块”,作为文件存取的最小单位:
常见块大小为 4KB(即 8 个扇区),也支持 1KB、2KB、8KB 等(由格式化时指定,不可修改);
块地址与 LBA 的转换:块号 = LBA // 块扇区数(如 LBA=1000,块大小 4KB(8 扇区),则块号 = 1000//8=125);LBA = 块号 × 块扇区数 + 块内扇区号(如块号 = 125,块内第 3 个扇区,LBA=125×8+3=1003)。
通过 stat 命令可查看文件的块信息:
[whb@bite-alicloud stdio]$ stat main.c
File: main.c
Size: 488 Blocks: 8 IO Block: 4096 regular file
# Size:文件实际大小(488B);Blocks:占用的块数(8×512B=4KB,即 1 个 4KB 块);IO Block:块大小(4096B=4KB)
2.2 分区(Partition):磁盘的 “逻辑切片”
一块磁盘容量可能很大(如 1TB),若直接管理整个磁盘,会导致文件系统过于庞大、故障风险高。因此,磁盘需要先进行分区,将其划分为多个独立的 “逻辑磁盘”(如 Windows 的 C/D/E 盘,Linux 的 /dev/vda1、/dev/vda2):
分区本质:指定磁盘的 “起始柱面” 和 “结束柱面”,将连续的柱面划分为一个分区;
分区单位:柱面(由于磁头 “共进退”,柱面是最小的连续存储单元);
Linux 分区表示:磁盘设备文件为 /dev/vda(第一块虚拟磁盘)、/dev/sda(第一块物理磁盘),分区为 /dev/vda1(第一块磁盘的第一个分区)、/dev/vda2 等。
通过 fdisk -l 命令可查看磁盘分区信息:
[root@bite-alicloud ~]# fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83875364 41936658+ 83 Linux
# /dev/vda1:分区设备名;Start/End:起始/结束扇区;Blocks:分区大小(41936658×512B≈20GB);System:文件系统类型(Linux)
2.3 inode:文件属性的 “身份证”
文件的本质是 “属性 + 内容”:
内容:存储在数据块(Block)中;
属性:如文件名、大小、权限(rwx)、所有者、修改时间等,需要单独存储 —— 这就是 inode(Index Node,索引节点)的作用。
2.3.1 inode 的核心特征
唯一性:每个文件对应一个唯一的 inode,每个 inode 有一个唯一的 inode 号(以分区为单位编号,不可跨分区);
固定大小:inode 大小通常为 128 字节或 256 字节(由格式化时指定),无论文件内容多大,其 inode 大小固定;
属性存储:inode 中存储文件的所有属性,但不包含文件名(文件名存储在目录中,后续详解)。
通过 ls -i 命令可查看文件的 inode 号:
[whb@bite-alicloud stdio]$ ls -li
1052007 -rw-rw-r-- 1 whb whb 488 Oct 17 19:06 main.c
# 1052007:inode 号;main.c:文件名(与 inode 号对应)
2.3.2 inode 结构体(Ext2 为例)
inode 的具体结构定义在 Linux 内核源码中(/usr/src/kernels/xxx/include/linux/ext2_fs.h),核心字段如下:
struct ext2_inode {
__le16 i_mode; // 文件类型与权限(如 0644 表示普通文件,所有者读写)
__le16 i_uid; // 所有者 UID
__le32 i_size; // 文件大小(字节)
__le32 i_atime; // 最后访问时间
__le32 i_mtime; // 内容最后修改时间
__le32 i_ctime; // 属性最后修改时间
__le16 i_gid; // 所属组 GID
__le16 i_links_count; // 硬链接数
__le32 i_blocks; // 占用的块数
__le32 i_block[EXT2_N_BLOCKS]; // 数据块指针(EXT2_N_BLOCKS=15,指向存储内容的块)
};
其中,i_block 是 inode 与数据块的 “桥梁”—— 通过这 15 个指针,可找到文件内容所在的所有数据块(后续详解指针映射逻辑)。
三、Ext2 文件系统:块组与分层管理
有了块、分区、inode 的基础,接下来我们深入 Ext2 文件系统的核心 —— 它通过 “块组(Block Group)” 将分区划分为多个独立的管理单元,实现高效的文件组织与故障隔离。
3.1 Ext2 整体架构:从分区到块组
Ext2 文件系统将整个分区划分为若干个大小相等的块组(Block Group),每个块组的结构完全相同。这种设计的优势在于:
减少磁头移动距离(同一文件的内容尽量存储在同一块组);
故障隔离(单个块组损坏不影响其他块组)。
分区的结构如下(从左到右):
- 引导块(Boot Block):1KB 大小,存储分区引导信息(如 GRUB 引导程序),不属于任何块组;
- 块组 0 ~ 块组 N:每个块组包含超级块、块组描述符表、位图、inode 表、数据块等组件。
3.2 块组内部结构:6 大核心组件
每个块组是 Ext2 文件系统的 “最小管理单元”,其内部结构如下(从上到下):
3.2.1 超级块(Super Block):文件系统的 “说明书”
超级块存储整个文件系统的全局信息,是文件系统的核心,主要内容包括:
块总数、inode 总数、空闲块数、空闲 inode 数;
块大小、inode 大小、每个块组的块数 /inode 数;
最近挂载时间、最近写入时间、文件系统状态(如正常 / 错误)。
关键特性:超级块在每个块组的开头都有一份拷贝(块组 0 必须有,其他块组可选),用于防止超级块损坏导致整个文件系统失效。
3.2.2 块组描述符表(GDT):块组的 “索引卡”
块组描述符表由多个块组描述符(struct ext2_group_desc)组成,每个块组对应一个描述符,记录该块组的具体信息:
块位图、inode 位图、inode 表的起始块号;
该块组的空闲块数、空闲 inode 数、目录数。
与超级块类似,GDT 在每个块组中也有拷贝,确保可靠性。
3.2.3 块位图(Block Bitmap):数据块的 “占用状态表”
块位图是一个二进制数组,每个 bit 对应一个数据块,用于标记数据块是否空闲:
bit=0:数据块空闲,可分配;
bit=1:数据块已占用,不可分配。
例如,块位图的第 5 个 bit 为 1,表示该块组的第 5 个数据块已被使用。通过块位图,文件系统可快速找到空闲的数据块,无需遍历所有块。
3.2.4 inode 位图(Inode Bitmap):inode 的 “占用状态表”
与块位图类似,inode 位图也是一个二进制数组,每个 bit 对应一个 inode,标记 inode 是否空闲:
bit=0:inode 空闲,可分配;
bit=1:inode 已占用,不可分配。
例如,inode 位图的第 10 个 bit 为 1,表示该块组的第 10 个 inode 已被使用。
3.2.5 inode 表(Inode Table):文件属性的 “仓库”
inode 表是连续的块,用于存储该块组所有 inode 的具体内容(即 struct ext2_inode 结构体)。每个 inode 占固定大小(如 128 字节),因此 inode 表的大小 = 块组 inode 数 × inode 大小。
例如,一个块组有 1024 个 inode,每个 inode 128 字节,则 inode 表占用 1024 × 128B = 128KB,若块大小为 4KB,则占用 32 个块。
3.2.6 数据块(Data Blocks):文件内容的 “存储区”
数据块是块组的最后一部分,用于存储文件的实际内容。根据文件类型,数据块的用途不同:
普通文件:存储文件的文本、二进制等数据;
目录:存储该目录下的 “文件名 + inode 号” 映射关系(目录也是文件,后续详解);
链接文件:硬链接不占用数据块(仅复用 inode),软链接占用数据块(存储目标文件路径)。
3.3 inode 与数据块的映射:15 个指针的巧妙设计
inode 中的 i_block[15] 字段是连接文件属性与内容的关键,它通过 15 个指针实现数据块的高效映射,分为以下四种类型:
- 12 个直接指针:前 12 个指针直接指向存储文件内容的数据块;若块大小为 4KB,这 12 个指针可存储
12 × 4KB = 48KB的文件。 - 1 个一级间接指针:第 13 个指针指向一个 “间接块”,该块中存储的是 “数据块的指针”(而非内容);若每个指针 4 字节,一个间接块可存储
4KB / 4B = 1024个指针,对应1024 × 4KB = 4MB的文件。 - 1 个二级间接指针:第 14 个指针指向一个 “一级间接块”,该块中的每个指针又指向一个 “二级间接块”,二级间接块再指向数据块;可存储
1024 × 1024 × 4KB = 4GB的文件。 - 1 个三级间接指针:第 15 个指针指向一个 “二级间接块”,再嵌套一层间接块;可存储
1024 × 1024 × 1024 × 4KB = 4TB的文件。
这种分层映射设计,既保证了小文件的高效访问(直接指针),又支持超大文件的存储(多级间接指针)。
3.4 文件创建的完整流程:从 inode 到目录
以创建 touch abc 为例,Ext2 文件系统的处理流程如下:
- 分配 inode:遍历 inode 位图,找到一个空闲 inode(如 inode 号 263466),将其标记为占用,并写入文件属性(如权限 0644、所有者 UID 等)。
- 分配数据块:若文件有内容(如
echo "hello" > abc),遍历块位图,找到空闲数据块(如块 300、500、800),将数据写入这些块,并在 inode 的i_block中记录块号。 - 更新目录:目录文件的内容是 “文件名 + inode 号” 的映射,系统在当前目录的数据块中添加一条记录(
abc:263466),建立文件名与 inode 的关联。 - 更新元数据:减少超级块和块组描述符表中的 “空闲 inode 数” 和 “空闲块数”,更新最近写入时间。
四、目录与路径:文件访问的 “导航系统”
我们平时访问文件时,使用的是 “路径 + 文件名”(如 /home/whb/main.c),但文件系统真正识别的是 inode 号。那么,目录和路径是如何将 “文件名” 转换为 “inode 号” 的呢?
4.1 目录的本质:存储 “文件名 - inode” 映射的文件
在 Linux 中,目录也是文件—— 它的属性存储在 inode 中,内容存储在数据块中,而数据块的内容就是 “文件名与 inode 号的映射表”。
例如,/home/whb 目录的数据块内容可能如下:
| 文件名 | inode 号 | |
|---|---|---|
| . | 1596259 | (当前目录的 inode 号) |
| .. | 1596258 | (父目录 /home 的 inode 号) |
| main.c | 1596260 | (普通文件的 inode 号) |
| test | 1596261 | (子目录的 inode 号) |
通过 readdir 系统调用可读取目录的内容(即 “文件名 - inode” 映射),示例代码如下:
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 2) { fprintf(stderr, "Usage: %s <directory>\n", argv[0]); exit(1); }
DIR *dir = opendir(argv[1]); // 打开目录
if (!dir) { perror("opendir"); exit(1); }
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) { // 读取目录内容
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
printf("Filename: %s, Inode: %lu\n", entry->d_name, (unsigned long)entry->d_ino);
}
closedir(dir);
return 0;
}
运行结果(读取根目录 /):
[whb@bite ~]$ ./readdir /
Filename: home, Inode: 786433
Filename: etc, Inode: 262145
Filename: bin, Inode: 13
4.2 路径解析:从根目录到目标文件的 “递归导航”
访问文件时,系统需要将路径(如 /home/whb/main.c)解析为对应的 inode 号,流程如下:
- 从根目录开始:根目录(
/)的 inode 号是固定的(通常为 2),系统开机后直接加载其 inode; - 解析每一级目录:
- 打开根目录,根据 “home” 文件名找到对应的 inode 号(如 786433);
- 打开
/home目录,根据 “whb” 文件名找到对应的 inode 号(如 1596259); - 打开
/home/whb目录,根据 “main.c” 文件名找到对应的 inode 号(如 1596260);
- 访问目标文件:通过 main.c 的 inode 号,找到其数据块,读取文件内容。
路径缓存(dentry 缓存):为避免每次访问文件都从根目录重新解析,Linux 内核会在内存中维护一个 dentry 缓存(struct dentry 结构体),存储已解析的 “路径 - inode” 映射。下次访问同一文件时,直接从缓存中获取 inode,大幅提升效率。
struct dentry 结构体的核心字段:
struct dentry {
struct inode *d_inode; // 对应的 inode 指针
struct dentry *d_parent; // 父目录的 dentry 指针
struct qstr d_name; // 文件名
struct list_head d_subdirs;// 子目录的 dentry 链表
};
这些字段在内存中形成一棵 “目录树”,与磁盘上的目录结构一致,实现路径的快速查找。
五、挂载:分区与目录的 “绑定”
分区在格式化后,虽然包含了 Ext2 文件系统的结构,但仍无法直接使用 —— 需要通过 “挂载(mount)” 将分区与某个目录绑定,才能通过该目录访问分区中的文件。
5.1 挂载的本质:建立文件系统与目录树的关联
挂载的核心是 “将分区的文件系统挂载到 Linux 目录树的某个节点(挂载点)”,使得:
访问挂载点目录时,实际访问的是分区中的文件系统;
分区中的文件被整合到 Linux 统一的目录树中,用户无需关心分区边界。
例如,将 /dev/vda1 分区(Ext2 文件系统)挂载到 /mnt/mydisk 目录后,ls /mnt/mydisk 显示的是 /dev/vda1 分区中的文件。
5.2 挂载操作的实际流程
以挂载一个 Ext4 格式的磁盘镜像文件为例:
- 创建挂载点:创建一个空目录作为挂载点(如
/mnt/mydisk);bash
[whb@bite ~]$ mkdir /mnt/mydisk - 准备磁盘镜像:创建一个 5MB 的空文件,格式化为 Ext4 文件系统;
bash
[whb@bite ~]$ dd if=/dev/zero of=./disk.img bs=1M count=5 # 创建 5MB 空文件 [whb@bite ~]$ mkfs.ext4 disk.img # 格式化为 Ext4 文件系统 - 执行挂载:使用
mount命令将磁盘镜像挂载到/mnt/mydisk;bash
[whb@bite ~]$ sudo mount -t ext4 ./disk.img /mnt/mydisk # -t ext4:指定文件系统类型;./disk.img:要挂载的设备(这里是磁盘镜像);/mnt/mydisk:挂载点 - 验证挂载:通过
df -h命令查看挂载结果;bash
[whb@bite ~]$ df -h Filesystem Size Used Avail Use% Mounted on ./disk.img 4.9M 24K 4.5M 1% /mnt/mydisk - 卸载分区:使用
umount命令解除挂载(挂载点目录必须为空);bash
[whb@bite ~]$ sudo umount /mnt/mydisk
5.3 循环设备(Loop Device):将文件作为块设备
在上述例子中,./disk.img 是一个普通文件,但通过 循环设备(如 /dev/loop0),它被模拟为一个块设备,从而可以被挂载:
循环设备是 Linux 中的一种伪设备(/dev/loop0~/dev/loop7),允许将普通文件作为块设备使用;
mount 命令会自动分配一个空闲的循环设备,将文件与设备绑定,再挂载设备到目录。
通过 ls /dev/loop* 可查看系统中的循环设备:
[whb@bite ~]$ ls /dev/loop* -l
brw-rw---- 1 root disk 7, 0 Oct 17 18:24 /dev/loop0
brw-rw---- 1 root disk 7, 1 Oct 17 18:24 /dev/loop1
# brw:块设备文件;7,0:主设备号和次设备号
六、软硬链接:文件的 “别名” 与 “快捷方式”
在 Linux 中,多个文件名可以对应同一个文件,这就是 “链接(Link)” 的作用。链接分为硬链接(Hard Link)和软链接(Symbolic Link),二者的实现原理和用途截然不同。
6.1 硬链接:共享 inode 的 “别名”
硬链接是 “多个文件名对应同一个 inode 号”,本质是在目录中添加一条 “文件名 - inode” 映射记录,不创建新的 inode 和数据块。
6.1.1 硬链接的创建与特性
通过 ln 源文件 硬链接文件 创建硬链接:
[whb@bite ~]$ touch abc # 创建源文件,inode 号 263466
[whb@bite ~]$ ln abc def # 创建硬链接 def
[whb@bite ~]$ ls -li abc def
263466 -rw-rw-r-- 2 whb whb 0 Oct 28 20:32 abc
263466 -rw-rw-r-- 2 whb whb 0 Oct 28 20:32 def
# 两个文件的 inode 号相同(263466),硬链接数为 2(i_links_count=2)
硬链接的核心特性:
共享 inode:硬链接文件与源文件的 inode 号相同,修改其中一个文件的内容,另一个文件也会同步变化;
硬链接数:inode 的 i_links_count 字段记录硬链接的数量,创建硬链接时该值加 1,删除时减 1;只有当 i_links_count 为 0 时,才会释放 inode 和数据块;
不可跨分区:inode 号以分区为单位编号,跨分区的 inode 号可能重复,因此硬链接无法跨分区创建;
不能链接目录:若允许硬链接目录,会导致目录树出现循环(如 a/b 链接到 a),破坏路径解析逻辑。
6.1.2 硬链接的用途
目录的 . 和 ..:每个目录的 . 是指向自身的硬链接(硬链接数 +1),.. 是指向父目录的硬链接(父目录的硬链接数 +1);
文件备份:创建硬链接可作为文件的 “轻量级备份”,不占用额外磁盘空间,且修改源文件时备份文件同步更新。
6.2 软链接:存储路径的 “快捷方式”
软链接(符号链接)是 “一个独立的文件,其内容是目标文件的路径”,本质是创建一个新的 inode 和数据块,数据块中存储的是目标文件的路径。
6.2.1 软链接的创建与特性
通过 ln -s 源文件 软链接文件 创建软链接:
[whb@bite ~]$ ln -s abc abc.s # 创建软链接 abc.s
[whb@bite ~]$ ls -li abc abc.s
263466 -rw-rw-r-- 2 whb whb 0 Oct 28 20:32 abc
263568 lrwxrwxrwx 1 whb whb 3 Oct 28 20:33 abc.s -> abc
# abc.s 的 inode 号(263568)与源文件不同;权限为 lrwxrwxrwx(l 表示软链接);-> 表示指向目标文件
软链接的核心特性:
独立 inode:软链接是一个独立的文件,有自己的 inode 和数据块(数据块存储目标路径);
依赖目标路径:访问软链接时,系统会根据其存储的路径解析到目标文件;若目标文件被删除或移动,软链接会变成 “无效链接”(显示为红色闪烁);
可跨分区:软链接存储的是目标文件的路径(如 /home/whb/abc),与分区无关,因此可跨分区创建;
可链接目录:软链接可以链接目录(如 ln -s /home/whb /tmp/whb),不会导致目录树循环(因为软链接有独立 inode,路径解析时会识别并跳过)。
6.2.1 软链接的用途
快捷方式:为深层目录或文件创建软链接,简化访问路径(如 ln -s /usr/local/jdk1.8.0_301 /usr/local/jdk);
版本切换:通过修改软链接的指向,实现软件版本的快速切换(如 ln -s jdk1.8 jdk,切换版本时只需重新创建软链接指向 jdk11)。
6.3 软硬链接对比
| 特性 | 硬链接(Hard Link) | 软链接(Symbolic Link) |
|---|---|---|
| inode 号 | 与源文件相同 | 独立 inode 号 |
| 数据块 | 与源文件共享 | 存储目标文件路径 |
| 跨分区 | 不支持 | 支持 |
| 链接目录 | 不支持 | 支持 |
| 目标文件删除后 | 仍可访问(inode 未释放) | 无效链接(红色闪烁) |
| 权限 | 与源文件相同(权限位不生效) | 固定为 lrwxrwxrwx(实际权限由目标文件决定) |
七、总结:Ext 系列文件系统的核心逻辑
Ext 系列文件系统的设计围绕 “高效管理磁盘空间、可靠存储文件” 展开,其核心逻辑可总结为以下几点:
- 分层抽象:从磁盘物理结构(CHS)到逻辑地址(LBA),再到文件系统(块组、inode、数据块),每一层抽象都屏蔽了底层复杂性,为上层提供统一接口;
- 分离存储:文件的 “属性(inode)” 与 “内容(数据块)” 分离存储,通过 inode 的指针实现关联,既便于属性查询,又利于内容的高效读写;
- 块组管理:将分区划分为多个块组,每个块组包含完整的管理组件(超级块、位图、inode 表),实现故障隔离和高效访问;
- 路径解析:通过目录存储 “文件名 - inode” 映射,结合路径缓存(dentry),实现从路径到 inode 的快速转换;
- 灵活链接:硬链接实现文件的 “多别名” 共享,软链接实现 “跨分区、跨目录” 的快捷访问,满足不同场景需求。
深入理解Ext文件系统与软硬链接
2740

被折叠的 条评论
为什么被折叠?



