您的当前位置:首页正文

【linux深入剖析】深入理解基础外设--磁盘以及理解文件系统

2024-11-08 来源:个人技术集锦

?你好,我是 RO-BERRY
? 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
?感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油



前言

系统中是不是所有的文件都被打开了呢?如果没有被打开呢?那么没有被打开的文件在哪里保存起来呢?

  • 在宏观上,大部分文件是没有被打开的。没有被打开的文件保存在磁盘,SSD中。

文件被打开后会在内存里,也会像进程一般,OS会有一定的数据结构对其进行管理,那么OS要不要管理一下磁盘上的文件呢?

  • 操作系统OS本身是在内存里的,打开文件也是在内存里的,本质上OS是管理内存即可,但是磁盘是一个很重要的设备,里面存储着我们很多重要的数据以及程序等等,磁盘是一个大的存储设备,那么如何保证我们在磁盘里面准确的找到我们想要的文件并打开呢?OS就会在磁盘里做一个工作–快速定位一个文件

例如:我们日常生活中的菜鸟驿站,你在网上买了几个快递到了菜鸟驿站,每日会菜鸟驿站会到很多个快递,当快递到站了其工作人员会将快递按照快递单号都分门别类的放好,也便于人们去取快递,其核心工作就是为了让用户快速定位快递进行提取,这也就是相当于我们的OS所做的工作。
菜鸟驿站的老板不仅会做这些工作,还需要知道菜鸟驿站今天会到多少快递,已经存储了多少快递,还有预估还能存储多少快递等等信息,为让菜鸟驿站好好的运作下去,要让这些包裹都好好存储起来。

整个菜鸟驿站就是我们的磁盘,菜鸟驿站的包裹就是我们一个个没有被打开的文件,菜鸟驿站的老板就相当于我们OS内的一个文件管理模块–我们称为文件系统

  • 其主要工作是帮我们把磁盘空间好好管理起来,将众多文件分门别类的放好,给用户输出一种统一的服务,快速定位到文件,定位文件的方式就是我们的路径

1.磁盘物理结构

为了好好理解文件系统,我们先来认识一下磁盘

  • 磁盘我们大部分人都不理解,只是清晰其概念,是一个很大的存储设备。
  • 笔记本一般是不装磁盘了,一般都是SSD(固态硬盘),台式电脑可能还会有磁盘。
  • 磁盘一般按照功能划分会分成桌面级磁盘和企业级磁盘,退回到2012年,那个时候的电脑大部分装的都是磁盘,SSD(固态硬盘)在那个时候比较贵。

我们今天谈论的磁盘是企业级磁盘。磁盘在今天是并没有被淘汰,SSD在今天比磁盘依然是要贵的,磁盘存储的数据量比较大,又便宜,性价比比较高

  • 盘片:白色的盘像光盘一样的就是盘片,我们的数据就是存储在上面,我们平时见到的光盘是只读的,只能被写入一次,盘片是可以不限次数被写入的,光盘一般只有一面是光的,也就是只有一面有我们的数据,而盘片两面都是光的,没有正反,或者正反两面都可以存储数据,家用的桌面级磁盘,这个盘片只有一片两面,很薄;企业级磁盘拆开的就是一摞的。
  • 磁头:磁盘上一个像指针的东西,一个尖尖的就是我们的磁头,一面一个磁头,不是一个盘片一个磁头,加点后磁头就会移动到盘面区。
  • 音圈马达:盘片中央的位置就是我们的音圈马达,马达就是充电了就会转,盘片就是被音圈马达带动着旋转,盘片转动的时候,我们的磁头就会来回左右摇摆,磁头的摆动就是在盘片上进行寻址。
  • 伺服系统:在硬盘的背面,有磁盘对应的硬件电路,叫做伺服系统,用来控制我们的磁盘,磁盘内部的二进制指令通过伺服系统进行识别,比如开机关机寻址读写等等,控制盘片和磁头进行寻址。

[总结]

1. 磁盘是有多个盘片和磁头组成的,盘片和磁头是1:1的
2. 磁头和盘片经过旋转移动进行定位寻址
3. 磁盘是机械设备,不允许我们在其开机时进行移动、搬迁等等,出现物理上的损失
4. 盘片和磁头离得比较近,所以要求我们的磁盘要防震,以及内部要是无尘的,磁盘是很需要高精度的技术的,国外走的比较早,所以国外的技术是非常领先的
5. 企业磁盘的数据失去其价值的时候,是不会将磁盘随便扔掉的,但是对于磁盘需要去销毁,有人说可以消磁也有人说可以丢进火里烧毁,当然了这两种办法都是可行的,但是这费人费力消耗太大,所以我们的企业通过和另一些企业通力合作,通过一定的指令技术,将磁盘数据全部写0或者1,来达到消除数据的功效,进行集中报废


2.磁盘的物理存储

  • 磁道/柱面:这里面的扇区是我们磁盘IO的基本单位—不一定是系统和磁盘IO的基本单位,每一个扇区都有唯一的编号
  • 磁头、盘面:盘片的每一个面叫做盘面,每一个盘面都有唯一的编号

如果我们想访问磁盘里的一个扇区:
通过磁头定位:磁道/柱面(cylinder),确认使用哪一个磁头(head),再进行确认哪一个扇区(sector)
这种定位方案叫做CHS定位法
了解了这些,那么文件不就是多个扇区承载的数据吗?

3.磁盘的逻辑存储

我们先来认识一下磁带

磁带存储的数据就在这一条带子上面,它是圈起来通过马达将其一点一点移动的,通过技术读取带子数据,这一整个带子圈起来就相当于盘片里的一面,全部抽出来拉直了不就是一恶搞线性存储结构吗?

在我看来,磁盘也就是一个非常巨大的线性空间,而扇区就是其中一块一块的连续空间,可以理解为磁盘是这一整个线性空间,而磁道和扇区就是这其中一个一个的子空间,也就是说,我们对磁盘的管理也就是对数组的增删查改!我们就可以通过一个磁道有多少个扇区来访问到目标扇区

  1. 操作系统认为,一次和磁盘IO一个扇区单位太小了,访问速度太慢了,OS文件系统认为:IO的基本单位是4KB,如果一个扇区是512B,那么OS会一次访问8个扇区去进行IO。

  2. SCSI采用LBA抽象定址。实际上硬件控制器还是以CHS来定址区块,但无论驱动程序还是任何以低级访问磁盘的应用程序(例如数据库软件)通常都不再需要这个参数。各种要求区块低级访问的系统调用把定义好的LBA传给驱动程序﹔最直接的情况下(逻辑器件与实体设备单一对应)驱动程序只是将LBA再传给硬件控制器。

一个磁盘整体空间是非常大的,我们OS会将其划分成一个一个小块。会对这个空间进行分区操作,分完区又会对其进行分组,将每一个小块进行管理就会将整个空间管理好了

大部分笔记本都只有一块磁盘,我们电脑里的C盘D盘是我们系统对其进行了分区的。


4.文件系统

Linux磁盘文件特性:

文件=内容+属性
内容和属性分开存储
内容是大小不确定,可能很大,也可能很小,这是可变的
属性是固定大小的,属性的类别是一样的,只不过每个类别内容不一样

我们所有的文件的属性对应的结构体存储都叫inode
注: 文件名不属于文件属性!

为了能解释清楚inode我们先简单了解一下文件系统

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

  • i节点表(inode table):存放文件属性 如 文件大小,所有者,最近修改时间等

  • 数据区:存放文件内容

使用指令ls -i就可以看到文件的inode
位于文件最前面的数字编号就是inode编号

系统中,标识一个文件,用的不直接是文件名,而是inode

将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。

为了说明问题,我们将上图简化:

创建一个新文件主要有一下4个操作:

  1. 存储属性

内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。

  1. 存储数据

该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

  1. 记录分配情况

文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

  1. 添加文件名到目录
显示全文