【Linux】理解文件系统

 需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网,轻量型云服务器低至112元/年,优惠多多。(联系我有折扣哦)

文章目录

  • 1. 了解磁盘
    • 1.1 磁盘的物理结构
    • 1.2 磁盘的逻辑结构
    • 1.3 磁盘的存储结构
  • 2. 文件系统
    • 2.1 磁盘的组织方式
    • 2.2 inode的概念
    • 2.3 文件的访问方式

在上一节中,我们了解了被打开的文件是怎么被管理的,怎么被使用的,怎么和进程联系起来的…这些东西都是对被打开的文件的管理。但是除了这些被打开的文件之外,还有非常多的没有被打开的文件,静悄悄的躺在磁盘上。那么这些文件也是需要被管理起来的,接下来我们来了解一下这些没有被打开的文件是怎么管理起来的。

1. 了解磁盘

我们知道,没有被打开的文件是存放在磁盘上的,所以,要了解未被打开的文件是怎么被管理的就首先要了解磁盘的结构,包括物理结构、逻辑结构和存储结构。这里以机械硬盘为例,来了解一下磁盘的结构。

1.1 磁盘的物理结构

img

磁盘由一系列的物理结构组合而成,其中最重要的部分就是磁头、盘面。数据是存放在盘面上的,通过磁头来将数据读取或者写入。

1、磁盘中每个盘片的每一面都配有一个磁头,且磁头和盘面是没有接触的,二者的距离非常非常低,而一旦有灰尘等杂质落入到磁盘中就可能会导致磁头撞击灰尘从而刮花盘面,所以磁盘拆开后就会损坏。

2、现在一般个人的笔记本都是使用固态硬盘 SSD,而不再使用磁盘,因为磁盘的磁头与盘面距离非常近,所以为了避免磁盘与盘面接触而刮花盘面导致数据丢失,磁盘不能抖动;但是笔记本通常要进行移动,很可能会发生上述故障;同时,SSD 的读写速度要高于磁盘。

3、但是在企业端,磁盘仍然是存储的主流,因为企业中主机都统一放置在机房中,轻易不会移动;同时,SSD 存在造价贵、读写次数有限等缺点。

4、磁盘是计算机中唯一一个纯机械结构的设备,同时磁盘还是外设,所以磁盘进行数据读写的速度很慢。

1.2 磁盘的逻辑结构

磁道:磁盘的表面即盘面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据;同时,盘面被划分为一个个同心圆,这些同心圆被称为 磁道 (一个同心圆就是一个磁道),相邻磁道之间是有间隙的,我们的数据就存在磁道上。

扇区:从圆心向外放射,与磁道围成的一小块区域称为扇区,一个磁道会被划分为许多个扇区,每个扇区就是一个 “磁盘块”,这是磁盘寻址的基本单位,即数据进行 IO 的单位,大小一般为 512 byte。(注:每个扇区的大小是固定的,所以从圆心往外,扇区的数据存储密度会随着扇区面积的增大而减小)

柱面:磁盘中所有盘面的同一个磁道被称为一个柱面,可以说,柱面和磁道是等价的。

简单的示意图如下

img

磁盘寻址的过程:

磁盘在IO的过程中,需要进行寻址。寻址的过程主要如下:1.定位磁道,也就是在哪一个柱面(cylinder)2. 确定在哪一个盘面,也就是用哪一个磁头(head)3. 最后再确定在哪一个扇区(sector)

上述过程在物理上的表现方式如下:启动主轴后,所有的盘片以同样的方式进行高速旋转,同时所有的磁头也共同从圆心到半径左右摆动,当定位到柱面后,磁头停止摆动,盘片继续旋转,当盘片对应扇区旋转到磁头下方后,对应盘面的磁头向扇区中写入/读取数据。

所以,在磁盘中定位任意一个/多个扇区,采用的基本硬件定位方式是 柱面、磁头、扇区定位,即 CHS 定位法

1.3 磁盘的存储结构

相比较于这种三维立体的结构,实际上线性的结构更方便去管理。所以在存储的过程中,我们是把这个磁盘的立体结构转化成线性的存储结构来管理

image-20240101173333498

现在就可以把原来对物理结构的管理转换成了对数组的管理

所以只要知道了这个扇区的下标就算定位了一个扇区。在操作系统内部,我们把这种地址称为LBA地址(logic block address)

举个例子:

假设我们现在有这样的参数:有4个盘面,每个盘面有10个磁道,每个磁道有100个扇区,每个扇区有512个字节。

那么现在如果给出指定的LBA地址,就能够找到对应的CHS参数,也就能够定位到对应的磁盘的物理地址了。

假设要找LBA地址是123对应的物理地址:

盘面号 = LBA地址 / (磁道数 * 扇区数) = 123 / 10 * 100 = 0号盘面

磁道号 = LBA地址 / 扇区数 = 123 / 100 = 1号磁道

扇区号 = LBA地址 % 扇区数 = 123 % 100 = 23号扇区

为什么OS要进行逻辑抽象,直接用CHS不行吗?

1. 便于OS管理

2. 不想让OS的代码和硬件强耦合

2. 文件系统

2.1 磁盘的组织方式

文件在磁盘中是如何存储的呢?

我们已经知道了磁盘空间的管理方式是使用线性的结构来管理的。磁盘的空间很大虽然对应的磁盘访问的基本单位是512个字节,但是依旧是很小的!OS内的文件系统定制了多个扇区读取–>1KB,2KB,4KB为基本单位。即使本来希望读取的是1bit,也必须将4KB的内容load进内存,进行读取或者修改。所以我们采用分治的思想,来管理磁盘空间进行分区:大的磁盘空间->小空间,对于每个小空间管理好了,然后把这些小空间组织起来即可

在win10系统中右键此电脑,点击管理、磁盘管理,就能看到这个界面这里好像是把自己的磁盘分成了很多块,实际上,这并不是很多块磁盘,而是把一个磁盘进行了分区。

image-20240101181707473

image-20240101182238895

当然,这个分区和分组的大小是笔者自己杜撰的,便于理解,实际中不一定存在这种分区大小。

实际上对于分区之后的管理,都有一些比较细节的东西

image-20240101191558443

  • Boot Block:启动块,存在于每个分区的开头,备份文件与启动相关的。在当前的分区中剩下的空间将会被继续分组,分成很多个Block Group
  • Super Block:保存所在分区的整个文件系统的信息。这里将superblock在每个分组中保存的原因是用于备份,如果其中一个superblock损坏,可以通过拷贝其他分组中的superblock来恢复。

2.2 inode的概念

文件 = 内容 + 属性

Linux的文件属性和文件内容是分批存储的

  • 保存文件属性的是inode。inode块的大小是固定的,为128字节。一般来说,一个文件有一个inode,包含了这个文件几乎所有的属性(文件名除外)。

  • 文件内容是存储在data bloack中的,不同文件存放的内容不同,这些文件内容的大小随着文件类型的大小也在变化

  • 每个文件都有一个inode,所以会有很多inode。为了区分,所以每个inode都有自己的ID,可以使用ls -li来查看inode编号:

image-20240101204914084

实际上,在每个分组中,都有着对应的区域用于存放对应的内容

  • Super Block:存放所在分区的整个文件系统的信息,在这个分区中的每个分组中都有备份
  • Groupe Descriptor Table:GDT,块组表述表。记录了每个块组的起始块号、空闲块数量、空闲索引节点数量等信息,同时也包括块位图和索引节点位图的起始位置
  • Block Bitmap:data block对应的位图结构,存放对应的data block是否被使用的标志
  • inode Bitmap:inode对应的位图结构,存放对应的inode是否被使用的标志
  • inode Table:保存了分组内部所有可用的inode(包含已经使用的和没有使用的)
  • Data blocks:是真正存放文件内容的内存块,除了上述的内容外,整个分组的所有空间都是数据块

2.3 文件的访问方式

1. 访问文件的属性

首先找到这个文件对应的inode,然后通过inode来访问到inode Table中的数据,这里存放的就是文件的属性相关信息。

2. 访问文件的内容

我们知道文件的内容是存放在Data Blocks中的。那么需要访问文件内容的时候,访问这些DataBlocks即可。

但是我怎么知道这些Data Blocks中的数据是哪个文件的?所以这就需要将inode与DataBlocks联系起来

我们知道inode中存放了文件的属性,那么在inode中再存一个数组,数组内的内容就是使用的Data Blocks。那么就可以通过inode来找到这个文件使用的DataBlocks了

image-20240101220724604

还有一个问题:这个blocks中一共有15个元素,每个元素保存一个DataBlocks,每个datablocks的大小一般是4KB,那么一共也就只能存放4*15=60KB,这也太小了吧?

实际上,在Linux中采用了混合索引的方式来组织这些数据块所谓的混合索引就是在blocks数组的最后几个元素中存放的数据块地址里面存放的内容是其他数据块的地址。一般来说最后三个分别是一级二级和三级索引。

通过文件的访问,我们了解到了文件系统内对文件的管理形式,那么创建文件和删除文件的方法也就显而易见了

**创建文件:**在inode Bitmap中找到一个编号为0的,将其比特位置为1,同时找到找到对应的inode编号,把文件的属性填进去,文件的内容数据写到block里面,在inode和block之间建立映射关系,然后返回inode编号

删除一个文件:删除文件也需要用到inode,实际上删除一个文件时,我们只需要找到inode在inode bitmap当中的比特位,把比特位由1置为0就删除了。所以删除一个文件根本不需要把数据属性和内容清空,只要把inode bitmap的1置为0,属性就删除了,这个文件也占着数据块,也把block的比特位也置为0。所以把文件删除是能够恢复的,一旦删除只是把bit位清掉了,想要恢复只要得到inode的编号,然后把inode bitmap里的比特位由0置为1,在去inode table对应的映射表,在block bitmap的0置为1。

如果在Linux中误删除一个文件,还是能恢复的,但是前提必须是inode和data block没有被占用,所以当误删除一个文件时,最好的办法就是什么都不做。而我们在Windows中删除文件到回收站,只是转移了目录,在回收站中删除才是真正的删除。这里最好为自己的Linux手动设置一个回收站,可以参考这篇博文中的设置方法来做:【Linux】基本知识和权限_

上述我们在说一个文件的时候,使用的都是inode来说的,但是我们在使用文件的时候用的是文件名啊,并不是inode!!!

我们知道,目录也是一个文件,那么目录也有inode,也就是说目录也有数据块,实际上目录的数据块中存放的内容就是当前目录下的文件名和这个文件对应的inode的映射关系所以在权限的章节的时候说了要显示当前目录的所有文件就需要这个目录的读权限,在这个目录下创建文件就需要写权限,这其实都是对这个目录的数据块的读写权限

也有inode,也就是说目录也有数据块,实际上目录的数据块中存放的内容就是当前目录下的文件名和这个文件对应的inode的映射关系所以在权限的章节的时候说了要显示当前目录的所有文件就需要这个目录的读权限,在这个目录下创建文件就需要写权限,这其实都是对这个目录的数据块的读写权限**

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

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

相关文章

2023年12月编程语言排行榜

TIOBE Index for December 2023 December Headline: C# on its way to become programming language of the year 2023 2023年12月的TIOBE指数&#xff1a;12月头条:c#将成为2023年最佳编程语言 Yes, I know, we have been here before. At the end of 2022, it looked like …

全局异常和自定义异常处理

全局异常GlobalException.java&#xff0c;basePackages&#xff1a;controller层所在的包全路径 import com.guet.score_management_system.common.domian.AjaxResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bi…

电脑怎么设置代理IP上网?如何隐藏自己电脑的真实IP?

在现代互联网中&#xff0c;代理IP已成为许多用户保护隐私和上网安全的重要手段。通过设置代理IP&#xff0c;用户可以隐藏自己的真实IP地址&#xff0c;提高上网的安全性&#xff0c;同时保护个人信息不被泄露。本文将详细介绍如何设置代理IP上网以及如何隐藏电脑的真实IP地址…

Vue Tinymce富文本组件添加自定义字体项

实现效果如下&#xff1a; Tinymce 组件进行字体设置 设置完后&#xff0c;就可以使用自定义的字体了。

Spring Boot整合 EasyExcel 实现复杂 Excel 表格的导入与导出功能

文章目录 1. 简介2. 引入依赖3. 导入功能实现3.1 创建实体类3.2 编写导入 Controller3.3 编写导入页面 4. 导出功能实现4.1 编写导出 Controller4.2 编写导出页面 5. 启动应用 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &…

你好2024!

大家好&#xff0c;我是小悟 2024年1月1日&#xff0c;新年的第一天&#xff0c;阳光明媚&#xff0c;空气中弥漫着希望和新的开始的气息。在这个特别的日子里&#xff0c;大家纷纷走出家门&#xff0c;迎接新年的到来。 街道上&#xff0c;熙熙攘攘的人群中&#xff0c;有孩…

【动态管理日志】Spring Boot 实现 热插拔 AOP,非常实用!

现在有这么一个需求&#xff1a;就是我们日志的开与关是交给使用人员来控制的&#xff0c;而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理&#xff0c;但是如何动态的来实现日志管理呢&#xff1f;aop源码中的实现逻辑中有这么一个步骤&#xff0c;就是会…

将学习自动化测试时的医药管理信息系统项目用idea运行

将学习自动化测试时的医药管理信息系统项目用idea运行 背景 学习自动化测试的时候老师的运行方式是把医药管理信息系统项目打包成war包后再放到tomcat的webapp中去运行&#xff0c;于是我想着用idea运行会方便点&#xff0c;现在记录下步骤方便以后查找最开始没有查阅资料&am…

蓝牙物联网灯控设计方案

蓝牙技术是当前应用最广泛的无线通信技术之一&#xff0c;工作在全球通用的 2.4GHZ 的ISM 频段。蓝牙的工作距离约为 100 米&#xff0c;具有一定的穿透性&#xff0c;没有方向限制。具有低成本、抗干扰能力强、传输质量高、低功耗等特点。蓝牙技术组网比较简单&#xff0c;无需…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(3)-训练yolov5模型(本地)

训练yolov5模型&#xff08;本地&#xff09; 训练文件 train.py训练如下图 一些参数的设置weights:对于weight参数&#xff0c;可以往Default参数中填入的参数有 cfg&#xff1a;&#xff08;缩写&#xff09;cfg参数可以选择的网络模型 data对于data hyp 超参数epochs 训练多…

托管在亚马逊云科技的向量数据库MyScale如何借助AWS基础设施构建稳定高效的云数据库

MyScale是一款完全托管于亚马逊云科技&#xff0c;支持SQL的高效向量数据库。MyScale的优势在于&#xff0c;它在提供与专用向量数据库相匹敌甚至优于的性能的同时&#xff0c;还支持完整的SQL语法。以下内容&#xff0c;将阐述MyScale是如何借助亚马逊云科技的基础设施&#x…

张量操作与线性回归

一、张量的操作&#xff1a;拼接、切分、索引和变换 &#xff08;1&#xff09;张量拼接与切分 1.1 torch.cat() 功能&#xff1a;将张量按维度dim进行拼接 • tensors: 张量序列 • dim : 要拼接的维度 torch.cat(tensors, dim0, outNone)函数用于沿着指定维度dim将多个张量…

simulink代码生成(六)——多级中断的配置

假如系统中存在多个中断&#xff0c;需要合理的配置中断的优先级与中断向量表&#xff1b;在代码生成中&#xff0c;要与中断向量表对应&#xff1b;中断相关的知识参照博客&#xff1a; DSP28335学习——中断向量表的初始化_中断向量表什么时候初始化-CSDN博客 F28335中断系…

【计算机毕业设计】SSM汽车维修预约平台

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色&#xff1a; 管理员登录,新增管理员信息,查看管理员信息,查询管理员信息,查看用户信息列表,查询用户信息,新增新闻公告,查看新闻公告,查询新闻公告,新增配件类…

matplotlib范围曲线简例

想在画&#xff08;平均&#xff09;loss 曲线时顺便表示方差&#xff0c;即每一个 epoch 的平均 loss 用 plot 画曲线&#xff0c;而在曲线周围用一个浅色区域表示方差。效果&#xff1a; 参考 [1-3]&#xff0c;用到 matplotlib.pyplot.fill_between 函数。为显示对浅色区及…

不吹不黑,辩证看待开发者是否需要入坑鸿蒙

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 本文没有宏大的叙事&#xff0c;只有基于现实的考量。 通过本文&#xff0c;你将了解到&#xff1a; Har…

Python列表推导式(for表达式)及用法

for 表达式&#xff08;列表推导式&#xff09;用于利用其他区间、元组、列表等可迭代对象创建新的列表。 for 表达式的语法格式如下&#xff1a; [表达式 for 循环计数器 in 可迭代对象] 从上面的语法格式可以看出&#xff0c;for 表达式与普通 for 循环的区别有以下两点&a…

什么是JavaScript

文章目录 一、❄️什么是JavaScript&#xff1f;二、❄️JavaScript的特点三、❄️JavaScript的组成&#x1f9eb;1、核心&#xff08;ECMAScript&#xff09;&#x1f9ff;2、文档对象模型&#xff08;DOM&#xff09;&#x1f94f;3、浏览器对象模型&#xff08;BOM&#xff…

深入理解MySQL索引底层数据结构

听课问题(听完课自己查资料) 什么是二叉树 二叉树是怎么存储数据的一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快&#xff1f;什么是红黑树 红黑树是怎么存储数据的什么是B TREE 是怎么存储数据的什么是BTREE 是怎么存储数据的 疑惑答案 a. 二叉树…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…