NingG +

基础原理系列:磁盘和文件系统

背景

最近在服务器间传送文件,需要监控磁盘IO和网络IO,确定哪一个是瓶颈,并且找出服务器之间高效传输文件的方案。 更细节一些的:例如,提高磁盘的转速、改进磁盘接口,当前环境下,哪个有效?

磁盘

(本文关注的是旋转磁盘,固态硬盘不包含在内。)

开篇有个疑问:要想在服务器间高效地传输文件,首先要弄明白的是:文件在哪?好,文件不是凭空想想的,而是实实在在存储在物理介质上的,当前主要是存储于磁盘中。

几个小常识:

物理结构

true-disk

从上图可以看出,磁盘物理上,包含如下几个部分:

  1. 盘片:通常包含两个盘面,上面覆盖了磁性物质,用于记录数据;
  2. 磁头:每个盘面对应一个磁头,读取盘面上的数据;
  3. 主轴马达:带动盘片转动;
  4. 机械手臂:调整磁头位置;

备注:所有磁头,任何时刻,都在同一磁柱上。

逻辑结构

磁盘有一个指标叫作磁盘容量,它标识了一个磁盘可以存储多少个字节;那好,一个字节过来了,应该存储在哪个地方?(类比,一位新兵到了,应该到部队中哪个地方去?)

为避免混乱,方便管理,需要为磁盘设计一个组织方式。(类比,部队被划分为一个个基本单元:,几个构成一个,几个构成一个……)

disk-layer-structure

磁盘的组织方式如上图所示,简要说明如下:

  1. 磁盘最小的物理单元为扇区(sector),扇区的大小是固定的,通常为 512 bytes;
  2. 同一个盘面上,同一圆圈上的所有扇区组成一个磁道(track),又称磁轨
  3. 所有盘面上,在对应位置的所有磁道组成一个磁柱(cylinder);

将上面的磁盘组织方式对应到实际物理磁盘上,如下图所示:

disk-logic-structure

补充说明:

  1. 2009年底,磁盘制造商逐渐推广扇区大小为 4096 bytes;
  2. 通常,每个磁道扇区个数相同,则,外圈的磁道上,扇区分布稀疏。为提升盘片的利用率,产生了多区记录技术(multiple zone recording):相邻的几个磁柱被分割为一个记录区(recording zone),一个记录区中,每个磁柱的每个磁道拥有相同数量的扇区,扇区数由记录区中最里侧的磁道来决定。

接口

为了读取磁盘中数据,需要一根排线,将磁盘连到电脑上;磁盘连接排线的地方叫接口,接口的传输速度限制了读取磁盘的最大速度。常见的磁盘接口,有IDE、SATA、SCSI。

IDE接口:Integrated Drive Electronics,集成电路设备,具有如下特点:

  1. 排线较宽;
  2. Ultra 133,即理论速度 133MB/s
  3. 每条IDE排线,可接2个IDE接口设备,分为master和slave,需要设置跳针;
  4. 常用于个人电脑;

SATA接口:Serial ATA,具有如下特点:

  1. 插槽比IDE小;
  2. 每条SATA排线,仅能连接一个SATA接口设备;
  3. SATA-1理论速度:150MB/s,SATA-2理论速度:300MB/s,最近的SATA-3理论速度:600MB/s;
  4. 常用于个人电脑;

SCSI接口:Small Computer System Interface,小型计算机系统接口,具有如下特点:

  1. 对应磁盘上,有一个处理器,节省主板上CPU资源;
  2. SCSI-3 Ultra 320的理论速度:320MB/s,Ultra 640的理论速度:640MB/s;
  3. 常用于服务器、工作站;

筛选磁盘注意事项

  1. 接口类型:IDE?SATA?SCSI?主板上插槽是否支持?
  2. 容量:2T?500G?
  3. 转速:7200转/min?5400转/min?
  4. 磁盘缓冲内存大小:磁盘上此机制,加速文件读取速率;

备注:建议每次正常关机,这样磁盘的机械手臂会回到原位。(当前已有技术使得磁盘停止旋转后,机械手臂自动回到原位)

查看磁盘详情

(Linux命令,磁盘容量多少?接口是什么?有几块磁盘?用什么命令来查看,具体步骤)

(能否通过命令,查看磁盘的生产厂家?磁盘型号?目标:到官网查看给出的IO速度标准)

读写磁盘耗时

读写磁盘所需时间,较为专业的称呼是磁盘访问时间,其主要分为:寻道时间、旋转时间、传送时间,具体如下:

  1. 寻道时间(seek time):机械手臂摆动,将磁头定位到目标扇区所在磁道上,其耗时是ms级;
  2. 旋转时间(rotational time):磁头定位到磁道后,需要等待目标扇区的第一个bit旋转到磁头下;
  3. 传送时间(transfer time):磁头从目标扇区第一个bit扫描到最后一个bit所需时间;

备注:旋转磁盘的访问时间是ms级别的。

磁盘IO的基本过程

(DMA,已经制作过visio图片了)

测试磁盘读写速度

(doing…)

磁盘格式化

一块新磁盘放在我面前,怎么往上面写文件呢?要想使用,需要先把磁盘内部的东西整理一下,即进行格式化。具体磁盘格式化包括:

  1. 低级格式化:又称,低阶格式化,
  2. 分区:
  3. 高级格式化:又称,高阶格式化,

逻辑区块Block

逻辑区块(Block),这个概念很重要,需要单独拎出来说一下。

数据总是要存储在磁盘上的,磁盘的最小物理单元为扇区(Sector),通常一个扇区 512 Bytes,磁盘通过磁头读取扇区内的信息,对于一个 10M Bytes的文件,磁头要进行20480次读取(I/O)。

为了克服上述文件读取效率问题,逻辑区块(Block)这一概念就产生了!逻辑区块,是在磁盘格式化为某一种文件系统(File System)时,所指定的最小存储单元。这个最小存储单元,是架构在扇区之上的(因为扇区是磁盘的最小物理存储单元),由多个连续的Sector构成;Block的大小一般为Sector的2的n次方倍。此时,磁头一次读取一个Block,假设格式化时,指定Block为4KB(即由8个512Bytes的Sector组成),那么同样10MB大小的文件,读取时,磁头的读取次数降至2560次,文件的读取效率大大提升了。 通常Block越大,文件读取效率越高。

小结一下,有几点:

  1. 硬盘最小物理存储单元,扇区(Sector),通常 512 Bytes;
  2. 数据最小逻辑存储单元,逻辑区块(Block),由 2 的 n 次方个连续的Sector组成;
  3. 磁头一次读取一个Block;

Block是不是越大越好?不是,因为一个Block最多仅能容纳一个文件;举例来说:假设Block为4KB,而文件只有100B,这个文件仍然要占用1个Block的存储空间。因此,在进行Block大小规划的时候,需要考虑如下两个方面:

磁盘分区

我是一个保守的人,做事的原则是能不改变就不要改变(墨守成规?嗯,是这样),想问一下,磁盘分区出现之前没有磁盘分区,后来为什么会出现磁盘分区(partition)?

你是什么样的人,我管不着,不过上面是个好问题。对磁盘进行分区,主要从两点考虑:

1.数据安全性:将磁盘分区,不同分区之间不会相互影响,举例:分区A损坏了,其内部的文件将无法恢复,但这并不会影响分区B;最常见的情况时,重装系统时,只需要覆盖掉系统分区,不会影响其他分区上的文件。

2.数据读写性能 :分区实质是按照磁柱进行分割的,即,一个分区有一个开始磁柱和一个终止磁柱,分区将数据集中在某些连续的磁柱区间内;举例:一次分区位于磁柱1~100,则当从该分区读取数据文件时,磁盘只会搜索1~100范围内的磁柱,由于数据集中了,有助于数据读取的速度和效率。

上面已经简单说明了磁盘分区的必要性,那具体是如何进行磁盘分区的呢?

一块磁盘分区(partition)的详情,以分区表(partition table)的形式存储在磁盘第一个扇区内。

补充一下:每块磁盘的第一个扇区都是最重要的扇区,其内存储了两个重要信息:

分区表,有几点:

  1. 64B的分区表,共4条分区记录;
  2. 每条分区记录为 16B,对应一个起始磁柱和一个截止磁柱;
  3. 每条分区记录,只能为主分区(Primary)或扩展分区(Extended);
  4. 扩展分区,最多有 1 个;
  5. 扩展分区,可进一步划分为逻辑分区;
  6. 逻辑分区数量有限制,IDE硬盘(编号:5~63,最多59个)、SATA硬盘(编号:5~15,最多11个);
  7. 扩展分区不能被格式化,只有主分区和逻辑分区可以;

disk-partition

思考:一个操作系统下,有多块磁盘,如何分区?每块磁盘最多划分为4个分区?一块磁盘最少划分为一个分区?多块磁盘能否构成一个分区?

初步结论(详细信息参考阅读Linux Partition HOWTO

  1. 磁盘作为系统引导盘时,至少有一个primary partition、至少一个swap partition;
  2. 非系统引导盘,可以有0个或0个以上的primary partition、logical partition、swap partition;
  3. boot partition,最好选为primary partition(技术手段上,不要求一定要primary partition,logical partition也可以)

特别说明:生产服务器上,务必将数据单独分区存放,这样及时系统出问题时,也能保证数据的完整性。

备注:分区表,除了上面提到的MBR,还有一种GPT来解决大硬盘问题:MBR分区表,一个分区最大容量为2T。疑问:如何确定系统是否是GPT分区表?

磁盘格式化

系统开机过程

系统开机/重启时,会经历几个基本过程:

  1. 系统启动:CPU加载BIOS(Basic Input Output System,主板上ROM中固化的程序):设置系统信息、开机后系统自检。特别要说明的是:BIOS运行时,会按照COMS(记录时间、启动设置等信息的芯片)中设置的顺序,来搜索处于活动状态并且可以引导的设备;设备可以是CD/DVD、磁盘上的某个分区、U盘、甚至是网络上的某个设备。通常,Linux是从硬盘上引导的,硬盘上MBR包含了主引导加载程序,当MBR被加载到内存后,BIOS就将控制权转交给MBR;
  2. 第一阶段BootLoader:对于磁盘加载来说,就是磁盘的第一扇区,包含了MBR和分区表;这一阶段目标:从分区表中,查找唯一的活动分区,(是否要求一定是活动分区,由引导程序定),将活动分区的引导记录读取RAM,并执行。
  3. 第二阶段BootLoader:启动内核映像,转交控制权;
  4. 内核:内核映像并不是可执行的内核,而是压缩过的映像,通常为zImage/bzImage;一个进程对映像解压之后,开始启动内核;
  5. Init:用户自己的应用环境;

文件系统

(doing…)

参考资料

  1. 深入理解计算机系统
  2. 鸟哥私房菜(基础篇)第三版
  3. Disk formatting wiki: http://en.wikipedia.org/wiki/Disk_formatting
  4. 南非蚂蚁的逻辑区块的介绍
  5. MBR(wiki)
  6. Linux引导过程内幕
  7. 磁盘格式化
  8. GPT Partition Table
  9. Linux Partition HOWTO

杂谈

维基百科,自由的百科全书,对于我这类的科技工作者,很有用;因为,我查询知识的时候,总希望能够找到知识的源头,说白了,我更希望从知识的源头看起,希望能够自己去品味、理解;而百度百科、国内科技博客,很少说明参考资料来源,唯有维基百科,不仅针对某个知识进行说明,而且提供了详尽的参考资料,这很美妙。如果你也有类似的需求,请用维基百科吧。

Top