当前位置: 首页 > news >正文

【Linux】Linux文件系统详解:从磁盘到文件的奥秘

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!

在这里插入图片描述


IF’Maxue:个人主页

 🔥 个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》

⛺️生活是默默的坚持,毅力是永久的享受。不破不立!

文章目录

    • 1. 初识文件系统:硬盘的"整理术"
      • 1.1 分区:给仓库画格子
      • 1.2 数据块:文件内容的"集装箱"
    • 2. inode:文件的"身份证"
      • 2.1 inode的关键特性
      • 2.2 查看inode的命令
    • 3. 目录:文件名的"通讯录"
      • 3.1 目录的inode和数据块
      • 3.2 路径解析:从"/"到文件
    • 4. 超级块(Super Block):文件系统的"户口本"
      • 4.1 为什么需要备份超级块?
      • 4.2 查看超级块信息
    • 5. 挂载:给分区"安个门牌号"
      • 5.1 挂载步骤示例
      • 5.2 开机自动挂载
    • 6. 软硬链接:文件的"分身术"
      • 6.1 软链接(符号链接):快捷方式
      • 6.2 硬链接:文件别名
      • 6.3 链接数的奥秘
    • 7. 内核的小优化:dentry缓存
    • 总结:文件系统的核心逻辑
      • 1.3 磁盘物理结构与分区表
      • 2.3 inode的15个指针
      • 3.3 块组的6大组成部分
      • 4.3 目录项缓存(dentry cache)
      • 5.3 VFS:虚拟文件系统
      • 6.3 硬链接数实验
      • 7.1 Super Block损坏修复

1. 初识文件系统:硬盘的"整理术"

想象你有一个巨大的仓库(硬盘),要存放各种箱子(文件)。如果随便堆放在一起,找东西会很麻烦。文件系统就是给仓库画格子、贴标签的"整理术",让每个文件都有自己的位置和编号。

1.1 分区:给仓库画格子

硬盘需要先分成多个分区(类似仓库的不同区域),每个分区独立管理。分区后还需要格式化——写入文件系统的"管理规则",包括:

  • 数据块(存放文件内容的4KB小格子)
  • inode(文件的身份证,记录属性和数据块位置)
  • 超级块(整个分区的"户口本")

分区与格式化

1.2 数据块:文件内容的"集装箱"

所有文件内容都存在数据块(Data Blocks)中,每个块固定4KB大小。小文件可能占1块,大文件会占用多个块,这些块可以分散在磁盘的不同位置。

数据块示意图

2. inode:文件的"身份证"

每个文件都有一个inode(索引节点),相当于"身份证",包含:

  • 文件大小、权限、创建时间等属性
  • 指向数据块的指针(告诉系统去哪里找内容)

2.1 inode的关键特性

  • 唯一编号:每个分区内inode编号唯一,类似身份证号
  • 跨区编号:inode和数据块在整个分区内统一编号(如1-10000)
  • 不能跨分区:inode编号只在本分区有效,就像小区门牌号不能跨小区使用

inode跨区编号示例

2.2 查看inode的命令

ls -i filename  # 查看文件的inode编号
stat filename   # 查看inode详细属性

执行效果:

12345 filename  # ls -i输出,12345是inode编号

3. 目录:文件名的"通讯录"

你可能会问:文件名存在哪里?
答案是:目录里。目录本身也是一种特殊文件,它的inode指向的数据块中,存储着"文件名→inode编号"的映射表,就像通讯录记录"姓名→电话"。

3.1 目录的inode和数据块

目录结构示意图

  • 目录的数据块内容示例:
    . → inode 100  (当前目录自身)
    .. → inode 50   (父目录)
    file1.txt → inode 12345
    doc/ → inode 67890
    

3.2 路径解析:从"/"到文件

找文件的过程就像查地图:

  1. 从根目录(/)开始,根目录的inode编号是固定的(通常是2)
  2. 逐层解析路径(如/home/user/file.txt
  3. 每个目录的"通讯录"找到下一级目录/文件的inode
  4. 最终通过目标文件的inode找到数据块

路径解析过程

4. 超级块(Super Block):文件系统的"户口本"

超级块存储整个分区的关键信息:

  • 总块数、空闲块数、inode总数
  • 块大小、inode大小、挂载时间

4.1 为什么需要备份超级块?

超级块一旦损坏,整个分区的数据可能丢失!因此系统会在多个分组中备份超级块,就像重要文件多存几份副本。

超级块备份机制

4.2 查看超级块信息

dumpe2fs /dev/sda1 | grep -i superblock  # 查看ext系列文件系统的超级块

5. 挂载:给分区"安个门牌号"

硬盘分区就像未开封的快递箱,需要挂载到一个目录(挂载点)才能使用,这个目录就成了分区的"门牌号"。

5.1 挂载步骤示例

# 1. 创建挂载点目录
mkdir /mnt/mydisk# 2. 将/dev/sdb1分区挂载到/mnt/mydisk
mount /dev/sdb1 /mnt/mydisk# 3. 查看挂载情况
df -h          # 显示分区使用情况
mount          # 列出所有挂载点

挂载效果示例

5.2 开机自动挂载

修改/etc/fstab文件(需root权限):

# 格式:设备路径  挂载点  文件系统类型  选项  备份  自检
/dev/sdb1       /mnt/mydisk  ext4    defaults  0     2

6. 软硬链接:文件的"分身术"

Linux有两种链接方式,就像文件的不同分身术:

6.1 软链接(符号链接):快捷方式

  • 相当于Windows的"快捷方式",有独立inode
  • 内容存储目标文件的路径,删除原文件后链接失效
ln -s 原文件路径 软链接名  # 创建软链接
ln -s /home/user/file.txt link.txt

软链接示意图

6.2 硬链接:文件别名

  • 没有独立inode,只是给原文件新增一个文件名(共享inode)
  • 原文件删除后,别名仍可访问(需引用计数>0)
ln 原文件路径 硬链接名  # 创建硬链接
ln file.txt hardlink.txt

硬链接示意图

6.3 链接数的奥秘

  • 文件的"链接数"就是指向该inode的文件名数量
  • 目录默认链接数是2(...),创建子目录后会增加
ls -l  # 查看链接数(第2列数字)
# 示例输出:drwxr-xr-x  2 user user 4096  目录(链接数2)

7. 内核的小优化:dentry缓存

操作系统为了加快文件查找速度,会把常用目录的"文件名→inode"映射缓存到内存中,这就是dentry结构体(目录项缓存)。

  • 作用:第二次查找同一目录时,直接从内存读取,无需访问磁盘
  • 验证find命令第一次慢、第二次快,就是因为dentry缓存生效

dentry缓存结构

总结:文件系统的核心逻辑

  1. 存储三要素:分区(容器)、inode(身份证)、数据块(内容箱)
  2. 查找流程:路径→目录→inode→数据块
  3. 关键技术:挂载(分区入门)、链接(文件分身)、缓存(加速访问)

通过这些机制,Linux能高效管理成千上万的文件,即使你每天用lscd命令,背后都藏着这些精妙的设计!

1.3 磁盘物理结构与分区表

硬盘的物理结构包括盘片、磁道和扇区,每个扇区通常为512字节。分区是将磁盘划分为独立区域的过程,常见的分区表有两种:

MBR分区表

  • 最多支持4个主分区
  • 每个分区最大容量2TB
  • 位于磁盘的第一个扇区(512字节)

GPT分区表

  • 支持无限多个分区(取决于操作系统,通常256个)
  • 支持大于2TB的分区
  • 有备份分区表,提高可靠性

分区工具界面
使用gdisk工具创建GPT分区表的界面,支持大磁盘和多分区

实战代码:创建GPT分区

# 查看磁盘信息
fdisk -l /dev/sdb# 使用gdisk创建GPT分区表
gdisk /dev/sdb
# 按提示操作:o(新建GPT)→ n(新建分区)→ 回车(默认起始扇区)→ +10G(分区大小)→ w(保存)

2.3 inode的15个指针

inode包含15个指针,决定了文件能使用的数据块:

  • 前12个直接指针:每个指向一个数据块(4KB),直接访问小文件(≤48KB)
  • 一级间接指针:指向一个"指针块",可存储1024个数据块地址(4KB/4B=1024),支持4MB
  • 二级间接指针:指向一个"指针块的指针块",支持4GB
  • 三级间接指针:指向一个"二级指针块的指针块",支持4TB

inode指针结构
inode的多级指针结构,使小文件快速访问,大文件无限扩展

计算最大文件大小

block_size = 4096  # 4KB/块
direct = 12 * block_size
single = (block_size // 4) * block_size  # 1024块
double = (block_size // 4) ** 2 * block_size  # 1024²块
triple = (block_size // 4) ** 3 * block_size  # 1024³块max_size = direct + single + double + triple
print(f"最大文件大小: {max_size / (1024**4):.2f} TB")  # 输出:4.00 TB

3.3 块组的6大组成部分

每个块组就像一个独立的"小区",包含:

  1. Super Block:小区总览图
  2. GDT(组描述符表):每个块组的详细信息
  3. inode位图:记录哪些inode已使用
  4. 数据块位图:记录哪些数据块已使用
  5. inode表:存储inode的具体内容
  6. 数据块:实际存储文件内容

块组结构
块组的6个组成部分,每个部分负责不同的管理功能

空闲块管理
数据块位图使用1位表示一个块的状态:

  • 0:空闲(可用)
  • 1:已占用

例如,一个4KB的位图可以管理32768个数据块(4KB×8=32768位),轻松定位空闲块。

4.3 目录项缓存(dentry cache)

Linux内核为加速路径解析,将常用目录项缓存在内存中,称为dentry缓存:

  • 结构:哈希表+链表,支持快速查找和LRU淘汰
  • 命中率:缓存命中率高时,文件访问速度显著提升

dentry结构体
dentry结构体包含指向inode的指针和目录项关系

验证缓存存在

# 第一次执行,无缓存,较慢
time find / -name "passwd"# 第二次执行,利用缓存,较快
time find / -name "passwd"

5.3 VFS:虚拟文件系统

VFS是Linux的"文件系统翻译官",使不同文件系统(ext4、xfs等)呈现统一接口:

  • 核心对象:超级块对象、inode对象、文件对象、目录项对象
  • 作用:用户无需关心底层文件系统类型,统一使用open/read/write等系统调用

VFS架构
VFS位于用户空间和具体文件系统之间,提供统一接口

安全挂载选项

# 以只读方式挂载U盘,防止病毒写入
mount -o ro /dev/sdb1 /mnt/usb# 禁止在分区上执行程序,提高安全性
mount -o noexec /dev/sdb1 /mnt/usb

6.3 硬链接数实验

创建硬链接后,inode的链接数会增加:

# 创建文件,初始链接数1
touch file.txt
ls -li file.txt  # 输出:12345 -rw-r--r-- 1 user user ... file.txt# 创建硬链接,链接数变为2
ln file.txt link.txt
ls -li file.txt link.txt  # 两者inode相同,链接数2# 删除原文件,链接数变为1,link.txt仍可访问
rm file.txt
cat link.txt  # 仍能读取内容

硬链接数变化
硬链接创建后,链接数从1变为2,删除原文件后链接数减为1

7.1 Super Block损坏修复

Super Block损坏会导致分区无法挂载,可使用备份恢复:

# 查看分区的超级块备份位置
mke2fs -n /dev/sda1  # 模拟格式化,显示超级块备份信息# 使用备份超级块修复
e2fsck -b 32768 /dev/sda1  # 32768是备份超级块的块地址

Super Block备份
Super Block在多个块组中备份,确保损坏后可恢复

http://www.dtcms.com/a/395201.html

相关文章:

  • 【Android Keystore】Android 密钥库系统使用指南
  • RBAC权限模型实战图解:绘制企业权限矩阵,告别混乱授权
  • 【ROS2】通讯协议接口 Interface
  • Spring —— 事务控制
  • 基于vue开发的背单词网站
  • javascript 角色跟踪实践
  • 第九周作业
  • 【ThinkPHP项目添加新页面完整解决方案】
  • Thinkphp框架相关漏洞扫描器(一)
  • 【网络通讯】Qt中使用Modbus Tcp协议(附Demo)
  • 在 macOS 上使用 Windows 快捷键指南
  • pd26 虚拟机 (Mac中文)
  • 本周的股指
  • (论文速读)生成式摄影:让AI理解相机的物理世界
  • ELK 企业级日志分析系统
  • 项目日记 -日志系统 -功能完善
  • install_docker.sh
  • opencv的DNN模块里
  • FPGA学习笔记——图像处理之对比度调节(线性调节)
  • SkyWalking 核心概念与智能探针工作原理深度揭秘(上)
  • leetcode hot100 简单难度 day02-刷题
  • ARP报文格式
  • 【论文速递】2025年第26周(Jun-22-28)(Robotics/Embodied AI/LLM)
  • 用【PinMe】轻松实现前端部署(文章附有演示案例)
  • 巨坑Spring ai 之spring-ai-starter-vector-store-elasticsearch
  • 【LeetCode 每日一题】2349. 设计数字容器系统
  • i.MX6ULL移植内核6.6(一)修改网络驱动和LCD驱动
  • vue-router(vue 路由)基本使用指南(一)
  • 酒店台账报表:押金原路退回与收支自动化指南-东方仙盟自动化
  • ⸢ 伍-Ⅰ⸥ ⤳ 默认安全治理实践:软件供应链安全治理