Linux文件系统底层原理:从磁盘物理结构到LBA寻址
目录
- Linux文件系统底层原理:从磁盘物理结构到LBA寻址
- 1. 磁盘物理结构:机械与电子的完美协作
- 1.1 硬盘的"多层蛋糕"结构 🍰
- 1.2 数据定位的三维坐标:柱面-磁头-扇区
- 1.3 磁盘容量计算公式与实例 🧮
- 2. 地址方式演进:从CHS到LBA的跨越
- 2.1 CHS寻址的局限性与8GB壁垒 🚧
- 2.2 LBA寻址:给每个扇区编上唯一身份证号 🆔
- 2.3 CHS与LBA的双向转换公式与实例 🔄
- 3. 文件系统核心概念:块、分区与缓存
- 3.1 块(Block):文件存取的最小单位 🧱
- 3.2 分区:硬盘的"抽屉式收纳" 🗄️
- 3.3 页缓存(Page Cache):内存中的"磁盘数据缓冲区" 🚀
- 4. 文件系统引入:给无序磁盘注入秩序 📊
- 思考题(大学生必备知识点)🤔
🌟个人主页 :L_autinue_Star
🌟当前专栏:linux
Linux文件系统底层原理:从磁盘物理结构到LBA寻址
1. 磁盘物理结构:机械与电子的完美协作
1.1 硬盘的"多层蛋糕"结构 🍰
机械硬盘(HDD)的内部结构类似多层蛋糕,每一层都是一个盘片(Platter),上下两面都可存储数据。想象一下:
- 每个盘片像一张CD光盘,但表面覆盖着磁性材料
- 磁头(Head) 就像唱片机的针头,悬浮在盘片表面几纳米处(比头发丝细1000倍!)
- 主轴马达带动盘片高速旋转(常见7200转/分钟,相当于每秒120转)
💡 为什么硬盘怕震动?因为磁头与盘片间距太小,震动可能导致"磁头碰撞",就像让高速行驶的汽车突然撞上墙壁🚗💥
1.2 数据定位的三维坐标:柱面-磁头-扇区
磁盘存储的最小物理单位是扇区(Sector),每个扇区固定512字节。要找到一个扇区,需要三个坐标:
- 柱面(Cylinder):所有盘片上半径相同的磁道组成的虚拟圆柱(机械臂移动一次定位一个柱面)
- 磁头(Head):选择哪个盘面(每个盘面一个磁头)
- 扇区(Sector):磁道上的扇形区域(盘片旋转到磁头下方)
1.3 磁盘容量计算公式与实例 🧮
容量 = 磁头数 × 柱面数 × 每磁道扇区数 × 每扇区字节数
实例计算:
磁头数 = 2(上下两个盘面)
柱面数 = 1024(磁道数)
每磁道扇区数 = 63
每扇区字节 = 512B总容量 = 2 × 1024 × 63 × 512 = 65,536, 字节 = 65.536 MB
📌 注意:早期硬盘确实如此计算,但现代硬盘会通过" zone bit recording"优化外圈磁道的扇区数,实际容量会更大
2. 地址方式演进:从CHS到LBA的跨越
2.1 CHS寻址的局限性与8GB壁垒 🚧
CHS寻址使用8bit磁头+10bit柱面+6bit扇区:
- 最大磁头数 = 2⁸ = 256
- 最大柱面数 = 2¹⁰ = 1024
- 最大扇区数 = 2⁶ = 63(实际每磁道扇区数)
最大容量 = 256 × 1024 × 63 × 512B = 8,455,716,864B ≈ 8.4GB
这就是为什么早期BIOS只支持8GB以下硬盘!当硬盘超过8GB,CHS寻址就无能为力了😥
2.2 LBA寻址:给每个扇区编上唯一身份证号 🆔
LBA(Logical Block Addressing)将磁盘视为一维数组:
- 每个扇区有唯一编号(从0开始)
- 操作系统只需告诉硬盘LBA编号,转换为CHS的工作由硬盘固件完成
2.3 CHS与LBA的双向转换公式与实例 🔄
CHS转LBA公式:
LBA = 柱面号C × (磁头数H × 每磁道扇区数S) + 磁头号h × 每磁道扇区数S + 扇区号s - 1
实例计算:
已知:C=2, H=2(总磁头数), S=63(每磁道扇区数), h=1(磁头号), s=3(扇区号)
LBA = 2×(2×63) + 1×63 + 3-1 = 2×126 + 63 + 2 = 317
LBA转CHS公式:
柱面号C = LBA // (H×S)
磁头号h = (LBA % (H×S)) // S
扇区号s = (LBA % S) + 1
验证LBA=317转CHS:
C = 317 // (2×63) = 317 // 126 = 2
h = (317 % 126) // 63 = 65 // 63 = 1
s = (317 % 63) + 1 = 2 + 1 = 3
完美还原原始CHS参数!✅
3. 文件系统核心概念:块、分区与缓存
3.1 块(Block):文件存取的最小单位 🧱
块是文件存取的最小单位,由连续扇区组成(常见4KB=8个扇区)
stat
命令中的"I/O Block: 4096"表示块大小为4KB- 块大小对性能影响巨大:
块大小 | 小文件(1KB)浪费空间 | 大文件(1GB)碎片数 |
---|---|---|
1KB | 0% (完美) | 1,048,576 块 |
4KB | 75% (浪费3KB) | 262,144 块 |
64KB | 98.4% (浪费63KB) | 16,384 块 |
💡 现代文件系统会根据文件类型动态调整块大小,如Ext4的"块组"机制
3.2 分区:硬盘的"抽屉式收纳" 🗄️
分区就像C、D、E盘,更准确地说:
- 柱面是分区的最小单位
- MBR分区表支持4个主分区(或3主+1扩展分区)
- GPT分区表突破限制(支持128个分区,最大容量18EB)
查看分区表:
fdisk -l /dev/sda # MBR分区表
gdisk -l /dev/sda # GPT分区表
3.3 页缓存(Page Cache):内存中的"磁盘数据缓冲区" 🚀
重要概念:
- 操作系统将频繁访问的磁盘数据缓存到内存
- 写操作先到缓存,后台异步写入磁盘(提高性能)
- 查看缓存命中率:
grep PageCache /proc/meminfo # 理想命中率应>95%
🚨 数据一致性风险:突然断电可能导致缓存数据丢失,解决方案→Ext4日志功能!
4. 文件系统引入:给无序磁盘注入秩序 📊
没有文件系统的磁盘就是"数据垃圾堆":
- 文件系统记录:哪个块存了什么数据?文件从哪里开始到哪里结束?
- 支持文件名、权限、创建时间等元数据
- 解决数据碎片化问题
常见文件系统对比:
文件系统 | 特点 | 最大文件 | 最大卷 | 日志功能 |
---|---|---|---|---|
Ext2 | 无日志 | 2TB | 32TB | ❌ |
Ext3 | 有日志 | 2TB | 32TB | ✅ |
Ext4 | extent+延迟分配 | 16TB | 1EB | ✅ |
XFS | 高性能大文件 | 8EB | 8EB | ✅ |
接下来将深入Ext4的内部结构!
思考题(大学生必备知识点)🤔
- 为什么磁盘读写时"连续块"比"分散块"快10倍以上?
- 计算:一个LBA地址为1000的扇区,在磁头数=4、每磁道扇区数=63的硬盘上,对应的CHS地址是什么?
- 为什么删除文件后"清空回收站"才能真正释放空间?(提示:inode与数据块的关系)
答案将在《Ext4文件系统全景解析》中揭晓!🔜