Linux 学习笔记(二十二):深入 Ext 文件系统(上)—— 磁盘、块与神秘的 inode

一、 磁盘的物理与逻辑结构

机械硬盘是计算机中唯一的机械设备。物理上由盘片、磁道、扇区组成。早期通过 CHS(柱面、磁头、扇区)寻址。

为了简化管理,操作系统将三维的 CHS 地址降维,把整个磁盘当成一个巨大的一维数组 ,每个元素就是一个扇区(512B),这个数组的下标就是 LBA(逻辑块地址)。OS 从此只需用 LBA 编号就能定位任何一个扇区。

二、 为什么要有"块(Block)"?

虽然扇区是物理读写的最小单位(512B),但频繁读写小容量数据会导致效率极低。因此操作系统引入了**"块(Block)"** 的概念,通常是连续的 8 个扇区(即 4KB)。块是文件系统存取数据的最小单位 。在 stat 命令中看到的 IO Block: 4096 就是它。

三、 文件的解剖:inode 与 Block

Linux 中,文件(File)是由属性 和内容组成的,且它们分开存储:

  1. 内容:存放在一个个数据块(Data Block)中。

  2. 属性(元数据) :存放在 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。

相关推荐
nlp研究牲41 分钟前
Linux 常用命令速查手册:英文全称、中文释义、巧记方法与实战示例
linux·运维·php
小张成长计划..1 小时前
【Linux】28:封装线程,锁,条件变量,日志
linux
木白CPP1 小时前
Persistence subsystem 笔记
数据库·笔记
笨笨饿1 小时前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机
味悲1 小时前
Nginx笔记
linux·运维·笔记·nginx
Escalating_xu1 小时前
【Linux 网络编程】传输层协议 UDP:从 8 字节首部到消息边界、缓冲区与 MTU
linux·网络·udp
坤坤子吖1 小时前
C++继承:继承的基本用法与访问规则
开发语言·c++·笔记·学习
启观川1 小时前
[windows] windows下将文件夹映射为磁盘
windows·笔记
ss2731 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 23 PostgreSQL数据库文件系统与数据页结构
数据库·笔记·postgresql