磁盘及文件系统管理详解
[参考文献:马哥视频]
目前市场上主流的磁盘是机械式硬盘:u 盘,光盘,软盘,硬盘,磁带
机械式硬盘
[硬盘内部由一个个同心圆组成] 如下图:
硬盘内部所有盘片都固定在一根轴上,所以:所有盘面都是同步运动.如下图
硬盘这里面还有个读写的磁头,用来改变盘面中磁块的磁性变化.从而来存储 0 或 1,其中 0 代表磁块没有磁性,1 代表磁块有磁性.
在硬盘中磁盘都是双面可读写的,每一个盘面都有一个磁头,一个磁盘中就要两个磁头.每个磁头都悬浮在盘面上,距离盘面非常近几乎只有几微米的距离
下图为硬盘的外部结构:
盘面的结构如下图:
在盘面中有很多磁道,每个磁道由内而外且每个磁道的周长都不一样.因此外面的磁道要比里面的磁道能存储更多的数据.为了便于数据管理,在每个磁盘上磁道的空间是划分成一个一个扇区即:Sector.
Sector(扇区):用来存储用户的数据并且包含自己扇区的编号(即自身扇区所处的位置),磁头号等信息.
所以对于一个原本有 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 是启动操作系统的重中之重
电脑开机的简单概述
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 字节的位置用作指针指向另外一块空间,那么会有更大的空间可以继续创建更多的分区信息了.(即在最后一个用来创建扩展分区)
所以 0 硬盘一般来讲都是三个主分区一个扩展分区,或者一个主分区一个扩展分区.
即主 + 扩展 <=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 引用的.因此电脑开机让你选择进哪个系统时,如果你选择 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 号和文件名等信息,即格式为
在目录中每一行用来引用一个文件,而没一行的格式为:
[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 的数据,而每个进程在运行的时候真正使用的数据会被映射到物理内存页宽当中,不联系的,交替映射,如图:
如此而来,每个进程都认为有 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
Mem 对应的是物理内存
Swap 对应的是交换内存
buffers(缓冲):加速数据写入硬盘的,避免慢的设备遭到快设备的冲击(主要存放元数据 metadata)
cached(缓存):加速从硬盘中读取数据(主要存放数据)
buffers 和 cached 这两段空间能不能清空?会不会影响磁盘数据的完整性?
答:能清空,不会影响.这两段空间只是为了加速操作系统的执行过程以及性能,不是真正物理内存所需要的空间.如上图显示的 used:463 是包含了 buffers:96 和 cached:164,所以 -/+ buffers/cache 这一行显示的才是真正使用的空间已经空闲的空间
2,添加交换分区
[root@localhost ~]# fdisk /dev/sdaCommand (m for help): pCommand (m for help): n 选择空间大小 Command (m for help): tSelected 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 在初始时,会自动挂载此文件中定义的每个文件系统.如下图红色框的都是伪文件系统,为了实现特殊功能的
配置文件格式:
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,练习:写一个脚本
从键盘让用户输入几个文件,脚本能够将此几个文件归档压缩成一个文件;
来源: http://www.bubuko.com/infodetail-2471195.html