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

news/2025/9/23 19:12:13/文章来源:https://www.cnblogs.com/ljbguanli/p/19107785

详细介绍:【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 分区:给仓库画格子

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

分区与格式化

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和数据块

目录结构示意图

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

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

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

路径解析过程

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

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

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 软链接(符号链接):快捷方式

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缓存:

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.mzph.cn/news/913585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Which side of a 2d curve is a point on

https://math.stackexchange.com/questions/1288309/which-side-of-a-2d-curve-is-a-point-on

20250923

今天上了工程实训课,看了机床是什么样子,又学习了英语,认识了几个单词,我觉得今天也十分充实。 就是这个课后作业任务竟然如此繁重,离散数学作业还没写,并且英语还有任务,现在准备进行对于反码补码的学习了,等…

CCPC秦皇岛 2023 M Inverted

一.题面: 点这里 二.分析: 1.性质分析: 首先,对于题目中复杂的过程描述,我们应当找到生成新图的本质。 考虑对于第 \(i\) 次操作的意义,通过点 \(u\) 生成了一个全新的点 \(u\),然后对于 \(\forall_{v\in V(u)}…

HTTPS 映射如何做?(HTTPS 映射配置、SNI 映射、TLS 终止、内网映射与 iOS 真机验证实战) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发保密协议书品质好货

来源:学术头条摘要:当今,无人驾驶技术已经成为整个汽车产业的最新发展方向。科研院校、汽车制造厂商、科技公司、无人驾驶汽车创业公司以及汽车零部件供应商在无人驾驶技术领域进行不断地探索。今天我们为大家梳理一下无人驾驶汽车的国内外发…

甘肃省建设厅注册中心网站cms程序

要配置iptables进行路由转发,需要执行以下步骤: 确保系统已经开启了IP转发功能。可以通过执行以下命令来检查: sysctl net.ipv4.ip_forward如果返回的值为1,表示已经开启了IP转发功能。如果返回的值为0,可以通过执行…

专用车网站建设哪家好seo是啥软件

目录 初识VueVue模板语法数据绑定el和data的两种写法事件的基本使用$emit在子组件中定义方法,执行父组件的方法 Vue中的事件修饰符:键盘事件计算属性监视属性条件渲染列表渲染表单数据收集过滤器 笔记内容来自:尚硅谷Vue2.0Vue3.0全套教程丨v…

百度贴吧有没有做网站的人青岛网站建设电话

要在Spring Boot中集成Redis&#xff0c;你可以使用Spring Data Redis库来简化操作。 下面是一个示例代码&#xff1a; 首先&#xff0c;在你的Spring Boot项目的pom.xml文件中添加以下依赖&#xff1a; <dependencies><!-- 其他依赖... --><dependency>&…

江门市专业做网站公司企业网站改版新闻

概述 包含External 的表叫外部表 删除外部表只删除metastore的元数据&#xff0c;不删除hdfs中的表数据 外部表 只有一个过程&#xff0c;加载数据和创建表同时完成&#xff0c;并不会移动到数据仓库目录中&#xff0c;只是与外部数据建立一个链接。当删除一个 外部表 时&…

网站建设企业网的项目描述wordpress首页标题大小

关于WKWebView高度的问题的解决 IOS端嵌入网页的方式有两种UIWebView和WKWebView。其中WKWebView的性能要高些;WKWebView的使用也相对简单 WKWebView在加载完成后&#xff0c;在相应的代理里面获取其内容高度&#xff0c;大多数网上的方法在获取高度是会出现一定的问题&#xf…

深圳网站建设制作报价超级外链工具

day14--闰年推算小程序--2.18 习题概述 题目描述 输入 x,y&#xff0c;输出 [x,y] 区间中闰年个数&#xff0c;并在下一行输出所有闰年年份数字&#xff0c;使用空格隔开。 输入格式 输入两个正整数 x,y&#xff0c;以空格隔开。 输出格式 第一行输出一个正整数&#xf…

大三上第一篇日志

今天就是了解了一下c#,学习使用了Trae,感觉ai发展的好快,用Trae,告诉它想要什么东西,用什么语言写,就能生成对应的文件,真的太厉害了

0923模拟赛总结

ad-hoc场。 T1是一个期望题目,很唐的一点是它的建模不一样导致不会做了(?,其实只要猜一下结论就过了。 T2随机化获得了全场最高分,这是好的。但是正解作为根号分治确实就没想到,只能说题练少了。 T3是子集计数题…

报名系统网站开发wordpress占用id

为什么要使用EasyExcel easyExcel是阿里巴巴下在POI的基础上二次开发的开源api&#xff0c;以使用简单、节省内存著称。 POI由于在操作excel时是先将所有数据都读入内存后&#xff0c;再写入文件&#xff0c;比较消耗内存&#xff0c;特别是大数据量时&#xff0c;容易出现OOM…

无锡企业推广网站大连网站建设个人

DOM事件的传播机制是指当一个事件在DOM树中触发时&#xff0c;它是如何在各个元素之间传播的。DOM事件传播机制分为三个阶段&#xff1a;捕获阶段、目标阶段和冒泡阶段。此外&#xff0c;还有一种常用的技术称为事件委托&#xff0c;它能够简化事件处理程序的绑定和管理。本文将…

公司做个网站多少钱动感技术网站建设

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…

东莞网站推广行者seo08金融交易网站建设

第4章 参数估计 参数估计是统计建模的关键步骤之一&#xff0c;它涉及根据样本数据推断总体参数的过程。在统计学中&#xff0c;参数通常用于描述总体的特征&#xff0c;如均值、方差等。通过参数估计&#xff0c;我们可以利用样本信息对这些未知参数进行推断&#xff0c;从而…

诚客网站建设可以访问国外网站的dns

在电商领域&#xff0c;了解店铺的详细信息对于提升顾客的信任和忠诚度至关重要。为了帮助开发者获取和管理特定店铺的信息&#xff0c;电商平台通常提供店铺详情API接口。本文将指导你如何使用这个API接口来获取店铺的名称、描述、地址、评分等详细信息&#xff0c;并将这些信…

山西大川建设有限公司网站网络营销推广有效方式

Leetcode Test 1281 整数的各位积和之差(8.9) 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 提示&#xff1a; 1 < n < 10^5 【原始代码】&#xff1a; int subtractProductAndSum(int n){//1 < n < 10^5//…

网站镜像怎么做ip查询网站备案查询

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址: https://liningit.github.io/LnskyDB/开源地址: https://github.com/liningit/LnskyDBnuget地址: https://www.nuget.org/packages/LnskyDB…