:深入 Ext 文件系统(上)—— 磁盘、块与神秘的 inode)
一、 磁盘的物理与逻辑结构机械硬盘是计算机中唯一的机械设备。物理上由盘片、磁道、扇区组成。早期通过 CHS柱面、磁头、扇区寻址。为了简化管理操作系统将三维的 CHS 地址降维把整个磁盘当成一个巨大的一维数组每个元素就是一个扇区512B这个数组的下标就是LBA逻辑块地址。OS 从此只需用 LBA 编号就能定位任何一个扇区。二、 为什么要有“块Block”虽然扇区是物理读写的最小单位512B但频繁读写小容量数据会导致效率极低。因此操作系统引入了“块Block”的概念通常是连续的 8 个扇区即 4KB。块是文件系统存取数据的最小单位。在stat命令中看到的IO Block: 4096就是它。三、 文件的解剖inode 与 BlockLinux 中文件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 和 Blockcd ~/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。