您的位置:首页 > 其它

【磁盘及文件系统管理详解】

2016-04-14 11:16 501 查看
磁盘及文件系统管理详解
【原创】版权所有翻者必究。

【参考文献:马哥视频】

目前市场上主流的磁盘是机械式硬盘

u盘,光盘,软盘,硬盘,磁带

机械式硬盘

【硬盘内部由一个个同心圆组成】如下图:



硬盘内部所有盘片都固定在一根“轴”上,所以:所有盘面都是同步运动。如下图



硬盘这里面还有个读写的磁头,用来改变盘面中磁块的磁性变化。从而来存储0或1,

其中0代表磁块没有磁性,1代表磁块有磁性



在硬盘中说以磁盘都是双面可读写的,说以每一个盘面都有一个磁头,一个磁盘中就要两个磁头。每个磁头都悬浮在盘面上,距离盘面非常近几乎只有几微米的距离



图下为硬盘的外部结构:



盘面的结构如图下:



在盘面中有很多磁道,每个磁道由内而外每个磁道的周长都不一样。因此外面的磁道要比里面的磁道能存储更多的数据。为了便于数据管理,在每个磁盘上磁道的空间是划分一个一个的扇区即:Secto

Secto(扇区):用来存储用户的数据并且包含自己扇区的编号已经扇区的位置等信息。

所以对于一个原本有512个字节的扇区可以就只有500个字节可以用来存放数据,还有12个字节是记录扇区自己的信息。这就 为什么我没通常购买的500G的硬盘实际上没有500G的原因。以及购买的16G的u盘也没有16G的原因。

在硬盘运作时,所有盘片的所有盘面都是同时工作的,为了提高存储速度,对于一个文件很有可能在每个盘面,都存储了文件的一部分。并且存储时是按照整个磁道(一个圆)来进行数据存储的



图上鼠标所指的位置,位于不同磁盘相同编号的磁道所组成的一个立体的圆叫做“柱面”(Cylinder)

【柱面(Cylinder)】:不同盘面上相同编号的磁道组成柱面

通常磁盘在使用时都要划分分区,如果不划分分区,就意味着整个磁盘只能存储一个“文件系统”。如果不划分分区,每一个分区都可以是一个独立的文件系统

【分区】:在磁盘中建立起来的逻辑边界

在磁盘刚出厂时,厂商会对磁盘做一次低级格式化:低级格式化就是用来划分磁道的,把整个磁盘按照磁盘的旋转速度,物理属性,等一些信息来划分好磁道,扇区等。但磁盘里面并没有任何分区。

【低级格式化】:用来划分磁道

【分区(Partition)】:把整个磁盘划分成多个不同的逻辑组成结构,每个组成结构里面可以创建不同的“文件系统”。所以分区是用来创建“文件系统”的



每一个磁盘都有个MBR(MasterBoot Record)或者(Main Boot Record)

【MBR】:主引导记录

主引导记录(MBR)在整个磁盘的第0盘面0磁道第0扇区,一共是512个字节,这512个字节不属于任何操作系统即(你在磁盘上安装操作系统后你的系统也无法正常访问这512个字节),MBR是属于磁盘的,是全局的,是独立在操作系统之外的。

在MBR中一共划分为三段:

【第一段:446bytes】:BootLoader,是一段程序即(主引导记录)即使你磁盘上有操作系统,没有这个446个字节的主引导记录也是无法启动操作系统的。

【第二段:64bytes:】在这个里面每16byte可以标示一个分区所有一个磁盘最多可以划分4个主分区

【第三段:2bytes】Magic Number(摸数)主要是标记MBR是否有效

注意:在硬盘中MBR当中的BootLoader是启动操作系统的重中之重

当电脑刚开启时,类存条中的的数据时空的,cpu所读写的数据都来自于内存,所有当电脑刚开机是BIOS中有一段程序代码能完成电脑自身健康状况的检查(即电脑的自检)BIOS中设定了如何检查自身的健康状况。

在开机后,BIOS通电后能将自己的那段代码映射到到内存条最开始处的一段空间中。

电脑开机后cpu就开始试图去加载内存条中最开始的一段程序代码。这段代码刚好是BIOS那么接下来就执行BIOS指令。BIOS指令执行完成后,BIOS发现系统自检没有任何问题了,接下来就更具BIOS中设定的启动次序挨个的去寻找启动设备的MBR(假如第一是光盘,那么就找光盘的MBR如果光盘没有MBR就找第二个设备的MBR,如果有的设备有MBR但MBR已经损坏,那么系统就开始报错。告诉你启动不了。(注意:系统启动时是在第一个启动设备没有的情况下才会去寻找第二个启动设备))如果开始启动硬盘,那么就开始读取硬盘的MBR。BIOS就会将硬盘中的MBR加载到内存条中,先开始运行446个字节的BootLoader这段程序运行完成后然后在运行64个字节的分区表。然后根据分区表去读取对应的操作系统。(因此,如果没有分区表,那么就无法寻找我们的操作系统了)所有BootLoader加载进来后BIOS就退出了,BIOS就将执行的指令交给了BootLoader(即告诉cpu接下来执行BootLoader)。于是cup运行BootLoader后根据我们自己安装的操作系统,他会找到那段特定分区,于是BootLoader就会去对应的分区上寻找对应操作系统的内核,如果找到操作系统的内核,就将内核读取进入内存条中。当内核读取进入内存条并解压缩运行完成以后,BootLoader就将cpu的控制权交给操作系统的内核。接着操作系统的内核就开始启动自身,根据我们的配置能够找到“文件系统”在什么地方,找到操作系统所需要运行的什么程序。终止操作系统启动完成。(即看到桌面)

所有无论是硬盘中无论是446字节的BootLoader坏了还是64字节的分区表中哪一个坏了,我们硬盘中的操作系统都是无法启动。不管如此如果硬盘中的64字节的分区表丢失,将硬盘连接到其他主机上硬盘里面的文件也是无法读取。

所有MBR对于硬盘是相当重要的

虽然64字节存放分区表的位置只能创建4个主分区,但是我们可以拿一个16个字节用来标记。这个标记不是标记分区信息,而是用来存放指针,指向硬盘中一个更大的位置来告诉计算机这个地方还有分区信息,让计算机来读取。所有在哪个更大的空间中就能存储更多的磁盘分区信息。而这个创建为指针的分区叫做:“扩展分区“。所有通过这种方式就能在磁盘中创建更多的分区

例如:假如硬盘有200G,本来就可以存放4个主分区的位置你将第第一个主分区标记为:20G的空间,第二个主分区标记为:30G的空间,第三个主分区标记为40G的空间,第四个也创建主分区标记为50G的空间,那么还有200-30-40-50=80G的空间没有标记出来,那么你这个200G的硬盘就只能使用120G了,剩下的80G就无法访问了,因为你没有做分区标记,你自能创建4个主分区。如果(如下图):你将最后一个16字节的位置用作指针指向另外一块空间,那么在哪个更大的空间中就还可以继续创建更多的分区信息了。(即在最后一个用来创建扩展分区)



说以硬盘一般来讲都是三个主分区一个扩展分区,或者一个主分区一个扩展分区。

即主+扩展<=4,而扩展分区在一个系统上只能有一个(这里指的扩展分区是16个字节去指向一个更大的空间。不是说在哪个更大空间中创建的分区)

注意:磁盘分区是按照“柱面”(柱面(Cylinder):不同盘面上相同编号的磁道组成柱面

)进行的即:按柱面存储。

【按柱面存储】硬盘存储一个文件为了加速文件的存储也是按照柱面来存储。即:存储一个数据会在每个盘面都存储,由于盘片的运转速度,运转方式,运转次序都是一致的而且读写数据的磁头都是固定在一个机械臂上,所以它们都是同步运动的。因此在存储数据的时候,它们每一个盘面上的磁头都在不同盘面上对应的相同位置(如下图)。这就是所谓的“按柱面存储”



所以,磁盘上的分区也是按照柱面进行的。一般来讲,柱面的编号按照盘面来说,最外面的为第0柱面,依次向里递增。由于磁盘是按照同心旋转的速度来实现数据的读取和存储。

那么磁盘的读写速度就取决于盘面旋转的速度和磁头的旋转(跨越磁道)的速度。这就叫做磁盘的读写延迟。

所有衡量一个硬盘的指标就包括它的“平均寻道时间“,那么盘片的转速越快,那么硬盘的性能越好。笔记本的硬盘一般都是5400转每分钟(RPM),台式机硬盘一般都是7200转没分钟。工业基本的硬盘比如:SCSI有10000转每分钟(即10k转),15k的转速。所以硬盘的转速越快,性能越好,但同时磁盘的发热量就越大。

对于5400转/分钟的转速已经相当快了,如果磁盘直接在空气中旋转,一定会烧起来。所以在硬盘内部是真空的,也不能有任何灰层,应为我们知道磁头距离盘面的距离只有几微米,所以一粒灰层在上面绝对相当于一座山。所以要是你拆开了硬盘核心部件然后再合上运行,绝对一股白烟硬盘就没了。当然把里面做成真空主要是避免灰层。

由于磁盘旋转是同轴的,即固定角速度,那么在同一个时间段里,磁头在里面和外面所划过的距离也就不一样。因此磁道越靠外,其读写速度越高。所有我们经常频繁访问到的数据最好放在最外面的磁道。通常我们划分磁盘时C盘都在最外面的磁道上,然后接下来的是D盘….

通常我们硬盘上划分好分区后,就可在分区上存储文件了,那么接下来就要提到“文件系统”

在存储文件过程中,对于磁盘来讲存储的都是0101代码,(即:0代表磁块没有磁性,1代表磁块有磁性)那么怎么区别一个文件的起始点和结束点,就要对磁盘里面数据做一些逻辑的边界。(即从哪个地方起始,哪个地方结束)即:能够有一个寻址定位的方法。

为了快速定位去找到对应的文件,那么就要建立一个编目即:Metadata:

【Metadata】编目:为了检索文件,标识文件的一种数据。

所有创建完分区后为了检索文件,快速的定位文件,就要在这个分区上创建“文件系统“,文件系统简单来说类似于一个软件,本身并不是在磁盘分区上,但是文件系统中的数据是在文件系统所管理的分区上。文件系统能把一个分区成两块,第一块为:源数据存储区,第二块为:数据存储区。而数据存储区又划分为一个个逻辑单元,在源数据中记录文件存放在那些单元中(即文件地址),以及文件编号。(如下图)即每存储一个文件就要在编目中添加一条记录,记录文件的编号和文件的地址。我们此文当中将这条信息称为:条目即(索引结点:inode)。



当然,上面的比如只是很粗糙。真正的文件系统不止这些。

比如:在上面中系统分了很多很多磁盘块,系统为了知道那些磁盘块已经使用了,那些磁盘块没有使用。就要建立“快位图:bitmap“。快位图也是存放在源数据中。简单说,就是在块位图(bitmap)中模拟了一个数据存储区,里面标示了数据存储区所分割的逻辑单元,哪一个已经使用了,哪一个还没有使用,分别用(0101)来标示。那么系统为了寻找整个分区中有那个块位图还没有使用,就可以通过直接扫描块位图来获取,就不必整个分区做一次全盘扫描,这样就大大提高了查询文件的速度。

【块位图bitmap】:即每一个块中标记了一个逻辑单元(即一个bit标记一个逻辑单元)存储位为1表示已经使用,存储位为0表示没有使用。是加速查找空闲磁盘块的一种机制。

其实在源数据存储区中其间已经制定了一段固定区域来存储“编目“。假设文件特别多,当我们新建一个文件时,就要在”编目”中保存对于的位置信息。假设一个编目的空间有10M,那么要知道这个编目中有哪些空间是已经标记了文件,哪些空间还没有标记文件。就为编目也要创建一个位图:那么位图中对应了编目中的每一个条目即”索引结点inode”:

【inode(inodexnode)索引结点】:inode中存放了文件的ID号,对应文件的权限,属主和属组,大小,时间戳等。唯独没有的就是“文件名“。

假如一个文件特别大,在inode一个条目中无法全部都标识该文件所使用的所有逻辑单元(也称磁盘块),那么inode中还可以向创建磁盘分区一样标记一个指针来指向下个inode号,说明该inode号中所标识的逻辑单元(也称磁盘块)也是和他同一个文件。那么这样的inode条目就像扩展分区一样。相当于一个间接目录,在文件系统中有二级间接目录,三级间接目录…….那么在一个条目里面,无论通过直接的或间接引用,最终能引用多少个间接inode决定了单个文件最终有多大。即,一个条目的存储空间中能存放多少条索引结点(inode)号,一个索引结点最多能引用多少个逻辑单元。

在有些分区上所说的最大支持单个文件大小最大为多少多少G就是靠这个来决定的。

向FAT32文件系统最大支持为4G

我们通常所说的目录(即文件夹)也是文件,那么上面inode号中没有存储的文件名都存放在目录(即文件夹)中,文件夹自身也有大小(这里的大小不是文件夹里面存放文件的大小和,而是文件夹名,和文件名所占字节的大小和)。这里要注意的是目录也是个文件,所有目录也需要占据磁盘块即(上面说的逻辑单元)。在目录的磁盘块(逻辑单元)中所存储的信息分为两段,第一段为inode号码即:(inode编目中的一个编目号码(相当于一个文件的索引)),这个inode号码对应的文件名。如下图:



在linux系统中根是自引用的,即cpu可以直接访问到根。那么要寻找\tmp\wenjian.txt个文件,则cpu先找到根即(\)目录(即文件夹)所对应的磁盘块(逻辑单元),然后然后在这个磁盘块中(逻辑单元)找到tmp文件名所对应的inode号码,然后拿着这个号码去编目中寻找inode(索引结点)号码所对应的磁盘块地址(即逻辑单元),这个磁盘块(逻辑单元)中找到wenjian.txt文件名所对应的inode(索引结点)号码,再更具这个inode(索引结点)号码去编目中寻找inode(索引结点)所对应的磁盘块(逻辑单元)(可能有多个磁盘块),然后将这些磁盘块中所记录的二级制0101代码。就是该文件的内容。即wenjian.txt的内容。

注意:在文件系统中每一个文件都对应一个inode(索引结点)。

【创建文件原理】

有了上面的逻辑,假设要在/tem/ftp/目录下创建一个文件叫wenjian.txt。那么程序首先要找到tmp目录的磁盘块,然后在根据ftp所对应的inode号码找到ftp目录的磁盘块,在该磁盘块中添加一条信息,记录系统给该文件在编目中申请的inode编号,和该文件的文件名。在编目中除了记录inode编号外还要记录系统给该文件通过扫描“块位图bitmap“给改文件分配的空闲磁盘块地址。然后再将文件内容写入到该文件inode号码所对应的磁盘块中。

【复制文件原理】

有了上面创建文件的原理,那么复制文件的原理几乎和创建文件的原理一样,这里不再做说明。

【删除文件原理】

删除一个文件,则只需要在该文件所在目录的磁盘块中删除此目录对应的inode号所对应的文件名那条记录删除,然后去编目中删除该文件对应的inode号的记录删除,已经在快位图bitmap中将inode好所对应的磁盘块重新标记为0(即未使用)便可完成删除。所有删除文件是没有真正抹掉该文件所对应的所有磁盘块中的二进制代码的。所在在系统上删除文件一般都很快。

【同一个分区中移动文件原理】

同理,移动文件只需要将文件原有目录中标记的文件信息删除,在新的目录中添加该文件的一条记录。就ok了,所有我们通常在同一个分区中移动文件的速度相当快。

所以为什么会有文件恢复工具,能恢复你之前在磁盘上删除的文件,原因就在这里。向360上面的文件粉碎机,就是在你该文件所对应的数据磁盘块中,写入一大堆随机产生的二级制代码覆盖掉你原有的文件。比方说,向那些磁盘块中全部填0,那么你的文件要想找回来只是比较困难了,并不一定找不回来。至于怎么找回来,本文档不做解释。

事实上,在文件系统中远不止我们上面所说的那么简单,你要想,要是每个文件都建立一个inode号,那么在那么多的inode号中寻找一个文件依然是很麻烦的。真正的文件系统上我们上面所说的那个算一个“块组“(block group)。即:每一个快组都有我们上面所说的功能。那么一个磁盘上会创建多少个这样的”块组”(block group)事实上是不确定的。

【block group块组】

在文件系统中每一个块组(block group)都有一个块位图,一个编目。

在这些块组中怎么管理这些块组的方法和上面说道的单个块组的管理方法一样,一样有这些块组的一个快位图,这个块位图可以叫做“超级块位图”。这就是文件系统。

【格式化】:

格式化分为:

低级格式化:用来划分磁道,一般有厂商完成。

高级格式化:就是我们通常说的格式化,即创建文件系统。

文件系统属于内核的功能

文件系统有

windows常用的文件系统:FAT32,NTFS

光盘文件系统:ISO9660

网络文件系统:CIFS(通用互联网文件系统)

linux常用的文件系统:ext2,ext3,ext4,xfs,reiserfs, jfs(日志文件系统)

liux常用的网络文件系统:nfs

集群文件系统:ocfs2

全局文件系统:gfs2

linux 上FAT32叫做vfat.

我们上面说到的哪个文件系统属于ext系列的文件系统,不过其他文件系统在管理上都大致是这样的思路。大体上都是近似的。

至于文件操作系统是怎么识别不同格式的文件系统的,这里不做解释。

对于文件系统来讲,数据都分为两类:

一类是:源数据:即要存储的文件属性信息(比方说,文件大小之类……)

另一类是:文件的路径,即目录(文件夹)

经过上面讲的文件系统底层逻辑分析大致上在一块硬盘中我们首先要将磁盘分成一个个块即:block,这些块组合起来就叫块组(block group)。

【block块】:磁盘块,是文件系统管理磁盘空间的逻辑结构,和磁盘本身没有关系。每一个块都有一个编号。从0开始编号。

【inode】:index node记录文件属性,权限。等…..

所以磁盘中一个分区在格式化后,大小都会发生变化,其中有一部分空间划分出来,给“源数据”预留的。

由此我们知道,每个磁盘块可能属于一个文件,而一个文件可能对应多个磁盘块。所有inode的个数和磁盘块的个数并不是一一对应的。

【block size】块大小

对文件系统来讲块(block size)大小是确定的,指的是2的n次方个字节。一般来讲只能是1024bit,2048bit,4096bit。

在内存中内存中的空间是用“页框”来存储的。页框的大小通常是4k,即若磁盘是1K的大小则一个页匡就可以存放4个磁盘块。若是4k的则存放一个磁盘块。但是这个页框的大小对于不同cpu来讲32位和64位的大小就不一样。

不管怎么样,我们现在至少知道块(block)是有块大小。我们说过一个磁盘块只能属于一个文件,假如一个磁盘块是1K的,那么你创建该文件后,这个文件默认的最小大小就为1k。如果这文件只占用了一个字节,但这一个磁盘块都必须给它。所以4k的磁盘块和1k的磁盘块浪费的程度就不一样。所以在windows上点击文件看属性时,会告诉你一共有多少个空间占据了多少个空间,一般来讲占据的空间都要比实际空间大。就是这个道理。(如图)



说以一个文件如果是1个字节,第二个文件如果是1个字节,那么两个文件的大小占据的空间就是2K(前提是磁盘块的大小为1k),如果像图上磁盘块的大小为4k那么这两个文件占据的大小就为8k。这就是占据空间和实际文件大小的区别。

所以占据磁盘块的文件一般都是如下两类

普通文件:文件内容

目录文件:存放文件名称和inode的对应关系

【bitmap位图】:加快某种特定数据结构中数据查找速度的一种非常重要的数据结构

因此位图中为了提高文件的查找速度,实际上在数据存储区域还划分了块组即(block group)



一般每个位图都是用一个磁盘块来标示,比如一个块是1k的即1024*8为这个位图所能标示的磁盘位。那么一个位图所能标示的磁盘位最后也可以确定。那么一个块组中包含了多少个块,还要取决于块的大小。哪不管怎么讲,这就决定了在不同的磁盘分区上只要块的空间大小(block size)不一样,那么块组中有多少个块也就不一样了。所有对于当前分区中有多少个块组还得要根据块的空间大小(block size)来确定。由于块组的数量之多,那么在一个分区中也保存了这些块组的信息即:超级块(super block)

【super block】:超级块,保存了整个分区中的全局信息,包括

1、 块组的数目

2、 每个块组中包含多少块

3、 块大小(block size)

4、 空闲磁盘块

5、 已用磁盘块

6、 空闲inode

7、 已用inode

那么如果一个磁盘分区中的超级块坏了,那么这个磁盘中的数据也就意味着无法访问了。为了防止这一事情的发生,超级块(super block)可以有多个备份。

由于块组的数量太多,而超级块也只是一个块,记录不了所有块组的信息,那么在系统中还有一个东西:块组描述符

【GDT快组描述符】:这里面保留了当前系统上有多少个块组,每一个块组从第几个块开始到第几个块结束。等等这样的相关信息。

那么“块组描述符”损坏了,整个分区中的文件也同样无法查看了,同样也要备份。



如上图:假如图1代表一个分区,Block Group0, BlockGroup 1….. BlockGroup n分别代表这个分区中所有的块组(block group)。那么每个块组(block group n)中都有一个图2

在分区中

【Boot Block】:为任何一各分区中编号为0的一个块,这个快是不能被使用的,存放的是“引导块“,假如这个分区上如果安装了操作系统,那么这个操作系统的BootLoader就存放在这个块中。

注意:一个磁盘的MBR是一个扇区(sector),那个扇区不属于任何一个分区,这个扇区里面而且只能是512个字节,而Boot Block则是任何一个分区中的第一个块,一般在多系统互存的时候会用到这第一个块。即你的电脑上要安装双系统时才会用到。如果你只有一个操作系统,这个操作系统的引导信息是安装在硬盘的MBR中的。如果你安装了两个操作系统,那么第二个操作系统的引导信息就安装在这个第一个操作系统自己所在分区的Boot Block中。一般来讲任何操作系统启动都需要boot Block而boot Block 是一段程序得安装在MBR中。如果没安装在MBR中,那么就不能作为开机启动的操作系统。如果MBR已经被一个操作系统占据了,而第二个操作系统的引导信息可以安装在这个第一个操作系统自己所在分区的Boot
Block中。但是一定要记得,放在分区中的Boot Block中是没有意义的,要是MBR损坏了,即使你分区中的Boot Block中有启动程序也是启动不了的。那就意味着分区中的Boot Block是被MBR中的BootLoader引用的。

所有除了第一个块中,其他的块就按照源数据直接被划分为块组了。(并不是按照前面写的划分成什么源数据区和数据区。)

那么在块组中

【super Block】超级块,存放在每个组中第1个块中,为了防止损坏,早期每个块组中的第1个块,都是super Block。后来为了节省空间,只是在第0个块组,第3个,第7个…里面做了备份。只存个3-5份。

默认情况,系统寻找的都是第0个块组中第1个块中的SuperBlock,如果这个块组坏了,就去寻找备份的块组。如果不会,自己可以手动修复,因为有备份。

【GDT】块组描述表,块组描述表中存的是当前这个分区中每个块组的块组名,每一个块组的起始磁盘块,结束块的编号。即块组边界等信息。所有这个信息也是不能被损坏的,也是需要备份多次。根据块组(block Group)的个数不同,GDT所占用的空间大小未必是一个磁盘块。

【BlockBitMap】当前块组的块位图

【inodeBitmap】当前块组的inode位图

【inode Table】当前块组的inode表

【Data Blocks】当前块组的所有块

到这里,文件系统是怎么运作的,以及组成基本就说清楚了。

那么“目录”中是存放文件的inode号和文件名等信息,即格式为



在目录中每一行用来引用一个文件,而没一行的格式为:

【Inode】:文件的inode号

【rec_len】:最近一次的访问时间长度

【name_len】文件名称长度

【file_type】文件类型

【name】文件名

那么如果磁盘中文件太大,一个inode存不下,那么就按照下面直接引用和间接引用来调用。即:直接指针,一级间接指针,二级间接指针。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: