一、 磁盘的物理与逻辑结构
机械硬盘是计算机中唯一的机械设备。物理上由盘片、磁道、扇区组成。早期通过 CHS(柱面、磁头、扇区)寻址。
为了简化管理,操作系统将三维的 CHS 地址降维,把整个磁盘当成一个巨大的一维数组 ,每个元素就是一个扇区(512B),这个数组的下标就是 LBA(逻辑块地址)。OS 从此只需用 LBA 编号就能定位任何一个扇区。
二、 为什么要有"块(Block)"?
虽然扇区是物理读写的最小单位(512B),但频繁读写小容量数据会导致效率极低。因此操作系统引入了**"块(Block)"** 的概念,通常是连续的 8 个扇区(即 4KB)。块是文件系统存取数据的最小单位 。在 stat 命令中看到的 IO Block: 4096 就是它。
三、 文件的解剖:inode 与 Block
Linux 中,文件(File)是由属性 和内容组成的,且它们分开存储:
-
内容:存放在一个个数据块(Data Block)中。
-
属性(元数据) :存放在 inode(索引节点) 中。
inode 的特点:
-
一个文件对应一个唯一的 inode,有一个唯一的 inode 编号。
-
inode 中记录了文件的大小、权限、所有者、修改时间,以及文件内容占用了哪些 Block。
-
inode 大小是固定的(通常 128 字节或 256 字节)。
-
文件名不存放在 inode 中,而是存放在目录里。
四、 目录的本质
在 Linux 中,一切皆文件,目录也是文件。
-
目录的内容不是普通数据,而是**"文件名"与"inode 号"的映射表**。
-
访问一个文件,本质上是先找到该目录,在目录的内容里根据文件名匹配到 inode 号,再通过 inode 号找到存储文件内容的 Block。
五、 实战验证
bash
# 查看文件的 inode 编号
ls -i test.txt
# 查看文件底层详细信息
stat test.txt
# 关注 Inode(节点号)、Size(字节数)和 IO Block(块大小)
# 创建硬链接(验证多个名字共享一个 inode)
ln test.txt hard_link
ls -li test.txt hard_link # 发现二者 inode 号完全一致
总结
Linux 文件系统的核心就是:目录记录文件名与 inode 的映射,inode 记录文件属性与数据块的位置,数据块负责存放真实内容。 这种设计极大提高了文件的检索效率。
自我实战操作
实战 1:扒掉文件的伪装,看 inode 和 Block
bash
cd ~/linux_study/io_test
# 1. 创建一个小文件
echo "hello" > test.txt
# 2. 使用 ls -i 查看它的 inode 号
ls -i test.txt
# 3. 使用 stat 命令看它的底细
stat test.txt

👉 重点看什么:
-
Size:文件内容的真实字节数(6字节)。 -
Blocks:占用的磁盘块数(通常不管多小,都要占 8 个 512B 的扇区,也就是 4KB)。 -
IO Block:文件系统的块大小(通常 4096)。 -
Inode:它的唯一身份证号。
实战 2:验证目录的内容是"文件名 -> inode"
bash
# 1. 看看当前目录下的文件名和 inode
ls -li
# 输出类似:1052669 -rw-rw-r-- 1 blog blog ... test.txt
# 2. 看看目录自己的 inode
ls -di .
实战 3:提前体验一下"硬链接"(引出后面的知识)
bash
# 1. 给 test.txt 创建一个硬链接叫 hard_link
ln test.txt hard_link
# 2. 看看这俩货的 inode 号
ls -li test.txt hard_link

👉 神奇现象 :你会发现 test.txt 和 hard_link 的 inode号一模一样! 而且最前面的 Links 计数变成了 2。
这就证明了,它们本质上是同一个文件,只是有两个不同的名字指向了同一个 inode。
