linux-磁盘结构

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/85544359

磁盘结构

img

知道结构有用么,应该是不知道怎么用吧,那就先好好积累一下呗

磁头

回想一下磁带吧,顺便申明一下,这是磁性的。

或许称作磁针就更容易理解了,就是往盘上烙印磁性的。

然后利用电磁效应进行数据的存储和读取。

磁盘

嗯,这个是废话;上面的盘就是磁盘。

不过一般整体就叫做磁盘,单个盘的话就叫做盘面了。

如你所见,是圆的。结合磁带的认知,加上平时听到的动静,我们可以断定,它是会旋转的。

虽然是废话,但是现在记住,以免后续混乱。

磁道

也叫做磁轨,就是一个盘面上你能看见的同心圆。

这就像是磁带那样了,不过磁带是一条,这个拆分成了多个同心圆。

柱面

也叫磁柱,就是同心圆组成的柱面啦。

先划分一下已有的样式。

首先呢,一个磁盘被我们拆开,一个磁盘被拆成了多个盘面。

它用磁头进行读取和写入。

它是旋转的,所以磁道是同心圆,这个没问题。当然也可以是其他样子,不过那样就费力不讨好了。

那么,问题来了,怎样提高读写速度呢。这个就要靠磁盘的转速来决定了。

我们单位时间内扫过的磁道越长,读取的数据也就越多,效果也就越好。

于是?要么变胖,要么就变高。

如果把盘面变大一些,的确,转速不必太高,磁轨也会增多,效果也很好。

但是,磁头性能行不行我不知道,我只知道一大个扁平的东西怎么携带呢?

而且磁带那么薄就行,多几个盘面问题也就解决了啊。

如果效率优化太难,多线程肯定ok是吧。

所以多个盘面就是这样来的,我虽然扫的速率不高,但是我扫的多啊。

毕竟5+5 < 3+3+3

现在基本都是多盘面的了,单盘的当我没说。

原来的小磁带呢,被我们撕下来,贴在了盘面上,改名叫做磁轨。

读的不够多不够快呢,我们就多分几个盘。

因为磁头都是固定且同步的,所以虽然物理上同心圆更贴近。

但是数据存储还是同柱面的磁轨更亲密,这也是磁柱被拿来说事的原因。

扇区

说扇区之前呢,再来说说磁轨。

说实话,和磁带差不多。

先被撕开贴了同心圆,然后还被上下排列成立磁柱。

所以呢,它还是有间隔的。

每个磁轨之间,并不是无缝的,所以真的是同心圆环,是磁带。

这下说扇区就方便了。

说起扇区,最怕理解的是扇形区域了,也没错,是扇形区域。

不过由于磁轨之间的间隔,分成的是扇环。

而所谓扇区,不是扇环的集合,而是被扇形和磁轨分割的单一扇环。

嗯,知道扇区是扇环的话,我们继续推翻。

这个并不是等分扇。

如果是同弧度的话,更像扇吧,不过,这个不是按角度划分的,而是容量。

一般来说,512字节划分为一个扇区。

所以呢,这里有一个好消息和一个坏消息。

坏消息:就是扇环,强迫症受罪了,多个扇区真的看不成一个扇形,慢慢理解。图画误人啊。

好消息:按照容量的话,外环的磁轨扇区更多,同角速度的话,外面的读写效率更高哦。

所以我告诉你,你的c盘就在外圈,在内环的盘呢,扇区少啊,跨环浪费时间,读写也会慢。

一些信息

格式化

我们一般说磁盘格式化,到底做些什么呢。

这个就不得不说到文件系统了,目前而言呢,我们大致这样认识文件系统就行了

  1. 软件程序
  2. 能够利用硬件磁盘存取数据

我们一般的格式化,或者称作高级格式化,就是刷文件系统的。

FAT32, NTFS,EXT3,EXT4都是文件系统啦,一般说格式化呢,都是高级格式化,也就是格式化文件系统

他们之间的区别,你就当做三大运营商的区别好了,虽然提供的服务有差异,实现方式也有差异。

但是大体的功能还是差不多的,当然也会有各自的特色。

那对应高级格式化,也就是低级格式化了。

低级格式化,一般来说和我们无关。

因为这针对的是磁道和扇区的,一般的磁盘出厂后都会进行低级格式化。

虽然叫做格式化,不过让我们自己划分估计问题会很大,算是标准服务。

MBR

主引导记录,Master Boot Record或者Main Boot Record

它又是干嘛的呢?

相较于BIOS提供的标准输入输出,这个就是负责引导程序的。

所谓操作系统,也算作是软件,不过感觉比较底层一些,毕竟其他软件都是运行在这之上的。

其中重要的莫过于内核了,首先要加载到内存才能准备基础的环境嘛。

而其中存储的运行数据在磁盘上,从磁盘的那些地方加载呢,就得靠引导来告诉计算机。

那么,MBR怎么划分的呢。

位置和大小

首先,明确一点,它被写在了磁盘的零号磁道的零号扇区。

这个地方呢,是我们平时操作都不会涉及的地方,相当于是默认保护着的。

如果修改了的话,那么不仅是系统问题,往哪写,怎么读可能都是问题了。

硬件是好的,但是不会用怎么办,你说是不。

大小的话,没有疑问,扇区多大,512字节啊,妥妥的。

结构

446

俗称BootLoader,软件程序啦,主要的引导工作就是它来运行的。

64

这个分作四组,每组16字节,每个组的作用就是用来标识分区。

Linux上分区这个词好歹还是听过的吧,不理解就理解为分盘,Windows这个大家肯定不陌生。

说道分区呢,结合结构说一下,分区是按照磁柱进行划分的哦。

毕竟同一个环肯定更方便啊,同一个柱面也肯定更方便啊。

那么,问题来了:我就只能有四个分区?

答案是,是的,主分区的确只能有四个,或者说最多只能有四个。

如果你分区不够四个的话,其他的也是空着的,不会让你用的。

如果你要更多分区?那个就不是主分区了,该叫做扩展分区。

把额外的分区信息写在磁盘其他位置上,然后把指针引用存储在其中一个主分区中。

然后这个主分区就称作扩展分区了。

值得一提的是,你的主分区最多四个。

更多分区的话,会有三个主分区,最后一个是扩展分区,指向其他更多分区的区域。

注意了么

  • 主分区最多四个
  • 扩展分区最多一个

2

最后两个字节呢,是魔数,Magic Number

这个主要是用来标记MBR是否有效。好像开关一样。

再说说启动吧,BIOS之后就会查找第一块磁盘,交给MBR,没找到呢,就找第二块,一次类推。

但是,如果第一块就找到了MBR,如果MBR坏了,那么,恭喜你,呵呵呵了。

系统并不会再查找,只要找到并交付了之后,他就隐姓埋名了。

如果你的MBR损坏了,请教大佬吧,目前我也不知道如何拯救。

我只知道,最后两个字节的魔数不对,MBR是好的你也不行。

虽然是开关,但是我们也不懂如何开关

文件结构

inode

这个东西我最初知道的时候是因为ls -i,多打印了一个数字编号,我也只知道删除它就是删除文件了。

不过这个之前,我们先说说逻辑块

逻辑块

硬件上面,我们的最小单元是扇区,每个512字节。

不过,真的太小了,于是呢,逻辑上把几个扇区分作一组,这就是逻辑块。

然后文件都是用块进行衡量大小的,如果用不完,那块中的分区也会只是空着。

你可以新建一个文件,里面仅仅写入四个字符,看看属性。

在这里插入图片描述

四个字节,但是文件占据了4k,大概知道什么意思了吧,每个块用了四个扇区,不过这个说不准。

如果是Linux的话,你可以试试df.

直接df的话,显示的是磁盘分区

在这里插入图片描述

加上目录的话,显示的是目录挂载的分区的信息

在这里插入图片描述
关键的是-i选项,多打印的就是inode信息啦

在这里插入图片描述

这个inode说的是个数,-h更好看一些

在这里插入图片描述

这样你还是可以算算每个块的大小。

说完了逻辑块,我们说说inode

inode

数据结构

它的数据结构呢,就是个映射,熟悉C就叫做HASH,熟悉JAVA就叫做MAP

就是名称和实体的映射,我们用ls -i能够看到的编号,就是这个块的编号,也就是inode了。

通过这个编号就能够去找到实体位置,这个就是它的结构。

必要性

它的必要性呢,我们可以从另一个角度进行理解。

我们现在有一个视频,作为用户的资产属性存入数据库怎么存储呢。

当二进制信息直接存入数据库?嗯,也可以,不过是不是太大了,而且真的不很是方便。

我们会存放到一个目录下面,然后数据库中去存放文件路径。这才是一般方式。

书籍也是,一般不也是一个目录index么,这个和文件更贴近一些。

查看和操作具体内容,那是后话,首先更快的定位才更好不是么。

findlocate的问题,我们如果顺序去扫描块的话,那肯定不快。

如果同locate一样,有一个inode,那样定位就会很快了。

文件结构

文件

前面inode感觉揭示了文件的奥秘,从我想要什么样的文件,转化成立我想要哪些块里面的数据。

哪怕到扇区,不是你想要什么样的文件流,而是哪些扇区其中的数据信息。

把摘要提取出来,做好了标记,之后查找就十分方便了。

所以,对于文件而言,从inode直接进行理解和操作是完全没有问题的。

目录

但是对于目录来说,是怎么进行存储和路由的呢。

我们理解文件是作为一张映射表,现在把这张映射表复杂化,为了更好的理解目录。

首先,文件系统的底层,直接和存储关联的映射表是inode

这张路由表可以直接从inode去访问到磁盘位置。

inode
location

而我们所谓的文件,是从文件名对inode的映射。

filename
inode

首先,第一张映射表是全局的,第二张是单个文件的自我属性。

我们通过文件名找到了文件,然后知道了inode,最后才去读取文件内容。

那么问题来了,目录是什么样的呢。

目录也是文件,但是这个文件比较奇葩,它也是一张映射表,是这样的

filename1
inode1
filename2
inode2
filenamen
inoden

三张表对比一下,你会发现,单个文件到inode的映射是单个映射,毕竟一个文件只能有一个inode

而第一个和第三个才称得上是映射表,里面存在多个映射关系。

那么,就继续映射呗。

Created with Raphaël 2.2.0 路由开始 通过文件名找到inode 通过inode找到实体 实体是映射表? 是目录,继续路由 是文件,操作文件 路由结束 yes no

所以呢,如果你想找/home/godme/file这个文件。

首先找到/,发现是映射表,对应home找到inode

发现还是映射表,对应godme找到inode

这个还是映射表,查找file对应inode,一看,终于是文件了。

区别于全局的映射表,目录的映射属于个体户,记录路由信息,但是只是自我的信息。

和文件没有啥更多区别,都算是个体户信息。

好比你找老王的老婆的女儿的丈夫的岳父,你一个个的找他们叫啥,然后打听他们住哪。

但是公安局不知道这个关系网,但是直接的名字和住址身份证上就是有的。

目录的话,更多的是一种关系的组织,这就和全局的映射表能够很好的区分开来了。

正规一点呢,所谓全局的映射表,书的目录,这块的映射关系叫做元数据MetaData

区别于实体文件内容和目录的关系组织,这个不算做是文件数据,是文件系统自身的组织结构。

相关命令

ls

在这里插入图片描述

文件类型和权限呢就不用说了,关注一下接下来的那个数字到底是什么意思。

先剧透一下,这个就是硬链接的个数,何为硬链接,后续说明,我们打印inode观察一下。
在这里插入图片描述

你会看到,afirt.sh两者的inode编号是一致的,也就是说,这两个实际上是同一个文件。

好比一个实体对象有了两个变量名,但是指向的的确是同一块内存区域。

ls相关的inode就是这点了。

ln

ln是什么呢,Windows的话,快捷方式更容易理解。

相当于请求转发,你访问我,我会指示你访问一个新的链接地址,这就是链接。

软链接

软链接我们更熟悉,也更容易接受,就先说这个。

ln -s sourcefile target

这个就会创建一个软连接,当你访问target这个文件的时候,就会跳转访问sourcefile了。

映射的话,加上源文件,应该是这样的

linkFileName
sourcefileName
inode

也就是说,软连接建立的是一个文件路径到文件路径的一种映射。

现在全部映射小结一下

actor key value description
全局管理 inode fileEntity inode-entity
文件 文件名 inode filename-inode
目录 目录名 目录映射表 该表中存储的是filename-inode映射
软链接 文件名 文件名 filename-filename

软链接呢,也是文件,不过保存的映射关系。

其中的空间大小,就是字符个数了。

在这里插入图片描述

你看到b的大小就是1,如果改名为godme,那大小就是5了,真好记。

但是注意几个地方:

  1. 软链接本身也是文件,而且是新文件[inode明显不一致]
  2. inode的确是顺序递增的哦

硬链接

ln sourceFile target

不加任何参数,就是硬链接了。从图中可以看出来,两者的inode编号是一致的。

也就是说,虽然文件名不一样,但是这两个文件就是同一个。

和编程一样,如果修改了,另一个文件也会感知到哦。

而其中的2,也就是硬链接个数这下有体会了吧,相当于buffer的引用计数。

区别

项目 硬链接 软链接
引用 inode 文件名
文件 旧文件,引用inode 新文件,指向文件名
目录 不能链接目录 可链接目录

引用没问题,就文件而言,关键在于软连接的映射形成新文件这个东西。

从权限上来看,软链接都是777,因为最后会访问到源文件,采用的还是源文件的权限。

而硬链接,本身就是源文件,显示的权限就是它本身的。

硬链接,是实体的引用,而软链接是多一层的路由,这个路由信息,让软链接是一个新的inode,新文件。

目录的话,硬链接就是自身了,万一循环嵌套了不就是出不来了么。

软链接的引用,目录这个没问题。

du

du /home/godme/file

查询文件大小的,没啥说的,自己man一下。

df

这个前面说了,不再复读了。

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/85544359