基础原理系列:磁盘和文件系统
2014-05-20
背景
最近在服务器间传送文件,需要监控磁盘IO和网络IO,确定哪一个是瓶颈,并且找出服务器之间高效传输文件
的方案。
更细节一些的:例如,提高磁盘的转速、改进磁盘接口,当前环境下,哪个有效?
磁盘
(本文关注的是旋转磁盘,固态硬盘不包含在内。)
开篇有个疑问:要想在服务器间高效地传输文件
,首先要弄明白的是:文件在哪?好,文件不是凭空想想的,而是实实在在存储在物理介质上的,当前主要是存储于磁盘中。
几个小常识:
- 硬盘尺寸:台式机3.5英寸,笔记本尺寸2.5英寸;
物理结构
从上图可以看出,磁盘物理上,包含如下几个部分:
- 盘片:通常包含两个
盘面
,上面覆盖了磁性物质,用于记录数据; - 磁头:每个
盘面
对应一个磁头,读取盘面
上的数据; - 主轴马达:带动盘片转动;
- 机械手臂:调整磁头位置;
备注:所有磁头,任何时刻,都在同一磁柱
上。
逻辑结构
磁盘有一个指标叫作磁盘容量
,它标识了一个磁盘可以存储多少个字节;那好,一个字节过来了,应该存储在哪个地方?(类比,一位新兵到了,应该到部队中哪个地方去?)
为避免混乱,方便管理,需要为磁盘设计一个组织方式。(类比,部队被划分为一个个基本单元:班
,几个班
构成一个排
,几个排
构成一个连
……)
磁盘的组织方式如上图所示,简要说明如下:
- 磁盘最小的物理单元为
扇区
(sector),扇区的大小是固定的,通常为 512 bytes; - 同一个
盘面
上,同一圆圈上的所有扇区
组成一个磁道
(track),又称磁轨
; - 所有
盘面
上,在对应位置的所有磁道
组成一个磁柱
(cylinder);
将上面的磁盘组织方式对应到实际物理磁盘上,如下图所示:
补充说明:
- 2009年底,磁盘制造商逐渐推广
扇区
大小为 4096 bytes; - 通常,每个
磁道
上扇区
个数相同,则,外圈的磁道上,扇区分布稀疏。为提升盘片的利用率,产生了多区记录技术
(multiple zone recording):相邻的几个磁柱被分割为一个记录区(recording zone),一个记录区中,每个磁柱的每个磁道拥有相同数量的扇区,扇区数由记录区中最里侧的磁道来决定。
接口
为了读取磁盘中数据,需要一根排线,将磁盘连到电脑上;磁盘连接排线的地方叫接口,接口的传输速度限制了读取磁盘的最大速度。常见的磁盘接口,有IDE、SATA、SCSI。
IDE接口:Integrated Drive Electronics,集成电路设备,具有如下特点:
- 排线较宽;
- Ultra 133,即理论速度 133MB/s
- 每条IDE排线,可接2个IDE接口设备,分为master和slave,需要设置跳针;
- 常用于个人电脑;
SATA接口:Serial ATA,具有如下特点:
- 插槽比IDE小;
- 每条SATA排线,仅能连接一个SATA接口设备;
- SATA-1理论速度:150MB/s,SATA-2理论速度:300MB/s,最近的SATA-3理论速度:600MB/s;
- 常用于个人电脑;
SCSI接口:Small Computer System Interface,小型计算机系统接口,具有如下特点:
- 对应磁盘上,有一个处理器,节省主板上CPU资源;
- SCSI-3 Ultra 320的理论速度:320MB/s,Ultra 640的理论速度:640MB/s;
- 常用于服务器、工作站;
筛选磁盘注意事项
- 接口类型:IDE?SATA?SCSI?主板上插槽是否支持?
- 容量:2T?500G?
- 转速:7200转/min?5400转/min?
- 磁盘缓冲内存大小:磁盘上此机制,加速文件读取速率;
备注:建议每次正常关机,这样磁盘的机械手臂会回到原位。(当前已有技术使得磁盘停止旋转后,机械手臂自动回到原位)
查看磁盘详情
(Linux命令,磁盘容量多少?接口是什么?有几块磁盘?用什么命令来查看,具体步骤)
(能否通过命令,查看磁盘的生产厂家?磁盘型号?目标:到官网查看给出的IO速度标准)
读写磁盘耗时
读写磁盘所需时间,较为专业的称呼是磁盘访问时间
,其主要分为:寻道时间、旋转时间、传送时间,具体如下:
- 寻道时间(
seek time
):机械手臂摆动,将磁头定位到目标扇区所在磁道上,其耗时是ms级; - 旋转时间(
rotational time
):磁头定位到磁道后,需要等待目标扇区的第一个bit旋转到磁头下; - 传送时间(
transfer time
):磁头从目标扇区第一个bit扫描到最后一个bit所需时间;
备注:旋转磁盘的访问时间是ms级别的。
磁盘IO的基本过程
(DMA,已经制作过visio图片了)
测试磁盘读写速度
(doing…)
磁盘格式化
一块新磁盘放在我面前,怎么往上面写文件呢?要想使用,需要先把磁盘内部的东西整理一下,即进行格式化。具体磁盘格式化包括:
- 低级格式化:又称,低阶格式化,
- 分区:
- 高级格式化:又称,高阶格式化,
逻辑区块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越大,文件读取效率越高。
小结一下,有几点:
- 硬盘最小物理存储单元,扇区(Sector),通常 512 Bytes;
- 数据最小逻辑存储单元,逻辑区块(Block),由 2 的 n 次方个连续的Sector组成;
- 磁头一次读取一个Block;
Block是不是越大越好?不是,因为一个Block最多仅能容纳一个文件;举例来说:假设Block为4KB,而文件只有100B,这个文件仍然要占用1个Block的存储空间。因此,在进行Block大小规划的时候,需要考虑如下两个方面:
- 文件的读写效率;
- 文件大小可能造成的磁盘空间浪费;
磁盘分区
我是一个保守的人,做事的原则是能不改变就不要改变(墨守成规?嗯,是这样),想问一下,磁盘分区出现之前没有磁盘分区,后来为什么会出现磁盘分区(partition)?
你是什么样的人,我管不着,不过上面是个好问题。对磁盘进行分区,主要从两点考虑:
1.数据安全性:将磁盘分区,不同分区之间不会相互影响,举例:分区A损坏了,其内部的文件将无法恢复,但这并不会影响分区B;最常见的情况时,重装系统时,只需要覆盖掉系统分区,不会影响其他分区上的文件。
2.数据读写性能 :分区实质是按照磁柱进行分割的,即,一个分区有一个开始磁柱和一个终止磁柱,分区将数据集中在某些连续的磁柱区间内;举例:一次分区位于磁柱1~100,则当从该分区读取数据文件时,磁盘只会搜索1~100范围内的磁柱,由于数据集中了,有助于数据读取的速度和效率。
上面已经简单说明了磁盘分区的必要性,那具体是如何进行磁盘分区的呢?
一块磁盘分区(partition
)的详情,以分区表(partition table
)的形式存储在磁盘第一个扇区内。
补充一下:每块磁盘的第一个扇区都是最重要的扇区,其内存储了两个重要信息:
- MBR(
Master Boot Record
,主启动区):指定当前区块中内容分布(什么意思?不明白),系统启动后会主动读取MBR,446 Bytes; - 分区表(
Partation Table
):磁盘的分区详细信息,64 Bytes;(其后面还有2字节,是MBR的结束标志55AA
)
分区表,有几点:
- 64B的分区表,共4条分区记录;
- 每条分区记录为 16B,对应一个起始磁柱和一个截止磁柱;
- 每条分区记录,只能为主分区(Primary)或扩展分区(Extended);
- 扩展分区,最多有 1 个;
- 扩展分区,可进一步划分为逻辑分区;
- 逻辑分区数量有限制,IDE硬盘(编号:5~63,最多59个)、SATA硬盘(编号:5~15,最多11个);
- 扩展分区不能被格式化,只有主分区和逻辑分区可以;
思考:一个操作系统下,有多块磁盘,如何分区?每块磁盘最多划分为4个分区?一块磁盘最少划分为一个分区?多块磁盘能否构成一个分区?
初步结论(详细信息参考阅读Linux Partition HOWTO):
- 磁盘作为系统引导盘时,至少有一个primary partition、至少一个swap partition;
- 非系统引导盘,可以有0个或0个以上的primary partition、logical partition、swap partition;
- boot partition,最好选为primary partition(技术手段上,不要求一定要primary partition,logical partition也可以)
特别说明:生产服务器上,务必将数据单独分区存放,这样及时系统出问题时,也能保证数据的完整性。
备注:分区表,除了上面提到的MBR,还有一种GPT来解决大硬盘问题:MBR分区表,一个分区最大容量为2T。疑问:如何确定系统是否是GPT分区表?
磁盘格式化
系统开机过程
系统开机/重启时,会经历几个基本过程:
- 系统启动:CPU加载BIOS(Basic Input Output System,主板上ROM中固化的程序):设置系统信息、开机后系统自检。特别要说明的是:BIOS运行时,会按照COMS(记录时间、启动设置等信息的芯片)中设置的顺序,来搜索处于活动状态并且可以引导的设备;设备可以是CD/DVD、磁盘上的某个分区、U盘、甚至是网络上的某个设备。通常,Linux是从硬盘上引导的,硬盘上MBR包含了主引导加载程序,当MBR被加载到内存后,BIOS就将控制权转交给MBR;
- 第一阶段BootLoader:对于磁盘加载来说,就是磁盘的第一扇区,包含了MBR和分区表;这一阶段目标:从分区表中,查找唯一的活动分区,(是否要求一定是活动分区,由引导程序定),将活动分区的引导记录读取RAM,并执行。
- 第二阶段BootLoader:启动内核映像,转交控制权;
- 内核:内核映像并不是可执行的内核,而是压缩过的映像,通常为zImage/bzImage;一个进程对映像解压之后,开始启动内核;
- Init:用户自己的应用环境;
文件系统
(doing…)
参考资料
- 深入理解计算机系统
- 鸟哥私房菜(基础篇)第三版
- Disk formatting wiki: http://en.wikipedia.org/wiki/Disk_formatting
- 南非蚂蚁的逻辑区块的介绍
- MBR(wiki)
- Linux引导过程内幕
- 磁盘格式化
- GPT Partition Table
- Linux Partition HOWTO
杂谈
维基百科,自由的百科全书,对于我这类的科技工作者,很有用;因为,我查询知识的时候,总希望能够找到知识的源头,说白了,我更希望从知识的源头看起,希望能够自己去品味、理解;而百度百科、国内科技博客,很少说明参考资料来源,唯有维基百科,不仅针对某个知识进行说明,而且提供了详尽的参考资料,这很美妙。如果你也有类似的需求,请用维基百科吧。
原文地址:https://ningg.top/computer-basic-theory-fs-and-disk/