目录
- 前言
- 1.磁盘物理结构
- 2.磁盘的物理存储
- 3.磁盘的逻辑存储
- 4.文件系统
前言
我们所有的文件都是与进程相关的文件–进程打开的文件
系统中是不是所有的文件都被打开了呢?如果没有被打开呢?那么没有被打开的文件在哪里保存起来呢?
- 在宏观上,大部分文件是没有被打开的。没有被打开的文件保存在磁盘,SSD中。
文件被打开后会在内存里,也会像进程一般,OS会有一定的数据结构对其进行管理,那么OS要不要管理一下磁盘上的文件呢?
- 操作系统OS本身是在内存里的,打开文件也是在内存里的,本质上OS是管理内存即可,但是磁盘是一个很重要的设备,里面存储着我们很多重要的数据以及程序等等,磁盘是一个大的存储设备,那么如何保证我们在磁盘里面准确的找到我们想要的文件并打开呢?OS就会在磁盘里做一个工作–快速定位一个文件
例如:我们日常生活中的菜鸟驿站,你在网上买了几个快递到了菜鸟驿站,每日会菜鸟驿站会到很多个快递,当快递到站了其工作人员会将快递按照快递单号都分门别类的放好,也便于人们去取快递,其核心工作就是为了让用户快速定位快递进行提取,这也就是相当于我们的OS所做的工作。
菜鸟驿站的老板不仅会做这些工作,还需要知道菜鸟驿站今天会到多少快递,已经存储了多少快递,还有预估还能存储多少快递等等信息,为让菜鸟驿站好好的运作下去,要让这些包裹都好好存储起来。
整个菜鸟驿站就是我们的磁盘,菜鸟驿站的包裹就是我们一个个没有被打开的文件,菜鸟驿站的老板就相当于我们OS内的一个文件管理模块–我们称为文件系统
- 其主要工作是帮我们把磁盘空间好好管理起来,将众多文件分门别类的放好,给用户输出一种统一的服务,快速定位到文件,定位文件的方式就是我们的路径
1.磁盘物理结构
为了好好理解文件系统,我们先来认识一下磁盘
- 磁盘我们大部分人都不理解,只是清晰其概念,是一个很大的存储设备。
- 笔记本一般是不装磁盘了,一般都是SSD(固态硬盘),台式电脑可能还会有磁盘。
- 磁盘一般按照功能划分会分成桌面级磁盘和企业级磁盘,退回到2012年,那个时候的电脑大部分装的都是磁盘,SSD(固态硬盘)在那个时候比较贵。
我们今天谈论的磁盘是企业级磁盘。磁盘在今天是并没有被淘汰,SSD在今天比磁盘依然是要贵的,磁盘存储的数据量比较大,又便宜,性价比比较高
- 盘片:白色的盘像光盘一样的就是盘片,我们的数据就是存储在上面,我们平时见到的光盘是只读的,只能被写入一次,盘片是可以不限次数被写入的,光盘一般只有一面是光的,也就是只有一面有我们的数据,而盘片两面都是光的,没有正反,或者正反两面都可以存储数据,家用的桌面级磁盘,这个盘片只有一片两面,很薄;企业级磁盘拆开的就是一摞的。
- 磁头:磁盘上一个像指针的东西,一个尖尖的就是我们的磁头,一面一个磁头,不是一个盘片一个磁头,加点后磁头就会移动到盘面区。
- 音圈马达:盘片中央的位置就是我们的音圈马达,马达就是充电了就会转,盘片就是被音圈马达带动着旋转,盘片转动的时候,我们的磁头就会来回左右摇摆,磁头的摆动就是在盘片上进行寻址。
- 伺服系统:在硬盘的背面,有磁盘对应的硬件电路,叫做伺服系统,用来控制我们的磁盘,磁盘内部的二进制指令通过伺服系统进行识别,比如开机关机寻址读写等等,控制盘片和磁头进行寻址。
- 每一个盘片的转动速度取决于钱越多转动速度越快,磁头摆的也就越快,对应的速度也越快。
- 磁头贴在盘片上,好像是挨在一起,但是是没有挨在一起的,如果挨在一起就会刮花盘片,就会丢失数据。
- 在刚开机的时候一定是盘片高速旋转,然后磁头悬浮在盘面之上,帮我们找到数据,这个时候台式机最怕的就是突然断电或者强制关机,磁头失去动力就会落下来,由于惯性盘片会持续旋转,那么就会刮花盘片。这也是磁盘为什么被淘汰的原因之一
- 我们听到过很多说计算机只认识二进制01,这是没问题的,但是电脑上真正存的是01二进制数据吗?早期发明计算机的人发明了一种硬件电路,这个硬件电路可以短暂进行存储数据,存一个高低点位,我们叫做触发器,有一个触发器就存一个高电平,两个触发器就能存两个,一个高电平一个低电平,所以这就是有和无,也就是1和0。计算机里面存的根本就不是0和1这样的二进制数字,这是被人为规定出来的,根据不同的介质0和1也会被赋予不同的含义,有的是以信号的强弱表示0和1,有的是以信号的有无表示0和1,所以主要我们对应的计算机设备能够找出对应两态的就可以用0和1进行表示。
- 磁盘能存数据,我们可以将其想象成由无数个磁铁构成,磁铁是具有南北两极的,在磁盘当中每一块小磁铁可以看做南极为1,北极为0,这样盘片上连续写一二十个字节也就是在改变小磁铁的朝向,我们想改写全1,就是将小磁铁南极朝上即可。
- 一块磁铁扔到家里不管,如果很久不管依然会有磁性,这也就是磁盘为什么能长久存储数据的原因,所以我们将磁盘叫为永久存储设备
[总结]
1. 磁盘是有多个盘片和磁头组成的,盘片和磁头是1:1的
2. 磁头和盘片经过旋转移动进行定位寻址
3. 磁盘是机械设备,不允许我们在其开机时进行移动、搬迁等等,出现物理上的损失
4. 盘片和磁头离得比较近,所以要求我们的磁盘要防震,以及内部要是无尘的,磁盘是很需要高精度的技术的,国外走的比较早,所以国外的技术是非常领先的
5. 企业磁盘的数据失去其价值的时候,是不会将磁盘随便扔掉的,但是对于磁盘需要去销毁,有人说可以消磁也有人说可以丢进火里烧毁,当然了这两种办法都是可行的,但是这费人费力消耗太大,所以我们的企业通过和另一些企业通力合作,通过一定的指令技术,将磁盘数据全部写0或者1,来达到消除数据的功效,进行集中报废
2.磁盘的物理存储
磁盘各个面的展开图如下:
- 磁道/柱面:这里面的扇区是我们磁盘IO的基本单位—不一定是系统和磁盘IO的基本单位,每一个扇区都有唯一的编号
- 磁头、盘面:盘片的每一个面叫做盘面,每一个盘面都有唯一的编号
如果我们想访问磁盘里的一个扇区:
通过磁头定位:磁道/柱面(cylinder),确认使用哪一个磁头(head),再进行确认哪一个扇区(sector)
这种定位方案叫做CHS定位法
了解了这些,那么文件不就是多个扇区承载的数据吗?
3.磁盘的逻辑存储
我们先来认识一下磁带
磁带存储的数据就在这一条带子上面,它是圈起来通过马达将其一点一点移动的,通过技术读取带子数据,这一整个带子圈起来就相当于盘片里的一面,全部抽出来拉直了不就是一恶搞线性存储结构吗?
在我看来,磁盘也就是一个非常巨大的线性空间,而扇区就是其中一块一块的连续空间,可以理解为磁盘是这一整个线性空间,而磁道和扇区就是这其中一个一个的子空间,也就是说,我们对磁盘的管理也就是对数组的增删查改!我们就可以通过一个磁道有多少个扇区来访问到目标扇区
-
磁盘是会自己转化成为线性地址供我们访问的
-
操作系统认为,一次和磁盘IO一个扇区单位太小了,访问速度太慢了,OS文件系统认为:IO的基本单位是4KB,如果一个扇区是512B,那么OS会一次访问8个扇区去进行IO。
-
在OS内部就会重新形成一个8个扇区为一个子数组的线性结构,这样每8个扇区就会对应一个数组下标。这每一块数组的地址就是逻辑区块地址(Logical Block Address, LBA)
-
逻辑区块地址(Logical Block Address, LBA)是描述计算机存储设备上数据所在区块的通用机制,一般用在像硬盘这样的辅助记忆设备。LBA可以意指某个数据区块的地址或是某个地址所指向的数据区块。现今计算机上所谓一个逻辑区块通常是512或1024位组。ISO-9660格式的标准CD则以2048位组为一个逻辑区块大小。
-
LBA是非常单纯的一种定址模式﹔从0开始编号来定位区块,第一区块LBA=0,第二区块LBA=1,依此类推。这种定址模式取代了原先操作系统必须面对存储设备硬件构造的方式。最具代表性的首推CHS(cylinders-heads-sectors,磁柱-磁头-扇区)定址模式,区块必须以硬盘上某个磁柱、磁头、扇区的硬件位置所合成的地址来指定。CHS模式对硬盘以外的设备来说没什么作用(例如磁带或是网络存储设备),所以通常也不会用在这些地方。过去MFM(Modified Frequency Modulation, 改良调频式)和RLL(Run Length Limited)存储设备都曾使用CHS模式,ATA-1设备更将延伸CHS(Extended Cylinders-Heads-Sectors, ECHS)也派上了用场。
-
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个操作:
- 存储属性
内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
- 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
- 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
- 添加文件名到目录
新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。