当前位置: 首页 > news >正文

Linux知识回顾总结----文件系统

        上章讲的是 os 如果管理被打开的文件,那么没有被打开的文件(也就是在磁盘单中的文件)使用文件系统进行管理。了解完这一章,我们就可以理解我们如果想要打开一个文件的是如何找到整个文件,然后如何把它加载到内存中的,在这之前我们还会进行学习磁盘的物理结构,CHS和LBA地址,理解磁盘是如何进行分区的以及软硬连接的使用和途径!!!

目录

一、 理解磁盘的结构

   1.1 见一见

1.2 磁盘的名词 

1.3 磁盘逻辑结构

1.4 磁盘定位

  1.5 CHS && LBA地址

二、 文件系统

 2.1 “块” 的概念

2.2 分区

2.3 inode

三、Ext2 文件系统

 3.1 是什么

 3.2 有什么

3.3 与实际相关联

  3.3.1 目录与文件名

  3.3.2 路径解析 与 路径缓存

 3.3.3 挂载

四、软、硬链接

4.1 软链接

  4.1.1 是什么

   4.1.2 怎么用

4.2 硬链接

 4.2.1 是什么

 4.2.2 怎么用

五、总结


一、 理解磁盘的结构

   1.1 见一见

     可以看到这个磁盘面非常的光滑,可以认为这个这个光滑的此面是许多的磁性物质组  成,里面存放着我们的数据,然后还有一个磁头,通过磁头的指向,指向特定的区域然后得到想 要的文件

1.2 磁盘的名词 

  主要的名词需要记住的有:磁头,磁道,磁面,柱面,扇区。

    磁道:在磁盘上面可以分成一圈一圈的。虽然你肉眼看到的是一个光滑的平面,但是要是拿一个显微镜看的话也可以看到是一圈一圈的

    柱面:一块磁盘当我们从侧面看的时候是由许多片共同构成的所以,由磁道 + 多个磁面构成的结构立体图形就是柱面。

    磁头:用来进行定位的。每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头

    扇区:由磁头位置到一定长度的磁道位置组成的一个扇形(注意:里面由磁道组成的扇形由远到近,虽然大小不是相同的但是我们规定并且认为不论大小都是相同的)

    磁面:就是我们肉眼可以看到的那个区域。

    补充:扇区是磁盘进行文件储存的一个基本单位,512字节,是一个块设备。

                磁盘容量 = 磁头数 * 磁道数 * 每道扇区数 * 每扇区字节数。

                控制磁头的传送臂式共进退的。

1.3 磁盘逻辑结构

        前面理解了磁盘的物理结构,他是啥样的就是啥样的,但是我可以把它抽象成逻辑结构的方式来进行深入的理解,同时理解我们的文件系统它到底是如何进行工作的。

        小时侯我们都玩过录音带,我们可以看到它的结构是一圈一圈的是不是非常的像我们的磁盘,当我们把他的缠成一圈一圈的磁带将它展开,是不是就是一条长长的线,那我们就可以将它抽象为一个数组,所有我们的磁盘也可以简单的理解成是要给一维数组的方式进行存放数据的,也有的相应的逻辑寻址方式。

        在实际过程当中,因为我们的磁头是共进退的,所有当我以柱面的方式来看待磁盘的时候可以发现是由二维的数组形式来实现的。

1.4 磁盘定位

        当我们需要寻找要给扇区的时候,先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了 CHS 。

        因为我们是将磁盘的逻辑结构看为是一个线性数组,所以每一个扇区都有一地址叫做 LBA(Logical Block Address).

OS只需要使⽤LBA就可以了!!LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘⾃⼰来做!固件(硬件电路,伺服系统)

  1.5 CHS && LBA地址

  • CHS 变 LBA

        扇区数 = 磁头数 * 每磁道扇区的数量

        LBA = 柱面号C * 单个柱面的扇区总数 + 磁头号H*每磁道扇区数 + 扇区号S - 1
(扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的、柱⾯和磁道都是从0开始编号的)

一句话:我是第二个柱面就要加上前面一个柱面的所有扇区的数量,以及我是第几个磁头就要算上我是前面的 n - 1 个磁头对应的扇区的数量,最后在加上我前面的扇区数,以为是从 1 开始而数组的下标是从 0 开始的,所有要 - 1,而柱⾯和磁道都是从0开始编号的刚好可以计算。

  • LAB 变 CHS

         柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】

        磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数

        扇区号S = (LBA % 每磁道扇区数) + 1

         "//": 表⽰除取整

        其实这个转化的内容我们不需要特别熟练,我们需要知道的是磁盘就是一个数组,而数组的下标就是 LBA 地址, os 通过 LBA 这个数组就可以访问磁盘当中的扇区,就可以方式存放在磁盘当中的内容。

二、 文件系统

 2.1 “块” 的概念

      磁盘是一个典型的“块”设备,可以随机读取。并且 os 是以块为一单位进行读取文件,提高os 的效率,我们最常见的块是 4 kb,即连续⼋个扇区组成⼀个 ”块”!

        这么做的目的就是为了提高 os 读取文件的效率。计算方法为 LBA / 8 就是哪个块区。

2.2 分区

        磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的⼀种格式化。

        在 Linux 是柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起始柱⾯和结束柱⾯号码。

        这样做的目的在于,我们管理好一个 500G 的空间,与分区管理好100G 的磁盘空间是一样的,同时这样的难度也大大降低,所以这就是分区!

        100G 的磁盘空间进行管理的还有有点困难,所以我们还需要进行分组,在进一步进行细分。还需要了解的是我们的 LIiux 对于文件的内容与属性是进行分开存放的。

2.3 inode

        前面我们提到了文件的内容与属性是分开的。我们使用 inode 用来表示 一个文件所有的属性。使用 stat 可以查看,在 Linux 是一个结构体。还有一个非常重要的概念就是每一个 inode 为了标识它和他的文件,回一个 inode_num 编号的方式存放在 inode 的这个属性里面。使用 -li 可以显示。

        值得注意的是我们的 inode  并没有包括文件名,这个原因我将会会在后面进行讲解。

三、Ext2 文件系统

 3.1 是什么

        前面我们提到了,使用分区的方式进行管理磁盘,那么分区就是文件系统的载体.只有经过分区,同时在分区的基础上再添加上文件系统,那么我们的文件才可以被真正的使用。

        其早期版本为 ext2,后来⼜发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进行了增强,但是其核心设计并没有发⽣变化,我们仍是以较老的 ext2 作为演示对象。

        我一开也不是特别理解下面的那个图片是什么意思我简单的描述一下:1. 每个 partition 都是一个分区,再下面一层就是分组看,比方说我的分区大小为 300GB,那么分成 10 组,每个就是 30 GB,所以 File System 就是管理的分组。

 3.2 有什么

        接下来的专有名词的描述我将使用我的语言,我的理解进行解释,如果想要了解,完整官方的解释可以自行查找。

  •  Super Block

        超级块:进行存放一整个分区的相关信息,在每一个分组里面都具有这个 super,这是因为为了备份,如果丢失的话就代表着整个文件无法使用。

  • GDT

        块组描述符表:块组块组描述的是分区之后的组里面是有好多的4kb的块形成的这个组,所以叫做块组。描述符表就是表示后面的其他分分组的开始位置以及 inode 使用情况以及数据块的使用情况的表。是用来管理整个分组的一个区域。

  • Block Bitmap

        表示数据区的使用情况的位图,表示那些是已经被使用,那些没有被使用。如果想要删除一个文件的话,直接由 1 - 0 即可。

  • inode Bitmap

        表示 inode 使用的情况。

  • inode Table

        存放文件的属性的地方(这里解释一下为什么使用一个相同的 inode :因为虽然文件的属性具体的内容不相同,但是都具有这些类型,单个 inode 的大小为 128 字节,但是当内存进行加载的时候会加载 4 kb 的内容,所有只要是符合这个范围的都可以加载到磁盘上)

  • Data Blocks

        存放文件的内容的地方。

        还有需要注意的小点为:1. inode 和 数据块跨组编号,不能分区,同时也是唯一的标识不会进行重复。2. 对于不同的 inode 采用 bit 的时候可能很大不用担心无法存放的问题,因为可以%的方法进行存放。

3.3 与实际相关联

  3.3.1 目录与文件名

        前面我们了解到了,我们可以根据 inode 编号找到对应的 inode 结构;再根据 inode 中的数据块指针,最终定位到磁盘上实际存放文件内容的 LBA 地址。前面这句话可能有点难以理解,简单说就是文系统把“物理位置”的复杂性封装起来,你通常只通过 inode 或路径就能访问文件;那么目录是一个什么鬼?我们说的都是文件,目录是个什么东西?以及我们使用的都是文件名,也没有使用 inode 编码呀!

        一说 inode 编号其实就可以联想到是不是目录里面存放的就是 inode 编号。没错:目录就是一个文件,当进入一个目录(工作目录)的时候,就是打开了目录这个文件的相关内容,然后根据文件名 与 inode 的映射关系,打开文件。 Linux 系统下一切皆文件。

  3.3.2 路径解析 与 路径缓存

        /home/djx/code/test/test/test.c 我们的 os 会解析这个路径从/也就是根目录下开始进行解析。知道找到了这个文件的 inode 编号,然后文件系统就回去对应的位置去查找相关的信息。这就就叫做路径的解析。

        明白了这个也就理解了,我们为什么需要路径 + 文件名 才可以打开这个文件了!        

        然而每一次我们的 os 都会从头开始进行寻找吗?不是的, os 会有一个 dentry 结构树,进行路径的缓存,如果是第一次打开在遍历完这个树之后没有找到相应的文件就会加载,但是如果是之前已经打开过的就不需要进行重新加载,直接在这个树结构当中寻找即可!这就是路径的缓存!是一个内存级的概念!

        这个路径缓存在 Linux 内核当中是叫做 dentry 树的一个结构。在这个 dentry 当中还有 hash 与 LRU 淘汰的算法。

 3.3.3 挂载

      一个问题在于我们的分区是相互独立的,不同的分区可能会具有不同的文件系统!那么操作系统是如何知道我的 inode 到底是哪个分区呢?

        这就是磁盘挂载的功能:即我们的文件路径的前缀会跟分区建立映射关系,知道前面的路径是啥,就可以知道到底是挂在到什么区域之中!

        这样的一张图就表示了打开一个文件的全过程:首先是一个进程创建一个 pcb 结构体,然后一个结构 fs 保存 root 与 pwd 的相关的系统信息, file_struct 文件结构体有 file 结构这个里面保存着路径结构体这个路径结构体有 dentry ,看看这个 dentry 有没有加载过这个文件,具体过程看前面缓存功能,根据dentry 就可以是inode 是哪个分区,哪个分组的,知道了 inode 的相关属性,也就是想要打开文件的属性,那么我们就可以将文件拿出来加载到内存中进行使用。

四、软、硬链接

4.1 软链接

  4.1.1 是什么

     就是创建一个快捷方式。

   4.1.2 怎么用

ln -s abc.s abc

        就建立了 abc.s 指向 abc 的软连接,这个连接是一个全新的文件,具有全新的 inode 编号。 

4.2 硬链接

 4.2.1 是什么

        对一个文件的备份。只能对于普通文件进行备份,不能对目录文件做备份,因为防止 os 进行路径加载的时候形成循环。

        . 与 .. 就是硬链接,以及还有硬连接数,只有这个数字变成 0 的时候这个文件才正真的被删除。 

 4.2.2 怎么用

ln abc def

        建立一个与 abc 相同的 def 文件进行了备份。

五、总结

        以上是对于文件系统的回顾。这个文章用于我的学习记录,如果是有其他的错误还请批评指正。如果对你有帮助还请给我点个赞👍👍👍。     


文章转载自:

http://BKuObAOu.kmqwp.cn
http://WuuDXHhR.kmqwp.cn
http://LrSKVGYt.kmqwp.cn
http://kwOiFce4.kmqwp.cn
http://R5QKCcdP.kmqwp.cn
http://MFa70Qcs.kmqwp.cn
http://Ms8qKGJH.kmqwp.cn
http://xntmxCaB.kmqwp.cn
http://BP7YT8ZF.kmqwp.cn
http://kNEQrX9K.kmqwp.cn
http://mQCKVZAz.kmqwp.cn
http://OCDrgGNn.kmqwp.cn
http://F6OxWHiL.kmqwp.cn
http://ALYHbfLg.kmqwp.cn
http://rQZaUIqH.kmqwp.cn
http://9YWiXz8j.kmqwp.cn
http://KlVaFXX2.kmqwp.cn
http://cKi4RfD2.kmqwp.cn
http://95Gcxgpm.kmqwp.cn
http://O0fBb8Ro.kmqwp.cn
http://WJkGwAG5.kmqwp.cn
http://RwYiM2CA.kmqwp.cn
http://AQuDybEN.kmqwp.cn
http://wO86V5ld.kmqwp.cn
http://DnwLMnEz.kmqwp.cn
http://PUiKb74E.kmqwp.cn
http://DcbbsAXJ.kmqwp.cn
http://nUFuNVnF.kmqwp.cn
http://Dzi3GeaO.kmqwp.cn
http://JYlnoXus.kmqwp.cn
http://www.dtcms.com/a/370393.html

相关文章:

  • 【完整源码+数据集+部署教程】农作物病害检测系统源码和数据集:改进yolo11-HSFPN
  • 计算机网络:调制解调器
  • solidity函数篇2
  • 【AI论文】ELV-Halluc:长视频理解中语义聚合幻觉的基准测评
  • v0.29.2 敏感词性能优化之基本类型拆箱、装箱的进一步优化的尝试
  • 提示词工程(Prompt Engineering)的崛起——为什么“会写Prompt”成了新技能?
  • 前端入门——案例一:登录界面设计(html+css+js)
  • MySQL的组复制(MGR)高可用集群搭建
  • 前端开发学习路径
  • JVM调优总结
  • 大模型API设计:如何用OpenAI兼容接口封装自定义模型?
  • 四个关于云属性的四个卫星数据集的介绍
  • WIN10+ubuntu22.04.05双系统装机教程
  • MCAP :机器人数据容器的全面实践指南
  • Pandas基础(安装、导入Pandas、读取数据、查看数据)
  • 【第四章:大模型(LLM)】10.微调方法与实战-(7)项目实战1:Llama3使用LoRA微调中文增强大模型
  • 没有深度学习
  • Redis-主从复制-哨兵模式
  • PPTist,一个完全免费的 AI 生成 PPT 在线网站
  • [水果目标检测5]AppleYOLO:基于深度OC-SORT的改进YOLOv8苹果产量估计方法
  • 跨平台游戏引擎 Axmol-2.8.1 发布
  • Linux系统编程—进程控制
  • 管理与监控(下)
  • 学习:uniapp全栈微信小程序vue3后台(11)
  • EG1160 SOP16 高压大电流 半桥驱动芯片
  • C++ STL系列-02.泛型入门
  • 大型Go项目中搭建CI/CD流水线
  • 【DCU】DCU产品与调试工具hy-smi使用指南:从基础到性能分析
  • 字节跳动OmniHuman-1.5发布:单图+音频秒变超真实视频,AI数字人技术再升级
  • B.50.10.10-微服务与电商应用