Published at 2024-11-16 | Last Update 2024-11-16
本文翻译自 2022 年 Branch Education 的一个科普视频 How do Hard Disk Drives Work? (Youtube), 强烈推荐观看原视频(上不了油管的,B 站也有搬运)。本文整理个图文版方便查阅与思考。
其他优质文章:
How does a hard drive work, https://www.explainthatstuff.com/, 2024
除了硬件拆解和介绍工作原理,还对比了 HDD 和 SDD,并且更重要的,介绍了 IBM 发明硬盘的历史。
How a Hard Drive Works, cs.stanford.edu, 2012
斯坦福的一个老师实物教学,开盖展示读写数据时,硬盘的工作过程(然后这个盘就报废了)。
HDD from Inside: Hard Drive Main Parts, https://hddscan.com/
硬件拆解部分比本文更详细,想了解更多硬件细节的,可作为补充。
水平及维护精力所限,译文不免存在错误或过时之处,如有疑问,请查阅原视频。 传播知识,尊重劳动,年满十八周岁,转载请注明出处。
以下是译文。
原视频由 PCBWay 赞助,感谢赞助商。
盘片是存储数据的地方,
Disk/platter
磁盘由铝镁合金(aluminum magnesium alloy)和其他合金的多个涂层组成,
Disk/platter
磁性功能层是 120nm
的钴铬钽合金薄层(cobalt chromium tantalum alloy),
它由磁性微块组成,磁极方向能变,
Disk/platter
7200rpm
的等速度旋转。机械臂装置包括好几个组成部分,分别来看下。
每个盘(platter)上下各有一个臂(arm),
每个臂的末端有一个称为 slider(滑橇、滑块)的模块,它里面又包括了一个读/写头 (注意,读头和写头是分开的两个部件,后面会详细介绍),
磁盘高速旋转产生的气流能使这个滑块(和读写头)浮起来,
稳定运行在离磁盘表面 15nm
(约 100 个原子)的地方,如下面的动图所示,
Fig. 高速旋转的盘片产生的气流使滑橇和读写头飘起来
只有当盘片全速旋转时(有数据读写任务),机械臂才会转到磁盘表面上。 平时盘片不旋转时(没有读写任务),机械臂会停在磁盘边上的一个小塑料装置上。
机械臂的尾部有一个 音圈电机(voice coil motor),或称音圈马达,它由线圈(coil of wire)和上下两个强钕磁铁(strong neodymium magnets)组成,
VCM(Voice Coil Motor)一种特殊形式的直接驱动电机,原理和扬声器类似,固得名。 通电线圈在磁场内就会产生力,力的大小与施加在线圈上的电流成比例,运动轨迹可以是直线也可以是弧线。 具有结构简单、体积小、速度快、响应快等特点。译注。
线圈通电之后会产生一个力,使机械臂在磁盘上移动(可以正向也可以反向),
这种马达的速度和精度:
~30nm
。如下图所示,一条柔性电线(a flexible ribbon of wires)沿着机型臂的侧面布线,
PCB 上面的东西如下图所示,
这里主要介绍三个芯片:
PCB 边缘还有两个硬件接口,
再看一下硬盘的两个防尘装置,
密封和过滤都是非常必要的,因为读写头距离盘片仅 15nm
,
而灰尘颗粒的大小可达 10,000nm
,
如果与 7200rpm 高速旋转磁盘碰撞,可能会造成严重损坏,
Fig. 读写头正常运行时,距离盘片仅 15nm。
了解了粗粒度的硬件构成之后,现在让来深入到盘片的内部,看看它的微观组成。
首先,每个磁盘以同心圆的方式分割为多个磁道(concentric circles of tracks),
Fig. 磁盘分割为大量磁道。
每个磁盘的磁道数量能达到 500,000
个甚至更多。
然后,沿着直径的方向,所有磁道又被分割为多个扇区,
Fig. 磁道进一步分割为扇区。
现在看一下每个扇区内的结构,
Fig. 每个扇区的内部结构。
如上图所示,每个扇区中,依次包含五部分。
记录这个旋转磁盘的确切速度和每个比特位的长度(length of each bit of data)。
帮助读/写头确定当前位于哪个磁道和扇区。
扇区的大小因盘而异,例如老一些的盘是 512 字节或 2KB,新一些的通常是 4KB。
有很多工具可以查看,lsblk
指定显示磁盘名字、物理扇区大小和逻辑扇区大小:
$ lsblk -o NAME,PHY-SeC,LOG-SeC
NAME PHY-SEC LOG-SEC
sda 4096 512 # 这块是 SATA SSD
sdb 512 512 # 这块是 SATA HDD
fdisk -l
,这个命令好记:
$ fdisk -l
Disk /dev/sdb: 2.18 TiB, 2399276105728 bytes, 4686086144 sectors
Disk model: XXX # 硬盘型号
Units: sectors of 1 * 512 = 512 bytes # 当前扇区大小
Sector size (logical/physical): 512 bytes / 512 bytes # 逻辑值 & 物理支持的最大值
I/O size (minimum/optimal): 512 bytes / 512 bytes
iostat
磁盘读写带宽(译注)可以通过 cat /proc/diskstats
查看磁盘的读写情况,其中就包括了每个磁盘已经读写的 sectors 数量:
$ cat /proc/diskstats
# r_sectors w_sectors
8 0 sda 31663 10807 2928442 8471 203024 106672 6765800 ...
这个数量乘以 sector 大小,就是已经读写的字节数,iostat 等工具显示的磁盘读写带宽,就是根据这个来计算(估算)的。
Fig. 每个扇区的内部结构。
用于校验存储在块中的数据。
给了读/写磁头一定的容错能力。
现在让我们进一步看看读/写磁头的内部机制,以及写头(write head)是是如何写数据的。
扇区是由一个个磁场微块组成的, 写头通过改变磁盘微块的磁化方向来实现数据写入,
每个磁盘微块大小约为 90nm x 100nm x 125nm
,
磁化之外,微块内原子的南北极是随机的; 磁化之,微块所有原子的北南极都指向同一方向,
每个微块对应的就是一个 bit 数据,
下面具体看一下如何磁化一个微块(相当于写入 1bit 数据)。
电流施加到 write head 的线圈之后,就会在此处产生一个强磁场,
这个磁场沿着 write head 向下,聚焦到尖端的一个小点,改变它正下方的磁盘微块极性
(中间的缝隙就是前面提到过的读写头 15nm
悬浮高度),
磁化之后的微块变成永磁体,能保持这个状态很多年,也就是数据已经持久化, 以后可以重复用读头感应这个永久磁场,读出存储的数据。
原理跟上面一样,也是逐 bit 来。 如果新写入的 bit 跟已经存储的一样,磁极就不变,否则就改变一下方向。
再来看看如何从磁盘读数据。
前面我们假设了不同南北极的磁块分别表示 0 和 1,
这在概念上非常简单,但实际实现并非如此。
实际的 read head,检测的是相邻两个微块的磁极变化, 这是因为磁极变化的强度比单个微块的磁场强度要大得多,所以这种方式的检测准确率非常高。
所以,如上图所示,
那么,检测这些磁场的读头内部结构是怎样的呢?
如上图所示,
GMR
)的特性,
简单来说,穿过它的磁场强度发生变化时,它的电阻率就会变化。基于 GMR 特性,根据读头的电阻率就能判断下面存储的 0 还是 1,
1
;0
。以上过程有一个问题:如果较长连续区域的磁极都一样,对应的就是一长串的 0
,由于读头的精度,有可能会导致多读或少读几个 0,导致数据错乱。
解决方少:利用每个 sector 的前导区和纠错码区中的信息。
原作者 Branch Education 感谢所有个人赞助者和会员赞助商,让他们制作了如此精良的科普视频。