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

发布时间:2025-09-25 06:18

在Linux系统中,使用Docker容器化文件结构 #生活技巧# #组织技巧# #文件管理系统#

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

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编号只在本分区有效,就像小区门牌号不能跨小区使用

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 12345doc/ → inode 67890 3.2 路径解析:从"/"到文件

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

从根目录(/)开始,根目录的inode编号是固定的(通常是2)逐层解析路径(如/home/user/file.txt)每个目录的"通讯录"找到下一级目录/文件的inode最终通过目标文件的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/mydiskmount /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缓存生效

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

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

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

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的多级指针结构,使小文件快速访问,大文件无限扩展

计算最大文件大小

block_size = 4096 # 4KB/块direct = 12 * block_sizesingle = (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 + tripleprint(f"最大文件大小: {max_size / (1024**4):.2f} TB") # 输出:4.00 TB 3.3 块组的6大组成部分

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

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


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

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

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

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

4.3 目录项缓存(dentry cache)

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

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


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

验证缓存存在

# 第一次执行,无缓存,较慢time find / -name "passwd"# 第二次执行,利用缓存,较快time find / -name "passwd" 5.3 VFS:虚拟文件系统

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

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


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

安全挂载选项

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

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

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


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

7.1 Super Block损坏修复

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

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


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

网址:详细介绍:【Linux】Linux文件系统详解:从磁盘到文件的奥秘 https://www.yuejiaxmz.com/news/view/1332843

相关内容

从开发者角度入门Linux世界资料整理=Linux介绍+Ubuntu系统安装(视频+文字)
Linux频繁存取文件,导致可用内存逐渐减少
Linux系统内存清理神器:Purge命令详解 – Linux命令大全(手册)
从零开始的嵌入式Linux生活(一) 背景介绍
Linux使用crontab定时执行脚本任务的流程详解
拯救磁盘空间:Linux 服务器清理指南
Linux中查看各文件夹大小命令:du
7 个整理 Linux 文件和清理电脑的技巧
Linux如何查看磁盘/分区的UUID
Linux磁盘清理:磁盘空间分析与清理方案

随便看看