Linux之磁盘与文件系统管理

磁盘及文件系统管理详解

【参考文献:马哥视频】

原文:http://blog.csdn.net/u013008795/article/details/51150075

目前市场上主流的磁盘是机械式硬盘:u盘,光盘,软盘,硬盘,磁带

机械式硬盘

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

Linux之磁盘与文件系统管理

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

Linux之磁盘与文件系统管理

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

Linux之磁盘与文件系统管理

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

Linux之磁盘与文件系统管理

下图为硬盘的外部结构:

Linux之磁盘与文件系统管理

盘面的结构如下图:

Linux之磁盘与文件系统管理

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

Sector(扇区):用来存储用户的数据并且包含自己扇区的编号(即自身扇区所处的位置)、磁头号等信息。

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

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

Linux之磁盘与文件系统管理

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

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

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

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

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

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

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

Linux之磁盘与文件系统管理

每一个磁盘都有个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是启动操作系统的重中之重

 电脑开机的简单概述

BIOS:所谓BIOS,实际上就是微机的基本输入输出系统(Basic Input-Output System),其内容集成在微机主板上的一个ROM芯片上,主要保存着有关微机系统最重要的基本输入输出程序,系统信息设置、开机上电自检程序和系统启动自举程序等。

CMOS:CMOS(本意是指互补金属氧化物半导体存储嚣,是一种大规模应用于集成电路芯片制造的原料)是微机主板上的一块可读写的RAM芯片,主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。CMOS RAM芯片由系统通过一块后备电池供电,因此无论是在关机状态中,还是遇到系统掉电情况,CMOS信息都不会丢失。

BIOS管理功能

1、BIOS中断服务程序:实现程序软件与电脑硬件之间的衔接

2、BIOS系统设置程序:是完成CMOS参数设置的手段

3、POST加电自检:对内部各个设备进行检查(CPU、内存、主板等)

4、BIOS系统启动自举程序:完成POST自检之后,ROM BIOS就首先按照系统 CMOS设置中保存的启动顺序搜寻软硬盘驱动器及CD-ROM、网络服务器等有效地启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

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

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

       所有在硬盘中无论是446字节的BootLoader坏了还是64字节的分区表中哪一个坏了,操作系统都是无法启动。不仅如此如果硬盘中的64字节的分区表丢失,将硬盘放到其他主机上硬盘里面的文件也是无法读取。所以MBR对于硬盘是相当重要的

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

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

Linux之磁盘与文件系统管理

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

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

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

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

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

Linux之磁盘与文件系统管理

所以,磁盘上的分区也是按照柱面进行的。一般来讲,柱面的编号按照盘面来说,最外面的为第0柱面,依次向里递增。由于磁盘是按照同心旋转的速度来实现数据的读取和存储。那么磁盘的读写速度就取决于盘面旋转的速度和磁头的旋转(跨越磁道)的速度。这就叫做磁盘的读写延迟。

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

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

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

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

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

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

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

Linux之磁盘与文件系统管理

当然,上面讲的比较粗糙。真正的文件系统不止这些。

比如:在上面中系统分了很多很多磁盘块,系统为了知道那些磁盘块已经使用了,那些磁盘块没有使用。就要建立“快位图: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之磁盘与文件系统管理

在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上点击文件看属性时,会告诉你一共有多少个空间占据了多少个空间,一般来讲占据的空间都要比实际空间大。就是这个道理。(如图)

Linux之磁盘与文件系统管理

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

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

普通文件:文件内容

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

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

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

Linux之磁盘与文件系统管理

一般每个位图都是用一个磁盘块来标示,比如一个块是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快组描述符】:这里面保留了当前系统上有多少个块组,每一个块组从第几个块开始到第几个块结束。等等这样的相关信息。

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

Linux之磁盘与文件系统管理

Linux之磁盘与文件系统管理

如上图:假如图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引用的。因此电脑开机让你选择进哪个系统时,如果你选择windows(装在MBR上的)系统,则引用MBR上的BootLoader,如果选择Linux系统,则引用Linux系统所在分区上第一个块BootBlock中的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号和文件名等信息,即格式为

Linux之磁盘与文件系统管理

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

【Inode】:文件的inode号

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

【name_len】文件名称长度

【file_type】文件类型

【name】文件名

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

ext3(journal file system:日志文件系统)

前面讲的是ext2,ext3相比ext2不同之处就是,当你在保存文件突然宕机,文件还没保存成功,开机之后ext2需要全盘搜索来确定损坏的文件并删除,而ext3只需要检索日志即可确定,大大提高了效率。

 

ext3实现的原理

Ext3文件系统会将磁盘分区划分为3种区域: 元数据区, 数据区和日志区域, 其中(journal area)日志区域是Ext3文件系统和Ext2文件系统的最大区别。

日志区域的主要功能是临时缓存正在进行I/O操作的文件的元数据信息, 当该文件正确传输完成后, 该文件系统就会将临时缓存的元数据信息存储至文件系统的元数据区中. 日志区域的最大优点是对于执行I/O操作的文件信息发生故障时, 文件系统不需要遍历整个文件系统的元数据区来查找发生故障的block数据块信息, 只需要查找日志区域中临时缓存的元数据即可, 大大缩短了查询时间。

 

操作系统:是一个虚拟机,将底层硬件所提供的计算能力进行虚拟化为一个接口,让多个进程并行运行。

主要组成

CPU虚拟:将CPU划分一个个时间片(time slice),例如5ms一个计算能力,计算片段,另一个5ms也如此,平均分配到多个进程上去

Memory

I/O设备虚拟:多路复用

 

x86:由Intel推出的一种复杂指令集,用于控制芯片的运行的程序,现在X86已经广泛运用到了家用PC领域。

 

     在x86中,内存中引入了虚拟地址(线性地址)的概念,内存是可编址的存储单元,所以进程在访问内存设备的时候,内存中的每个存储空间(即内存单元)就是一个字节,也就是8位(bit)。内存单元是有地址,CPU去访问内存就是按照地址总线来寻找到某数据地址的内存空间,然后通过数据总线读到这个数据,并在控制指令的控制下取出来。

如果在一个内存上运行多个进程的时候,每一个进程都要自我管理内存空间的话,假设其中一个进程出现一个bug,把其他进程的数据给覆盖了的话怎么办?

因此为了避免这种现象的发生引入了虚拟地址的概念。

原理:

如x86(32bit的CPU),物理内存4G,每个进程都假设自己有4G内存可用。操作系统启动,进程是运行在内核之上的,所以虚拟内存当中虽然是4G,其实要划分最低端的1G给内核用,上面的3G给进程使用,这个是虚拟的并不存在,真正的数据是放在物理内存当中。大部分虚拟地址是分页的即页宽(page frame),在物理内存当中,把自己的存储空间分成一个个页宽,每4k为一个页宽,可以存储4k的数据,而每个进程在运行的时候真正使用的数据会被映射到物理内存页宽当中,不联系的,交替映射,如图:

Linux之磁盘与文件系统管理

如此而来,每个进程都认为有4G内存可用,事实上物理内存一共才2G,当现有进程已经占满物理内存时,新进程在虚拟内存里是还有剩下的内存,当它生成一个页宽时,该映射到物理内存中哪个地址?可以在硬盘上找一块分区或者存储空间将它模拟成物理内存一样,划分成一个个页宽,将最少用,很久没使用的页宽数据挪到硬盘中模拟的页宽中,此时内核已经记录并消除了进程所映射的内存地址指向关系(内核内部有一张表记录去向),这样一来物理内存就腾出了新的空间出来。当挪出去的页宽对应的进程醒来时,内核会新分配一段内存地址给这个醒来的进程用,再将它挪回来即可。这个过程就是换进换出,而硬盘那段空间就叫交换空间。交换空间的存在允许内存过载使用(overcommit)。建议交换空间作为应急使用,在这个换进换出的过程是影响系统性能。

在Linux系统中这段交换空间必须是单独的一个分区,所以叫swap分区。内存中的数据放到磁盘上,有个术语叫page out,取回来叫page in。作为存储空间来讲,CPU的寄存器是最快的,对于访问数据时间1纳秒就完成了;如果是缓存的话,如一级、二级缓存大概是10纳秒;如果是内存的话是10毫秒;如果是磁盘的话就是秒级别的,所以非得用磁盘当交换分区的话,建议把交换分区建到靠外的柱面上。

扩展知识

1B就是1个字节(Byte)。

1B=8 Bit

地址总线:负责寻址,如16根地址总线。一根地址对应(或者指向)一块内存空间,同样一根地址线传输一个bit(位或0,1)。若只有一根地址总线,那么可以索引地址0、地址1的两个内存地址,16根地址则2^16次方等于65536,掌握着65536块内存空间,一块内存空间的大小就是1B,所以你能掌握的内存空间是65536*1B = 65536B = 64KB

注意:

1、数据存储是以Byte(字节)为单位

   数据传输是以bit(位/比特)为单位

2、地址总线是指向内存空间,如:2根线指向内存空间,即以内存空间为单位,2根线能访问的最大内存为2^2=4B(4个字节)

一、交互分区(swap)

1、查看交换分区

[root@localhost ~]# free -m

Linux之磁盘与文件系统管理

Mem对应的是物理内存

Swap对应的是交换内存

buffers(缓冲):加速数据写入硬盘的,避免慢的设备遭到快设备的冲击(主要存放元数据metadata)

cached(缓存):加速从硬盘中读取数据(主要存放数据)

buffers和cached这两段空间能不能清空?会不会影响磁盘数据的完整性?

答:能清空,不会影响。这两段空间只是为了加速操作系统的执行过程以及性能,不是真正物理内存所需要的空间。如上图显示的used:463是包含了buffers:96和cached:164,所以-/+ buffers/cache这一行显示的才是真正使用的空间已经空闲的空间

2、添加交换分区

[root@localhost ~]# fdisk /dev/sda

Command (m for help): p

Command (m for help): n

选择空间大小

Command (m for help): t

Selected partition 1

Hex code (type L to list codes): 82   #如不记得swap编码类型此处输入L

Command (m for help):w       #保存退出

[root@localhost ~]# partprobe  /dev/ sda   #通知内核重新读取

分区创建好了,任何分区创建好了要想使用必须创建文件系统

[root@localhost ~]# mkswap  /dev/sda3   #例如是第一块硬盘第3分区

此时,还需要挂载才能被使用,挂载交换分区比较独特

[root@localhost ~]# swapon /dev/sda3   #挂载启用

[root@localhost ~]# swapoff /dev/sda3   #卸载关闭

注:#启用所有的定义在/etc/fstab文件中的交换设备

[root@localhost ~]# swapon -a

二、回环设备

假设磁盘已经没有剩余的空间创建分区,但是某个分区还有很多空闲空间未使用,又因为swap分区必须是一个独立分区,此时swap分区不够用的情况下如何应急?

1、本地回环设备

像127.0.0.1的设备叫loopback,也就是使用文件或者软件来模拟实现硬件。也可以在本地文件系统上创建一个镜像文件(例如:1G空间)直接当作一个设备来使用。

2、如何创建

cp命令:cp  /root/test.txt  /usr/local/

dd命令:dd  if=/root/test.txt  of=/usr/local/

复制命令cp与dd的原理

磁盘上的数据最终是被文件系统组织成以文件为单位来管理的。

 

cp命令:复制时是以文件为单位。复制文件时先通过文件系统将文件读取到内存中,最后将其放到新的磁盘块上

dd命令:复制时是以数据流为单位。复制文件时,不通过文件系统,直接复制数据流(0101)到新的磁盘块上,可以只复制文件中的一部分

if=数据来源

      of=数据存储目标

#以1024个字节为单位,一共复制2次

      bs=1024(block size一次复制多大单位)

      count=2

      seek=#: 创建数据文件时,跳过的空间大小;

 

备份mbr:

dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1

还原mbr:

dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1

用cat命令制作光盘镜像

cat /dev/cdrom > /root/rhel5.iso

创建一个大小为1G的虚拟镜像文件

dd if=/dev/zero of=/var/swapfile bs=1M count=1024

创建好之后可以直接mkswap /var/swapfile并启用

(swapon /var/swapfile)即可

/dev/zero:泡泡设备,可提供无限的空字符

/dev/null:数据黑洞

3、mount挂载本地回环设备

mount命令可以挂载iso镜像

mount DEVICE MOUNT_POINT

      -o loop: 挂载本地回环设备

例如将镜像文件.iso挂载到/media/目录下

[root@localhost ~]# mount -o
loop /root/
镜像文件.iso /media/

4、/etc/fstab文件

用mount挂载一个新的设备到文件目录下,系统重启之后,挂载的设备都将不存在,原因是未写入文件系统配置文件/etc/fstab中。

OS在初始时,会自动挂载此文件中定义的每个文件系统。如下图红色框的都是伪文件系统,为了实现特殊功能的

Linux之磁盘与文件系统管理

配置文件格式:

Linux之磁盘与文件系统管理

mount -a:挂载/etc/fstab文件中定义的所有文件系统。

只要挂载设备完成的时候,会更新mtab文件

5、fuser命令

fuser: 验正进程正在使用的文件或套接字文件

      -v: 查看某文件(或目录)上正在运行的进程

      -k:

      -m

fuser -km MOUNT_POINT:终止正在访问此挂载点的所有进程

三、压缩、解压缩命令

常见的压缩格式:gz,bz2,xz,zip,Z

压缩算法:算法不同,压缩比也会不同;

1、compress命令

压缩比非常小

用法:compress 文件名    #压缩完后的格式FILENAME.Z

解压:uncompress

2、gzip命令

gzip /PATH/TO/SOMEFILE:压缩完成后会删除原文件

            -d: 相当于gunzip(解压缩)

            -#:#代表1-9,指定压缩比,默认是6;

gunzip:

      gunzip /PATH/TO/SOMEFILE.gz: 解压完成后会删除原文件

zcat /PATH/TO/SOMEFILE.gz: 不解压的情况,查看文本文件的内容

3、bzip2命令

比gzip有着更大压缩比的压缩工具,在大文件情况下优势更明显,使用格式近似。

      bzip2 /PATH/TO/SOMEFILE

            -d:解压缩(相当于bunzip2)

            -#: 1-9,默认是6

            -k: 压缩时保留原文件

      bunzip2 /PATH/TO/SOMEFILE.bz2

      bzcat:不解压的情况,查看文本文件的内容

4、xz命令(压缩比最大)

xz /PATH/TO/SOMEFILE

            -d

            -#: 1-9, 默认是6

            -k: 压缩时保留原文件

      unxz:解压缩

      xzdec:解压缩

      xzcat

5、zip命令(压缩比不大)

zip能压缩目录,既归档又压缩的工具

      zip FILENAME.zip FILE1 FILE2 ...: 压缩后不删除原文件

      unzip FILENAME.zip

能把多个文件压缩成一个文件叫归档(archive)

archive: 归档,归档本身并不意味着压缩

6、tar命令(只归档不压缩)

tar: 归档工具, .tar

      -c: 创建归档文件

      -f FILE.tar: 操作的归档文件

      -x: 展开归档

使用tar归档是默认不会归档文件的扩展属性的,如ACL

      --xattrs: 归档时,保留文件的扩展属性信息

      -t: 不展开归档,直接查看归档了哪些文件

 

      -zcf: 归档并调用gzip压缩

      -zxf: 调用gzip解压缩并展开归档,此处-z选项可省略

     

      -jcf: 归档并调用bzip2压缩

      -jxf:

 

      -Jcf: 归档并调用xz压缩

      -Jxf:

7、cpio: 归档工具

注:1、2、3、4只能压缩文件

8、练习:写一个脚本

从键盘让用户输入几个文件,脚本能够将此几个文件归档压缩成一个文件;

Linux之磁盘与文件系统管理

上一篇:PHP文件大小格式化函数合集


下一篇:js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中