linux磁盘(一)

linux磁盘(一)

磁盘组成与分割

磁盘的组成主要有:

圆形的盘片(主要记录资料的部分);
机械手臂,与在机械手臂上的读取头(可读写磁盘上的资料);
主轴马达,可以转动盘片,让机械手臂的读取头在磁盘上读写资料。

从上面我们知道资料储存与读取的重点在于磁盘https://www.yuhelove.com/article/46),而磁盘上的物理组成则为:
扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有512bytes 与4K 两种格式;
将扇区组成一个圆,那就是柱面(Cylinder);
早期的分割主要以柱面为最小分割单位,现在的分割通常使用扇区为最小分割单位(每个扇区都有其号码喔,就好像座位一样);
磁盘分割表主要有两种格式,一种是限制较多的MBR 分割表,一种是较新且限制较少的GPT 分割表。

MBR 分割表中,第一个扇区最重要,里面有:

主要开机区(Master boot record, MBR)
分割表(partition table)
其中MBR 占有446 bytes,而partition table 则占有64 bytes
GPT 分割表除了分割数量扩充较多之外,支援的磁盘容量也可以超过2TB

至于磁盘的名称,基本上,所有实体磁盘的命名都已经被模拟成/dev/sd[ap] 的格式,
第一颗磁盘档名为/dev/sda。而分割槽的文件名名若以第一颗磁盘为例,则为/dev/sda[1-128] 。
除了实体磁盘之外,虚拟机的磁盘通常为/dev/vd[ap] 的格式。若有使用到磁盘阵列的话,那还有/dev/md[0-128] 的磁盘名。使用的是LVM 时,档名则为/dev/VGNAME/LVNAME 等格式。

/dev/sd[ap][1-128]:为实体磁盘的命名;
/dev/vd[ad][1-128]:为虚拟磁盘的命名

如前所述,以前磁盘分割最小单位经常是煮面,但CentOS 7的分割软件,已经将最小单位改成磁区了,所以容量大小的分割可以切的更细~此外,由于新的大容量磁盘大多得要使用GPT分割表才能够使用全部的容量,因此过去那个MBR的传统磁碟分割表限制就不会存在了。

文件系统特性

我们都知道磁盘分割完毕后还需要进行格式化(format),之后操作系统才能够使用这个文件系统。为什么需要进行『格式化』呢?这是因为每种操作系统所设定的文件属性/权限并不相同, 为了存放这些文件所需的资料,因此就需要将分割槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem )』。windows和linux就不一样。

传统的磁盘与文件系统应用中,一个分割槽就是只能够被格式化成为一个文件系统,所以我们可以说一个filesystem就是一个partition。但是由于新技术的利用,例如我们常听到的LVM与磁盘阵列(software raid),这些技术可以将一个分割槽格式化为多个文件系统(例如LVM),也能够将多个分割槽合成一个文件系统(LVM, RAID)!所以说,目前我们在格式化时已经不再说成针对partition来格式化了,通常我们可以称呼一个可被挂载的资料为一个文件系统而不是一个分割槽喔!

那么文件系统是如何运作的呢?这与操作系统的文件内容有关。较新的操作系统的文件内容除了文件实际内容外,通常含有非常多的属性,例如Linux操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的资料分别存放在不同的区块,权限与属性放置到inode中,至于实际内容则放置到data block区块中。另外,还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

每个inode 与block 都有编号,至于这三块的意义可以简略说明如下:

superblock:记录此filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的内容所在的block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个block 。

由于每个inode 与block 都有编号,而每个文件都会占用一个inode ,inode 内则有文件内容放置的block 号码。因此,我们可以知道的是,如果能够找到文件的inode 的话,那么自然就会知道这个文件所放置内容的block 号码, 当然也就能够读出该文件的实际内容了。这是个比较有效率的作法,因为如此一来我们的磁盘就能够在短时间内读取出全部的资料, 读写的效能比较好啰。

我们将inode 与block 区块用图解来说明一下,如下图所示,操作系统先格式化出inode 与block 的区块,假设某一个文件的属性与权限资料是放置到inode 4 号(下图较小方格内),而这个inode 记录了文件内容的实际放置点为2, 7, 13, 15 这四个block 号码,此时我们的操作系统就能够据此来排列磁盘的读取顺序,可以一口气将四个block 内容读出来!那么资料的读取就如同下图中的箭头所指定的模样了。

undefined

这种存取的方法我们称为索引式文件系统(indexed allocation)。
那有没有其他的惯用文件系统可以比较一下啊?有的,那就是我们惯用的随身优盘(快闪记忆体),随身优盘使用的文件系统一般为FAT格式。FAT这种格式的文件系统并没有inode存在,所以FAT没有办法将这个文件的所有block在一开始就读取出来。每个block号码都记录在前一个block当中,他的读取方式有点像底下这样:

undefined

上图中我们假设文件的资料依序写入1->7->4->15号这四个block 号码中, 但这个操作系统没有办法一口气就知道四个block 的号码,他得要一个一个的将block 读出后,才会知道下一个block 在何处。所以速度较慢。

常常会听到所谓的『磁盘重组』吧? 需要磁盘重组的原因就是档案写入的block太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过磁盘重组将同一个文件所属的blocks汇整在一起,这样资料的读取会比较容易啊! 想当然尔,FAT的文件系统需要隔三差五的磁盘重组一下,那么Ext2是否需要磁盘重整呢?

由于Ext2 是索引式档案系统,基本上不太需要常常进行磁盘重组的。但是如果文件系统使用太久, 常常删除/编辑/新增文件时,那么还是可能会造成文件资料太过于离散的问题,此时或许会需要进行重整一下的。但是基本没有在Linux 操作系统上面进行过Ext2/Ext3 文件系统的磁盘重组。

Linux 的EXT2 文件系统(inode)

inode的内容在记录文件的权限与相关属性,至于block区块则是在记录文件的实际内容。而且文件系统一开始就将inode与block规划好了,除非重新格式化(或者利用resize2fs等指令变更文件系统大小),否则inode与block固定后就不再变动。但是如果仔细考虑一下,如果我的文件系统高达数百GB时,那么将所有的inode与block通通放置在一起将是很不智的决定,因为inode与block的数量太庞大,不容易管理。

为此之故,因此Ext2 文件系统在格式化的时候基本上是区分为多个区块群组(block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。感觉上就好像我们在当兵时,一个营里面有分成数个连,每个连有自己的联络系统, 但最终都向营部回报连上的信息一般!这样分成一群群的比较好管理啦!整个来说,Ext2 格式化后有点像底下这样:

undefined

在整体的规划当中,文件系统最前面有一个开机磁区(boot sector),这个开机磁区可以安装开机管理程式,这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程式安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的MBR,这样也才能够制作出多重开机的环境!  

data block (内容区块)

data block是用来放置文件内容的地方,在Ext2文件系统中所支援的block大小有1K, 2K及4K三种而已。在格式化时block的大小就固定了,且每个block都有编号,以方便inode的记录啦。不过要注意的是,由于block大小的差异,会导致该文件系统能够记录的最大容量与最大单一文件容量并不相同(操作系统,记录方法不一样等等)。

除此之外Ext2 文件系统的block 还有什么限制呢?有的!基本限制如下:

原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
每个block 内最多只能够放置一个文件的资料;
承上,如果文件大于block 的大小,则一个文件会占用多个block 数量;
承上,若文件小于block ,则该block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
如上第四点所说,由于每个block 仅能容纳一个文件的资料而已,因此如果你的文件都非常小,但是你的block 在格式化时却选用最大的4K 时,可能会产生一些容量的浪费喔!

inode table (inode 表格)

inode的内容在记录文件的属性以及该文件实际内容是放置在哪几号block内!基本上,inode记录的文件内容至少有底下这些:

该文件的存取模式(read/write/excute)
该文件的拥有者与群组(owner/group)
该文件的容量;
该文件建立或状态改变的时间(ctime)
最近一次的读取时间(atime)
最近修改的时间(mtime)
定义档案特性的旗标(flag),如SetUID...
该文件真正内容的指向(pointer)

inode 的数量与大小也是在格式化时就已经固定了,除此之外inode 还有些什么特色呢?

每个inode 大小均固定为128 bytes (新的ext4 与xfs 可设定到256 bytes)
每个文件都仅会占用一个inode 而已;
因此文件系统能够建立的文件数量与inode 的数量有关;
系统读取文件时需要先找到inode,并分析inode 所记录的权限与使用者是否符合,若符合才能够开始实际读取 block 的内容。

inode 要记录的内容非常多,但偏偏又只有128bytes 而已, 而inode 记录一个block 号码要花掉4byte ,假设我一个文件有400MB 且每个block 为4K 时, 那么至少也要十万笔block 号码的记录呢!inode 哪有这么多可记录的空间?为此我们的系统很聪明的将inode 记录block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。

12个直接:这里直接记录了block的号码。
间接:inode里面记录了block的号码,这个block的这个号码记录了内容的block号码。
双间接和三间接差不多。中间多了几个block号码而已。

Superblock (超级区块)

Superblock 是记录整个文件系统信息的地方, 没有Superblock ,就没有这个文件系统 了。他记录的资讯主要有:

block 与inode 的总量;
未使用与已使用的inode / block 数量;
block 与inode 的大小(block 为1, 2, 4K,inode 为128bytes 或256bytes)
filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁盘(fsck) 的时间等文件系统的相关信息;
一个valid bit 数值,若此文件系统已被挂载,则valid bit 为0 ,若未被挂载,则valid bit 为1

Superblock是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此,如果superblock死掉了,你的文件系统可能就需要花费很多时间去挽救啦!一般来说, superblock的大小为1024bytes

此外,每个block group 都可能含有superblock 喔!但是也说一个文件系统应该仅有一个superblock 而已,那是怎么回事啊?事实上除了第一个block group 内会含有superblock 之外,后续的block group 不一定含有superblock , 而若含有superblock 则该superblock 主要是做为第一个block group 内superblock 的备份咯!

Filesystem Description (文件系统描述说明)

这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock, bitmap, inodemap, data block)分别介于哪一个block号码之间。

block bitmap (区块对照表)

如果你想要新增文件时总会用到block 吧!那你要使用哪个block 来记录呢?当然是选择『空的block 』来记录新文件的信息啰。那你怎么知道哪个block 是空的?这就得要透过block bitmap 的辅助了。从block bitmap 当中可以知道哪些block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处理文件啰。

同样的,如果你删除某些文件时,那么那些文件原本占用的block 号码就得要释放出来, 此时在block bitmap 当中相对应到该block 号码的标志就得要修改成为『未使用中』啰!这就是bitmap 的功能。

inode bitmap (inode 对照表)

这个其实与block bitmap 是类似的功能,只是block bitmap 记录的是使用与未使用的block 号码, 至于inode bitmap 则是记录使用与未使用的inode 号码啰!

dumpe2fs: 查询Ext 家族superblock 信息的指令

dumpe2fs [-bh] 磁盘名称

选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出superblock 的资料,不会列出其他的区段内容!

[root@study ~]# blkid    <==这个指令可以叫出目前系统所有的已加载的磁盘
[root@iZ2zec61wsgboa6h0j9jjfZ ~]# dumpe2fs -h /dev/vda1
返回的信息很多。