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

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

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

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

文章目录

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

2.2 查看inode的命令

bash 复制代码
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 查看超级块信息

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

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

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

5.1 挂载步骤示例

bash 复制代码
# 1. 创建挂载点目录
mkdir /mnt/mydisk

# 2. 将/dev/sdb1分区挂载到/mnt/mydisk
mount /dev/sdb1 /mnt/mydisk

# 3. 查看挂载情况
df -h          # 显示分区使用情况
mount          # 列出所有挂载点

5.2 开机自动挂载

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

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

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

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

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

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

6.2 硬链接:文件别名

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

6.3 链接数的奥秘

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

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

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

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

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

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

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

1.3 磁盘物理结构与分区表

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

MBR分区表

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

GPT分区表

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


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

实战代码:创建GPT分区

bash 复制代码
# 查看磁盘信息
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的多级指针结构,使小文件快速访问,大文件无限扩展

计算最大文件大小

python 复制代码
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结构体包含指向inode的指针和目录项关系

验证缓存存在

bash 复制代码
# 第一次执行,无缓存,较慢
time find / -name "passwd"

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

5.3 VFS:虚拟文件系统

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

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


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

安全挂载选项

bash 复制代码
# 以只读方式挂载U盘,防止病毒写入
mount -o ro /dev/sdb1 /mnt/usb

# 禁止在分区上执行程序,提高安全性
mount -o noexec /dev/sdb1 /mnt/usb

6.3 硬链接数实验

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

bash 复制代码
# 创建文件,初始链接数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损坏会导致分区无法挂载,可使用备份恢复:

bash 复制代码
# 查看分区的超级块备份位置
mke2fs -n /dev/sda1  # 模拟格式化,显示超级块备份信息

# 使用备份超级块修复
e2fsck -b 32768 /dev/sda1  # 32768是备份超级块的块地址


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

相关推荐
挨踢攻城2 小时前
Linux安全 | 防火墙工具 iptables 详解
linux·安全·iptables·rhce·rhca·厦门微思网络·linux防火墙工具
2301_800050992 小时前
DHCP 服务器
linux·运维·笔记
墨^O^3 小时前
网络通信协议全解析:HTTP/UDP/TCP核心要点
linux·服务器·网络·学习
_Re.3 小时前
DSC 参数ARCH_HANG_FLAG对集群的影响
linux·服务器·数据库
红尘客栈23 小时前
Ansible 入门到实战:自动化运维的瑞士军刀
运维·自动化·ansible
微风中的麦穗3 小时前
【远程桌面】运维强推工具之远程控制软件RustDesk 1.4.1 全面指南:开源远程桌面的终极解决方案
运维·远程工具·rustdesk·远程软件·运维神器·办公神器·局域网远程
望获linux3 小时前
【Linux基础知识系列:第一百三十九篇】使用Bash编写函数提升脚本功能
linux·运维·服务器·arm开发·chrome·性能优化·bash
hhhwx6664 小时前
Linux学习记录--利用信号量来调度共享资源(2)
linux·c语言·c++·学习
biubiubiu07064 小时前
coqui-ai/TTS 安装
linux·运维·服务器