Linux之理解文件系统——文件的管理

文章目录

  • 前言
  • 一、磁盘
    • 1.磁盘的物理结构
    • 2.磁盘的存储结构
    • 3.磁盘的逻辑结构
  • 二、文件系统与inode
    • 1.文件在磁盘中是如何存储的?
    • 2.对文件进行操作
  • 三、软硬链接
    • 1.软链接
      • 创建软链接:
      • inode
      • 删除软链接:
      • 软链接的作用:
    • 2.硬链接
      • 创建硬链接:
      • inode
      • 删除硬链接
      • 硬链接的作用
      • 目录不能自定义建立硬链接
  • 总结


前言

我们在之前的文章中讨论的都是进程和被打开的文件的关系,但是如果一个文件时没有被打开,它是否需要被管理?它该如何被管理呢?
本文介绍了文件存储的位置:磁盘,它的三种结构(物理结构、存储结构以及逻辑结构);管理文件的结构:文件系统与inode;以及文件与inode之间的关系:软硬链接等相关概念。


一、磁盘

磁盘是计算机的主要存储介质,它可以存储大量二进制数据,即使断电后也可以保证数据不会丢失。下面我们将了解磁盘的物理结构、存储结构以及逻辑结构

1.磁盘的物理结构

磁盘是外设,他也是计算机中唯一的机械结构(访问外设相对较慢的原因就是机械结构的运行速度比电流的运行速度慢)。
磁盘的盘片和盘面类似于光盘,不过磁盘是两面都是光面,光盘只有一面(盘面上存储着数据)。
像刀子一样的是磁头(每一面都有一个磁头),磁头与盘面(两者每一接触)之间有马达。一旦盘片加电,盘片旋转,磁头摆动,马达可以控制磁头摆动,控制盘片旋转。
对应的磁盘有自己的硬件电路,通过硬件电路 + 伺服系统,给磁盘发送二进制指令,让磁盘定位寻址盘面上的某个区间。

2.磁盘的存储结构

  1. 磁盘寻址的时候,其基本单位既不是bit也不是byte,而是扇区。
  2. 扇区的大小:521字节,521字节是硬件要求,对于外磁道和内磁道来说大小都是一样的,它们只是密度不同。越靠近圆心的比特位越大,外侧的比特位较小。
  3. 在单面上定位扇区:通过确定磁道,以及确定对应磁道的扇区,来具体确定该区间。确定磁道:每一个磁道都有自己的编码,磁道周长不同,但是存储大小相同。由于扇区大小是相同的,因此每一个磁道有多少个扇区也是一定的,所以每一个磁道的扇区也是有编号的,因此定位到磁道就能找到对应扇区。
  4. 机械硬盘的寻址方式:盘片不断的转动,磁头不断的摆动,就是在确认在哪个磁道。如何确定扇区?盘片的先选择就是让其磁头定位扇区。
  5. 柱面:把一系列同心的磁道压在一起,宏观上看成一个整体。一般定位的时候,(磁头、柱面、扇区)与(磁头、磁道、扇区)这两个是等价的。磁头指向的位置就是柱面的边界位置。
  6. 在磁盘中定位扇区:先定位在哪个磁道(在哪个柱面),磁道定位后,(因为,所有磁头共同进退)再去定位盘面(磁头),最后确定是哪一个扇区。

总结:在磁盘中定位一个扇区,采用硬件级别定位方法(CHS定位法):柱面(Cylinder)——磁头(Head)——扇区(Sector)

3.磁盘的逻辑结构

我们都见过磁带(复读机等机器用过),它卷起来是圆柱,将它拆开就是一条很长的线。
我们可以将磁盘盘面想想成类似的结构。站住OS的角度,它认为磁盘的盘面是线性结构,它为每一个扇区划分好了空间,整个磁道相当于一个数组。要访问某个扇区,只需要定位到对应的数组下标。在操作系统内部,我们将这种地址称为LBA(Logic Block Address),如果要将它写在磁盘上,则我们要将对应的LBA转化为对应磁盘的三维地址:CHS地址。
总结:OS中的地址为LBA,对应的磁盘地址为CHS地址。

由于OS要进行逻辑抽象,不直接使用CHS,原因:

  1. 便于管理,管理数组和管理三维立体结构两者之间,数组更好管理;
  2. 让OS的代码和硬件磁盘解耦(避免它们之间强耦合)。例如:磁盘的基本大小(每个扇区对应的存储空间)发生改变,OS的源码也要发生改变吗?我们当然不需要OS的源码发生改变。

二、文件系统与inode

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

文件在磁盘中,而磁盘的逻辑结构是线性结构。磁盘的空间很大,OS内文件系统会定制多个扇区进行读写,以1KB、2KB、4KB为单位,即使读取/修改1bit的内容,也必须将4KB的内容加载到内存中进行读取或修改,完成操作后再将其写回磁盘。虽然磁盘的访问的基本单位是521字节,但是还是相对于整个磁盘的大小还是很小的。
为了方便管理,我们采用分治的思想,对磁盘空间进行分区:1个较大的磁盘空间 ——> 多个较小的磁盘空间,再给不同的分区写入不同的文件系统。
在这里插入图片描述

  1. Boot Block是启动块,存在每个分区的开头,备份与启动相关的文件;
  2. 将剩余的空间继续分组,Block group 0 …… Block group n。管理好Block group 0,其他的也可以管理好,因此我们需要了解Block group 0;
  3. Super Block:保存的是整个文件系统的信息,为什么Super Block不能像Boot Block一样存在与每个分区的开头?
    将Super Block保存在不同的分组中是为了备份,假如某个Super Block损坏,我们可以通过拷贝其他分组的Super Block来修复它。
  4. Linux的文件 = 内容 + 属性。Linux的文件内容和属性是分批存储的。文件属性保存在inode中,inode的大小是128字节,是固定的。一个文件有且仅有一个inode与之对应。inode中存储文件几乎所有的属性,但是文件名并不在inode中存储。文件内容存储在data block块中,不同的文件,文件内容是不同的,大小也不同。
  5. inode为了区分彼此,每一个inode都有自己的ID,我们可以通过指令ls -li 来查询文件对应的inode编号。
    在这里插入图片描述
  6. inode table保存分组内部所有的可用(已经使用 + 没有使用)inode。
  7. Data blocks 保存分组内部所有文件的数据块(保存文件内容)。
  8. inode Bitmap:inode对应的位图结构,统计inode的使用情况,位图中比特位的位置与当前文件对应的inode的位置是一样对应的,比特位为1说明该inode已经被占用,否则表示未被占用(即,可以被使用)。
  9. GDT(group descripteor table):块组描述表,对应分组的宏观的属性信息,inode有多少个,已经使用多少,已经被占用多少个,还剩下多少个。
  10. 查找文件时,统一用的是inode编号。

文件内容放在data blocks中,文件属性保存在inode中,而inode内部有一个数组,保存对应data blocks块的编号,二者就联系起来了。
在这里插入图片描述
如果文件特别大,并不是所有的data blocks都只能存储文件数据,它也要存储其它块的块号,所以一个blocks块会指向其它多个blocks来存储文件数据(这样能存更多)。
在这里插入图片描述

2.对文件进行操作

  • 创建文件:位图的比特位由0置为1,找到其inode table,将文件属性填进去,文件的数据写入data blocks中,建立inode和block之间的映射关系;

  • 查找文件:拿到inode找到对应的inode table,根据inode table 找到对应的数据块,就拿到了文件的内容 + 属性;

  • 删除文件:删除文件只需要找到inode在inode bitmap中的比特位,然后将该比特位由1置为0即可。

  • 恢复文件

删除文件并不需要将文件的数据和内容情况,只需要将对应文件的inode在inode bitmap中的比特位 置为0即可(即使不将它们清空也不会影响新文件的存储,因为新文件的数据会直接将原数据覆盖掉)。因此,在删除文件后是可以及时将文件恢复的,恢复文件只需要找到inode的编号,然后把inode bitmap里对应的比特位由0置为1,再去inode table对应映射表,将blosk bitmap由0置为1即可。
如果在Linux中误删一个文件,还是可以恢复的,前提是文件的inode和data block没有被占用,因此当误删一个文件时最好的做法是什么也不做。
在windows下,删除文件到回收站,实际上是将文件转移到回收站的目录而已,只有在回收站中删除才是真的删除。

为什么我们在目录中查找文件时,用的是文件名而不是inode?
因为任何一个文件都是创建在目录下的(注意,同一目录下不能出现相同文件名的两个文件),目录也是一个文件,也有自己的inode,以及data block。目录的数据块(data block)中存储的是当前目录下的文件的文件名与文件的inode的对应关系(这也是为啥inode中不保存文件名)。
新增文件要向当前目录的内容(data block)中写文件名与inode的映射关系,所以当我们在一个目录下新增文件时,必须要有对目录的写权限
罗列当前目录的文件,要有对目录的读权限,想知道目录中的文件,需要根据文件名找到inode,再读取该文件的属性,读目录内容是拿到文件名,因此目录必须要有读权限

三、软硬链接

1.软链接

创建软链接:

ln -s myfile.txt soft_file.link

文件myfile.txt

在这里插入图片描述
在这里插入图片描述
文件soft_file.link
在这里插入图片描述

inode

可以从上图中看到,soft_file.link是具有自己独立的inode,因此它是一个独立的文件,具有自己独立的内容。
所谓的软链接标定文件,它并不是用文件的inode来标记。看这个现象:我们删除myfile.txt然后再去cat soft_file.link:
在这里插入图片描述
软链接并没有用目标文件对应的inode,而是用目标文件的文件名,软链接的数据块中保存的是指向目标文件的路径,当目标文件被删除时,软链接也就失效了。

删除软链接:

  1. rm
rm -f soft_file.link//和删除普通文件一样
  1. ulink
ulink soft_file.link//删除链接

软链接的作用:

软链接就类似于windows下的快捷方式(桌面的软件图标就是该软件exe的快捷方式,软件实际上的存储位置并不在桌面,我们可以通过快捷方式直接去执行该exe文件)。
执行路径非常深,导致路径非常长不方便记忆,因此我们可以通过软链接来访问文件,这样就不用每次都输入长长的路径来访问文件。
在这里插入图片描述

2.硬链接

创建硬链接:

ln myfile.txt hard_file.link

在这里插入图片描述

inode

可以发现,硬链接没有独立的inode,它的inode是目标文件的inode,因此它不是一个独立的文件。

硬链接的作用?
当硬链接的其中一个文件的大小和内容发生变化,那么它对应的目标文件以及所有目标文件的硬链接都会一起发生改变。硬链接没有创建新的文件,它没有独立的inode、属性、内容。它用的全部是目标文件的inode和内容。

创建硬链接的本质就是在指定的路径下,新增文件名和inode的映射关系

在这里插入图片描述
一个inode可能会被多个文件名所映射,为了方便管理,inode有一个计数器,count的引用计数,将引用计数称为硬链接数:
在这里插入图片描述
这也是为什么我们发现数字由1变为2了,此时inode被两个文件名所指,因此硬链接数变为2。
在这里插入图片描述

删除硬链接

如果把硬链接的目标文件删除,目标文件:
在这里插入图片描述
inode的引用计数变为1,即去掉了一组映射关系。
只有当文件的硬链接数变为0时,该文件才是真的被删除了

硬链接的作用

  1. 为啥创建一个普通文件时,硬链接数是1?
    因为,普通文件本身就有一个文件名和inode对应(只要创建文件,就有一个inode的映射关系)。
  2. 为啥创建一个目录,它的硬链接数是2?
    因为目录于它自己的inode就是一组1映射关系;其次,目录内部的'.''.'也表示当前目录,它也是文件名)和inode也是一组映射,所以硬链接数是2。
    在这里插入图片描述

特别的,在当前目录下创建再一个目录,当前目录的硬链接数会变为3,因为当前目录下创建的哪个目录中默认的文件名'..''..'表示上一层目录,它也是文件名)和inode也是一组映射。
在这里插入图片描述
上面的是2,原因是在创建dir2之前打开的,因此没有及时更新,我们看最下面的结果(硬链接数为3)即可。

目录不能自定义建立硬链接

我们发现Linux不允许普通用户给目录建立硬链接。
在这里插入图片描述
这是为什么呢?
我们知道,Linux默认会给目录建立两个硬链接:'.''..'
假如,我们是root(超级用户),系统允许超级用户给目录创建硬链接。我们给根目录创建硬链接,新创建的硬链接的文件名从根目录开始查找,查找到的硬链接就是根目录,此时就造成了递归式查找(环形查找),导致软件无法正常进行查找。因此不允许普通用户给目录建立硬链接。


总结

以上就是今天要讲的内容,本文介绍了磁盘的三种结构、文件系统与inode以及软硬链接的相关概念。本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

堆(堆排序 模拟堆)

目录 一、堆的数据结构二、堆的操作方法往下调整的示意图往上调整的示意图相关功能的实现思路1.插入一个数2.求最小值3.删除最小值4.删除任意一个元素5.修改任意一个元素 三、堆的实战运用堆排序模拟堆 一、堆的数据结构 堆是一个完全二叉树:除了最后一层结点以外&…

3ds MAX 基本体建模,长方体、圆柱体和球体

3ds MAX基本页面如下: 生成新的几何体在右侧: 选择生成的对象类型即可,以下为例子: 1、长方体建模 选择建立的对象类型为长方形 在 任意一个窗口绘制,鼠标滑动 这里选择左上角的俯视图 松开鼠标后,可以…

第18章 JQuery DataTables初始化渲染显示与排序

1 System.Linq.AsyncIEnumerableExtensions (Data\Extensions\AsyncIEnumerableExtensions.cs) namespace System.Linq { /// <summary> /// 【异步枚举数扩展--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过对System.Linq.Async中方法的自定义扩展…

C++进阶 —— set

目录 一&#xff0c;set介绍 二&#xff0c;set使用 一&#xff0c;set介绍 set是按照特定次序存储元素的关联式容器&#xff0c;元素不可重复&#xff1b;set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可从容器中插入和删除它们&#xff1b;set中的元素总是按…

【测试报告】个人博客系统自动化测试报告

文章目录 项目背景项目功能测试计划功能测试测试用例执行测试的操作步骤 自动化测试设计的模块、自动化运行的结果、问题定位的结果自动化测试优点 项目背景 对于一个程序员来说&#xff0c;定期整理总结并写博客是不可或缺的步骤&#xff0c;不管是对近期新掌握的技术或者是遇…

代码随想录算法训练营第五十三天 | 力扣 1143.最长公共子序列, 1035.不相交的线, 53. 最大子序和

1143.最长公共子序列 题目 1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符…

SpringBoot——原理(自动配置+原理分析-源码跟踪)

源码跟踪 从Springboot的启动类进入&#xff0c;进行分析. 源码跟踪技巧 在以后接触各种框架的时候&#xff0c;如果需要查看源码&#xff0c;需要找到关键点和核心流程&#xff0c;先在宏观对整个原理和流程有一个认识&#xff0c;之后再去了解其中的细节。 按住Ctrl左键进…

怎么实现常用网络接口自动化测试框架应用?

一、RESTful&#xff08;resource representational state transfer)类型接口测试 (一&#xff09;GUI界面测试工具&#xff1a;jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

基于物理信息的神经网络(Physics-informed Neural Networks;PINNs)Part-1(简单介绍)

【摘要】 基于物理信息的神经网络&#xff08;Physics-informed Neural Networks&#xff0c;简称PINNs&#xff09;&#xff0c;是一类用于解决有监督学习任务的神经网络&#xff0c;它不仅能够像传统神经网络一样学习到训练数据样本的分布规律&#xff0c;而且能够学习到数学…

UFS 2 -UFS架构简介2

UFS 2 -UFS架构简介2 1 UFS架构简介1.1 System Boot and Enumeration1.2 UFS Interconnect (UIC) Layer1.2.1 UFS Physical Layer Signals1.2.2 MIPI UniPro1.2.3 MIPI UniPro Related Attributes 1.3 UFS Transport Protocol (UTP) Layer1.3.1 Architectural Model1.3.1.1 Cli…

图解max{X,Y}和min{X,Y}并求相关概率

图解max{X,Y}和min{X,Y}并求相关概率 对max{X,Y}或min{X,Y}进行分解再求解 P ( m a x { X , Y } ≥ c ) P [ ( X ≥ c ) ∪ ( Y ≥ c ) ] P ( m a x { X , Y } ≤ c ) P [ ( X ≤ c ) ∩ ( Y ≤ c ) ] P ( m i n { X , Y } ≥ c ) P [ ( X ≥ c ) ∩ ( Y ≥ c ) ] P ( m i…

k8s功能优势应用场景介绍(一)

一&#xff0c;K8S功能: 1、数据卷 pod中容器之间共享数据&#xff0c;可以使用数据卷 2、应用程序健康检查 容器内服务可能进程阻塞无法处理请求&#xff0c;可以设置监控检查策略保证应用健壮性 3、复制应用程序实例 控制器维护着pod副本数量&#xff0c;保证一个pod或一组同…

C++11 auto类型推导

1.类型推导 C11引入了auto 和 decltype 关键字实现类型推导&#xff0c;通过这两个关键字不仅能方便地获取复杂的类型&#xff0c;而且还能简化书写&#xff0c;提高编码效率。 auto 类型推导的语法和规则 在之前的 C 版本中&#xff0c;auto 关键字用来指明变量的存储类型…

Allure测试报告定制全攻略,优化你的Web自动化测试框架!

目录 前言&#xff1a; 1. Allure测试报告简介 2. Web自动化测试框架简介 3. 封装Web自动化框架 3.1 安装Selenium 3.2 封装Selenium 3.3 定制Allure测试报告 3.3.1 适配翻译插件 3.3.2 定制测试报告样式 4. 示例代码 5. 总结 前言&#xff1a; 随着现在Web应用的普…

SciencePub学术 | 计算机科学类重点SCIEI征稿中

SciencePub学术刊源推荐: 计算机科学类SCI&EI征稿中&#xff01;录用率高&#xff0c;自引率低&#xff0c;进展顺利。信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 【期刊简介】IF&#xff1a;4.0-4.5↑&#xff0c; JCR 2区&#xff0c;中科院3区…

SpringAOP简介及实现(包含切面、切点、连接点和通知)

目录 1.什么是AOP、SpringAOP&#xff1f; 2.AOP的组成 3.SpringAOP的实现 4.切点的表达式 1.什么是AOP、SpringAOP&#xff1f; 在学习SpringAOP之前&#xff0c;我们得先了解一下什么是AOP。AOP是一种面向切面编程的思想。那什么是切面呢&#xff1f;它其实是对某一类事情…

【HR专用】Vue+SpringBoot,实现人才招聘库的开发(后端部分)

人才招聘库是企业用于储存和管理潜在候选人信息的数据库。通常情况下&#xff0c;这些候选人可能已经应聘过公司的职位&#xff0c;也可能是通过其他途径获取的&#xff0c;例如社交网络、招聘网站等。 对于一个中小公司来说&#xff0c;人力资源部绝对是一个重要部门&#xff…

测试类型(单元、集成、系统或手动测试)

测试类型(单元、集成、系统或手动测试) 单元测试 单元是系统的单个组件&#xff0c;例如类或单个方法。孤立地测试单元称为单元测试。 优点&#xff1a;速度快/易控/易写 缺点&#xff1a;缺乏现实性/无法捕获所有错误&#xff08;例如与其他组件或服务的交互&#xff09; 单元…

Arthas-JVM相关命令使用

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 开头&#xff1a; 我们先说下生产使用频率较高的有哪些&#xff1a;dashboard、heapdump、jvm…

【连续介质力学】二阶张量的图像表示

二阶张量在特定方向的投影 法向和切向分量 二阶张量T投影到 n ^ \hat n n^方向的结果是 t ⃗ ( n ^ ) T ⋅ n ^ \vec t^{(\hat n)}T \cdot \hat n t (n^)T⋅n^&#xff0c;其中 t ⃗ ( n ^ ) \vec t^{(\hat n)} t (n^)可以分解成&#xff1a; t ⃗ ( n ^ ) T ⃗ N T ⃗ S…