一、 磁盘的物理与逻辑结构
机械硬盘是计算机中唯一的机械设备。物理上由盘片、磁道、扇区组成。早期通过 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。
五、 实战验证
# 查看文件的 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
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”
# 1. 看看当前目录下的文件名和 inode ls -li # 输出类似:1052669 -rw-rw-r-- 1 blog blog ... test.txt # 2. 看看目录自己的 inode ls -di .实战 3:提前体验一下“硬链接”(引出后面的知识)
# 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。