Liunx文件系统详解

目录

1.磁盘

1.1 概念

1.2 磁盘物理结构

1.3 磁盘的存储结构

1.4 磁盘的逻辑结构

1.5 CHS && LBA地址

2.基础文件系统

2.1 块

​编辑

2.2 分区

2.3 inode

3.ext2 ⽂件系统

3.1 宏观认识

3.2 Block Group

3.3块组内部构成

3.3.1 超级块(Super Block)

3.3.2 GDT(Group Descriptor Table)

3.3.3 块位图(Block Bitmap)

3.3.4 inode位图(Inode Bitmap)

3.3.5 i节点表(Inode Table)

3.3.6 Data Block

3.4 inode和datablock映射

3.5 ⽬录与⽂件名

3.6 路径解析

3.7 路径缓存

3.8 挂载分区

3.9 总结图

4.软硬连接

4.1 硬链接

4.2 软链接

4.3 软硬连接对⽐及用途


1.磁盘

在Linux中,打开的文件保存在内存中,对于没有打开的文件则保存在磁盘里

1.1 概念

磁盘(disk)是指利用磁记录技术存储数据的存储器。

1.2 磁盘物理结构

磁盘的物理结构由磁盘,磁头,马达....组成,这里的磁盘称为盘片,一般有三个盘片,六个面,同样也有每个盘面对应一个磁头,一共六个磁头,这六个磁头由于绑定在一个机械臂上,因此只能共同运行(你走哪,我就走哪)

1.3 磁盘的存储结构

磁盘的存储结构和飞镖盘差不多,每一面盘片中圆形代表一个磁道,磁道中又被分为许多扇区

扇区:是磁盘存储数据的基本单位,512字节,块设备

对于一个磁盘来说有三个盘片,对于一个磁道,从上往下看就相当一个圆柱体

如何定位⼀个扇区呢?
可以先定位磁头(header)
确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
定位⼀个扇区(sector)

而这三步就被称为CHS地址定位

扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。
磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头
磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁头,不存储数据
柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数
扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
圆盘(platter)数:就是盘⽚的数量
磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数

1.4 磁盘的逻辑结构

在上文叙述过,由于盘片中的磁道是一个圆形,就可以把这个圆形剪开,形成一个线性结构

某⼀盘⾯的某⼀个磁道展开:
即:⼀维数组
同理对于一面的盘片中某一磁道展开,也可以对多面盘片中磁道展开
整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
柱⾯上的每个磁道,扇区个数是⼀样的,就是⼆维数组吗

一样也可以对多个磁道展开

整个磁盘就是多张⼆维的扇区数组表,也就是三维数组,对于三维数组,也可以像一维数组展开,所以,每⼀个扇区都有⼀个下标,我们叫做 LBA(Logical Block Address) 地址,其实就是线性地址

在OS只需要使⽤LBA就可以了,对于LBA地址转成CHS地址,这步操作由磁盘⾃⼰来做

1.5 CHS && LBA地址

CHS转成LBA:
磁头数*每磁道扇区数 = 单个柱⾯的扇区总数
LBA = 柱⾯号C*单个柱⾯的扇区总数 + 磁头号H*每磁道扇区数 + 扇区号S - 1
即:LBA = 柱⾯号C*(磁头数*每磁道扇区数) + 磁头号H*每磁道扇区数 + 扇区号S - 1
扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的
柱⾯和磁道都是从0开始编号的
总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参数。
LBA转成CHS:
柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数
扇区号S = (LBA % 每磁道扇区数) + 1
"//": 表⽰除取整
所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰转换。所以: 磁盘就是⼀个 元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤磁盘,就可以⽤⼀个数字访问磁盘扇区了。

2.基础文件系统

2.1 块

其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。 硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 ”块”。”块”是⽂件存取的最⼩单位。

2.2 分区

其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,对于⼀块磁盘将它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的⼀种格式化。但是Linux的设备都是以⽂件形式存在,那是怎么分区的呢?柱⾯是分区的最⼩单位,利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起始柱⾯和结束柱⾯号码。 此时可以将硬盘上的柱⾯(分区)进⾏平铺,将其想象成⼀个⼤的平⾯

2.3 inode

⽂件=数据+属性 ,使⽤ ls -l 的时候看到的除了看到⽂件名,还能看到⽂件元数据(属性)。

每⾏包含7列:
模式
硬链接数
⽂件所有者
⼤⼩
最后修改时间
⽂件名
stat命令能够看到更多信息
对于⽂件数据它都储存在”块”中,这种储存⽂件属性信息的区域就叫做inode,每⼀个⽂件都有对应的inode,⾥⾯包含了与该⽂件有关的⼀些信息。
注意:
Linux下⽂件的存储是属性和内容分离存储的
Linux下,保存⽂件属性的集合叫做inode,⼀个⽂件
⽂件名属性并未纳⼊到inode数据结构内部
inode的⼤⼩⼀般是128字节或者256
任何⽂件的内容⼤⼩可以不同,但是属性⼤⼩⼀定是相同的

3.ext2 ⽂件系统

3.1 宏观认识

想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。在Linux 系统中,最常⻅的是 ext2 系列的⽂件系统。其早期版本为 ext2,后来⼜发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进⾏了增强,但是其核⼼设计并没有发⽣变化,这里仍是以较⽼的 ext2 作为演⽰对象。
ext2⽂件系统将整个分区划分成若⼲个同样⼤⼩的块组 (Block Group),如下图所⽰。只要能管理⼀个分区就能管理所有分区,也就能管理所有磁盘⽂件。
上图中启动块(Boot Block/Sector)的⼤⼩是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。启动块之后才是ext2⽂件系统的开始。

3.2 Block Group

ext2⽂件系统会根据分区的⼤⼩划分为数个Block Group。⽽每个Block Group都有着相同的结构组成

3.3块组内部构成

3.3.1 超级块(Super Block)

存放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有:bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。Super Block的信息被破坏,可以说整个⽂件系统结构就被破坏了
超级块在每个块组的开头都有⼀份拷⻉(第⼀个块组必须有,后⾯的块组可以没有)。 为了保证⽂件系统在磁盘部分扇区出现物理问题的情况下还能正常⼯作,就必须保证⽂件系统的super block信息在这种情况下也能正常访问。所以⼀个⽂件系统的super block会在多个block group中进⾏备份,这些super block区域的数据保持⼀致

3.3.2 GDT(Group Descriptor Table)

块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储⼀个块组的描述信息,如:在这个块组中从哪⾥开始是inode Table,从哪⾥开始是Data Blocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。

3.3.3 块位图(Block Bitmap)

Block Bitmap中记录着Data Block中哪个数据块已经被占⽤,哪个数据块没有被占⽤
利用比特位记录

3.3.4 inode位图(Inode Bitmap)

表⽰⼀个inode是否空闲可⽤。

利用比特位记录

3.3.5 i节点表(Inode Table)

存放⽂件属性 如 ⽂件⼤⼩,所有者,最近修改时间等
当前分组所有Inode属性的集合
inode编号以分区为单位,整体划分,不可跨分区,可以跨组

3.3.6 Data Block

数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:

对于普通⽂件,⽂件的数据存储在数据块中。
对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls -l命令看到的其它信息保存在该⽂件的inode中。
Block 号按照分区划分,不可跨分区

3.4 inode和datablock映射

inode内部存在
__le32 i_block[EXT2_N_BLOCKS];
/* Pointers to blocks */ ,
EXT2_N_BLOCKS =15
就是⽤来进⾏inode和block映射的
这样⽂件=内容+属性,就都能找到了

分区之后的格式化操作,就是对分区进⾏分组,在每个分组中写⼊SB、GDT、Block Bitmap、Inode Bitmap等管理信息,这些管理信息统称: ⽂件系统
只要知道⽂件的inode号,就能在指定分区中确定是哪⼀个分组,进⽽在哪⼀个分组确定是哪⼀个inode
拿到inode⽂件属性和内容就全部都有了
创建⼀个新⽂件主要有以下4个操作:
1. 存储属性
内核先找到⼀个空闲的i节点(这⾥是263466)。内核把⽂件信息记录到其中。
2. 存储数据
该⽂件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第⼀块数据复制到300,下⼀块复制到500,以此类推。
3. 记录分配情况
⽂件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
4. 添加⽂件名到⽬录
新的⽂件名abc。内核将⼊⼝(263466,abc)添加到⽬录⽂件。⽂件名和inode之间的对应关系将⽂件名和⽂件的内容及属性连接起来。

3.5 ⽬录与⽂件名

对于目录也有inode和数据内容,它的保存方式和文件一样,对于文件名保存在所属目录的数据内容中
在Linux中用户访问⽂件,为什么可以通过⽂件名来访问对应文件?
访问⽂件,必须打开当前⽬录,根据⽂件名,获得对应的inode号,然后进⾏⽂件访问 ,所以,访问⽂件必须要知道当前⼯作⽬录,本质是必须能打开当前⼯作⽬录⽂件,查看⽬录⽂件的内容!

3.6 路径解析

打开当前⼯作⽬录⽂件,查看当前⼯作⽬录⽂件的内容?当前⼯作⽬录不也是⽂件吗?访问当前⼯作⽬录不也是只知道当前⼯作⽬录的⽂件名吗?要访问它,不也得知道当前⼯作⽬录的inode
吗?
所以类似"递归",需要把路径中所有的⽬录全部解析,出⼝是"/"根⽬录。
⽽实际上,任何⽂件,都有路径,访问⽬标⽂件,⽐如:
/home/Azusa/code/test/test/test.c
都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到test.c。这个过程叫做Linux路径解析。
注意:
访问⽂件必须要有⽬录+⽂件名=路径的原因
根⽬录固定⽂件名,inode号,⽆需查找,系统开机之后就必须知道

路径谁提供?

访问⽂件,都是指令/⼯具访问,本质是进程访问,进程有CWD!进程提供路径。
open⽂件,提供了路径 

可是最开始的路径从哪⾥来? 

本质就是在磁盘⽂件系统中,新建⽬录⽂件。⽽新建的任何⽂件,都在系统指定的⽬录下新建,此时就有路径了
系统+⽤⼾共同构建Linux路径结构.

3.7 路径缓存

对于一个文件,每次访问都要进行路径解析,而这样效率很低,因此Linux中OS在进行路径解析的时候会把历史访问的所有目录形成一颗多叉树保存,而这个结构struct dentry
注意:
每个⽂件其实都要有对应的dentry结构,包括普通⽂件。这样所有被打开的⽂件,就可以在内存中形成整个树形结构
整个树形节点也同时会⾪属于LRU(Least Recently Used,最近最少使⽤)结构中,进⾏节点淘汰
整个树形节点也同时会⾪属于Hash,⽅便快速查找
更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何⽂件,都在先在这棵树下根据路径进⾏查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径

3.8 挂载分区

在上文能够根据inode号在指定分区找⽂件了,也已经能根据⽬录⽂件内容,找指定的inode了,怎么找到自己所在的分区?

此时就需要一个特定的目录来进行关联,而这个目录就是就需要挂载才能使用

怎么利用Linux进行挂载这里就不做叙述

3.9 总结图

4.软硬连接

4.1 硬链接

在上文了解到真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应于同⼀个inode。
这两个链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode
789401的硬连接数为2。
删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则
将对应的磁盘释放。
硬链接本质不是一个独立的文件,因为没有独立的inode,其实就是一组新的文件名和目标inode number映射关系,主要的作用就是用来对文件进行备份
目录下这两个隐藏文件.和.. 是硬链接

4.2 软链接

硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式

4.3 软硬连接对⽐及用途

软连接是独⽴⽂件
硬链接只是⽂件名和⽬标⽂件inode的映射关系
⽤途:
硬链接:⽂件备份
软连接:类似快捷⽅式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93001.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93001.shtml

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

相关文章

Mac如何安装telnet命令

Mac如何安装telnet命令_mac telnet-CSDN博客

【SpringBoot】持久层 sql 注入问题

目录 概述 #{} 与 ${} 概述 前端恶意传参,改变后端 sql 语句的语法结构,从而使后端给前端返回一些私密的数据。这种安全问题往往是因为没有严格过滤参数,或者后端代码不严谨导致的。 #{} 与 ${} 在 MyBatis 框架中,#{} 与 ${} 都…

怎么写好汉语言文学专业的论文?

磨刀不误砍柴功, 前期多看文章和文献,吸取写作经验,写作过程会更加顺利噢!看到最后,相信你能得到收获! 写汉语言专业论文并不难,从选题、资料准备、框架搭建、正文写作、修改定稿五个核心环节展…

MySQL User表入门教程

一、User表概述 MySQL的user表位于mysql系统数据库中,是MySQL权限系统的核心,用于存储用户账户信息、认证方式和全局权限。通过操作此表,可实现用户创建、权限分配及安全审计。 二、User表核心字段解析字段名作用示例值Host用户允许连接的主机…

[NPUCTF2020]这是什么觅

题目是一个文件,我们先以记事本打开一下,开头就是PK,基本可以确定这是一个 ZIP 格式的压缩包​,不确定可以用winhex打开:​50 4B 03 04开头则 100% 是 ZIP 文件。改一下后缀之后解压得到一张图片上面是日期&#xff0c…

每日任务day0812:小小勇者成长记之挤牛奶

清晨,薄雾还缭绕在草地上,小小勇者背着编织篮子来到农场。奶牛们低头咀嚼,尾巴轻轻拍打着苍白的露珠。老人微笑着递给他一只温热的牛奶罐,说:“第一次要慢,别惊扰它们。”勇者学着老人弯下身,温…

IIS 多用户环境中判断服务器是否为开发用电脑,数据状态比较

如果只需要在 IIS 多用户环境中判断服务器是否为开发用电脑(一个固定状态,通常不会动态切换),代码可以进一步简化。这种场景下,状态一般是启动时确定的(如通过配置文件或环境变量),后…

P2865 [USACO06NOV] Roadblocks G

思路:严格次短路,在任何情况下如果发现一条从1到i的路,都有以下情况:1.该路径小于当前1到i的最短路,将最短路替换2.该路径长度等于当前最短路,舍去3.该路径大于最短路且小于次短路,将此路径替换…

基于Hadoop的汽车价格预测分析及评论情感分析可视化系统

文章目录有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主一、项目背景二、项目目标三、系统架构四、功能模块五、创新点六、应用价值与前景每文一语有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 一、项目背景 近年…

gpt-5与gpt-5-fast

简单来说: GPT-5 → 追求最高质量的推理,输出会更细致、更准确,尤其适合需要深度思考、长链推理、严谨分析的任务(比如复杂代码调试、长文档推理、系统设计)。速度相对慢一些。GPT-5-fast → 追求更高的响应速度&#…

Mybatis源码解读-SqlSession 会话源码和Executor SQL操作执行器源码

相关流程图整理元数据简略图执行流程图一级缓存、二级缓存设计与查询流程分析图一级缓存设计-类图一级缓存工作流程图二级缓存设计-类图二级缓存工作流程图元数据简略图 执行流程图 一级缓存、二级缓存设计与查询流程分析图 一级缓存设计-类图 一级缓存工作流程图 二级缓存设计…

使用Excel制作甘特图

最终效果:专业的项目管理团队通常会使用project制作甘特图,但是很多人没接触过这个软件,另外project制作的甘特图并不适合放在PPT中展示。由于Excel图表的数据标签无法准确识别月初和月末,如果使用原始数据直接做的效果是这样的&a…

超详细基于stm32hal库的esp8266WiFi模块驱动程序(可直接移植)

目录 前言: 1 前期准备 1.1 了解mqtt通信协议 1.1.1核心组件 1.2 ESP8266固件烧录 1.3 启动EMQX服务器 1.3.1大概了解emqx的使用 2 驱动代码讲解应用 2.1 硬件接线 2.2 AT指令 2.3 驱动代码 2.4 效果展示 前言: esp8266支持mqtt通信协议&…

redis认识缓存击穿

缓存击穿是指 一个非常热点的数据(被高并发访问)在缓存中过期失效的瞬间,导致大量并发请求同时穿透缓存,直接落到底层数据库,造成数据库瞬间压力剧增甚至崩溃的现象。关键特征和你的描述解析“数据库没有就需要命中的数…

TF-IDF——红楼梦案例

目录 用 TF-IDF 挖掘《红楼梦》各回目核心关键词:一个 NLP 实践案例 一、案例背景与目标 二、实现步骤 步骤 1:数据准备与分卷处理 1. 导入模块与创建目录 2. 打开源文件并初始化变量 3. 逐行处理文本内容 4. 写入卷内容并过滤前两行 5. 关闭最后…

【软考中级网络工程师】知识点之 IP QoS 技术

目录一、IP QoS 技术是什么1.1 定义与概念1.2 重要性和应用场景二、IP QoS 技术原理2.1 流量分类与标记2.2 流量整形与限速2.3 拥塞避免与管理2.4 资源预留协议(RSVP)三、IP QoS技术模型3.1 尽力而为服务模型3.2 综合服务模型(IntServ&#x…

Git 常用命令速查表

一、仓库初始化与克隆命令说明git init在当前目录初始化本地仓库git clone <远程仓库地址>克隆远程仓库到本地&#xff08;例&#xff1a;git clone https://github.com/user/repo.git&#xff09;二、文件状态与提交命令说明git status查看工作区 / 暂存区文件状态git a…

第五十四章:AI模型的“压缩大师”:GPTQ、AWQ与bitsandbytes实战量化

AI模型压缩前言&#xff1a;让训练好的AI模型“轻装上阵”第一章&#xff1a;回顾与挑战&#xff1a;训练后量化&#xff08;PTQ&#xff09;的必要性1.1 量化原理与精度类型回顾&#xff1a;FP32到INT4/INT81.2 PTQ&#xff08;Post-Training Quantization&#xff09;&#x…

在Word和WPS文字一页中实现一栏与多栏混排

在Word和WPS文字的一页中如何实现分栏和不分栏的内容混排&#xff1f;只需要使用分栏功能。把光标放在要分栏的位置&#xff0c;插入分栏即可&#xff0c;最关键的点是分栏应用于“插入点之后”。如果不需要分栏&#xff0c;则栏数选择为1即可。一、Word和WPS文字的分栏设置路径…

Python调用C/C++函数库的多种方法与实践指南

Python作为一门高级编程语言&#xff0c;以其简洁的语法和丰富的库生态赢得了开发者的青睐。然而&#xff0c;在计算密集型任务中&#xff0c;Python的性能往往无法满足要求。Python调用C/C函数库成为提升应用性能的关键技术路径&#xff0c;通过将底层计算逻辑用C/C实现&#…