今天我以磁盘结构作为硬盘的开篇,来分享我这些年在这方面的思考。
磁盘结构
为了方便讨论,我们还是先从最基本的磁盘物理结构说起吧,对于常见的机械磁盘,分磁盘面、磁道、柱面和扇区。(注意本文只讨论机械磁盘,SSD先放一放再说)。
机械硬盘拆开以后,结构如下
我们再用一个逻辑图看一下
可见有以下概念 :
- 磁盘面:磁盘是由一叠磁盘面叠加组合构成,每个磁盘面上都会有一个磁头负责读写。
- 磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈,每个圆圈叫做一个磁道。
- 柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面。
- 扇区(Sector):以磁道为单位管理磁盘仍然太大,所以计算机前辈们又把每个磁道划分出了多个扇区。
所以,磁盘存储的最小组成单位就是扇区。
单柱面的存储容量 = 每个扇区的字节数*每个柱面扇区数*磁盘面数
整体磁盘的容量就等于单柱面容量乘以总的柱面数字。
>扇区与扇区之间其实不是紧挨着的,而是在每个扇区结尾其实还有一个存储纠错码的位置。假设某一个扇区读取时发生了错误,这样在扇区结尾的纠错码就能发现。磁头就会在磁盘下一圈转过来的时候再读取一遍。
动手实际查看
Linux相比较windows操作系统,一个优点就是对开发非常友好和透明。只要你愿意,你总能扒到你想要的信息。Linux上可以通过fdisk命令,来查看当前系统使用的磁盘的这些物理信息。
首先我们查看服务器上安装的硬盘数量以及大小,这需要借助lsblk
这命令。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20T 0 disk
`-sdb1 8:17 0 20T 0 part /search
sda 8:0 0 278.5G 0 disk
|-sda1 8:1 0 200M 0 part /boot
`-sda2 8:2 0 278.3G 0 part
|-vgroot-lvroot (dm-0) 253:0 0 10G 0 lvm /
|-vgroot-lvswap (dm-1) 253:1 0 8G 0 lvm [SWAP]
|-vgroot-lvvar (dm-2) 253:2 0 15G 0 lvm /var
|-vgroot-lvusr (dm-3) 253:3 0 10G 0 lvm /usr
`-vgroot-lvopt (dm-4) 253:4 0 136.7G 0 lvm /opt
通过上面命令我们可以看到,笔者的服务器上装了两块硬盘,分别是sda(278.5G)和sdb(20T)。接下来我们再通过fdisk
这个命令来查看硬盘更详细的信息:
#fdisk -l /dev/sda
Disk /dev/sda: 299.0 GB, 298999349248 bytes
255 heads, 63 sectors/track, 36351 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00053169
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 36352 291785728 8e Linux LVM
可以看出sda这块磁盘:
- 有255个heads(磁头),也就是说共有255个盘面。
- 36351个cylinders,也就是说每个盘面上都有36351个磁道,
- 63sectors/track说的是每个磁道上共有63个扇区。
- 逻辑扇区大小是512 bytes
上面的Units说的是每个磁道的存储容量大小,8225280 bytes(=255盘面 * 63扇区 * 逻辑扇区大小512字节)。 那么该磁盘的总大小=36351 cylinders * Units(8225280 bytes)=299GB。
关于fdisk结果中的几个疑问
- 问题1:每一个units的可存储的数据都是一样的,都是8225280字节?
按理说,磁道是一组同心圆,越是外圈的磁道周长会越长,存储的数据应该越多才对。这个问题的答案其实应该按时间来看:
在老式的磁盘里,确实是每个磁道数据都是一样的。这样越是内圈磁道的存储密度越大。目的就是为了访问方便,通过一个CHS地址:柱面地址(Cylinders)、磁头地址(Heads)、扇区地址(Sectors)直接定位到存储数据所在的扇区。但是这产生的问题就是外圈磁道的数据密度没有充分发挥出来,造成磁盘存储容量很难提升。
现代的磁盘人们改用等密度结构生产硬盘,也就是说,外圈磁道的扇区比内圈磁道多。这种磁盘里扇区是线性编号的,即从0到某个最大值方式排列,并连成一条线。这种寻址模式叫做LBA,全称为Logic Block Address(即扇区的逻辑块地址)。磁盘内部是自己会通过磁盘控制器来完成CHS到LBA的转换,进而定位到具体的物理扇区
- 问题2:为什么在fdisk命令的结果里,存在一个physical Sector size是4096 bytes?
现在新的磁盘真正的扇区也不是512字节,真正磁盘的I/O size和physical Sector size都是4096 bytes。 但这时存在一个问题是扇区大小为512字节的假设已经贯穿于整个软件链,比如BIOS,启动加载器,操作系统内核,文件系统代码,以及磁盘工具,等等。直接切换到4096 byte兼容性问题太大了,所以每个新的磁盘控制器将4096字节的物理扇区对应成了8个512字节的逻辑扇区,兼容各种老软件。
除了fdisk -l
命令外,如下方式也可以查看物理/逻辑扇区大小。
#cat /sys/block/sda/queue/physical_block_size
#cat /sys/block/sda/queue/logical_block_size
- 问题3:磁头真的有255个?
我们先来看一张从磁盘上拆下来的磁头的真实照片
上面的图片里只有几个磁头,如果硬盘里真的装下255个这样的磁头的话,很难想象磁盘得有多厚。而且磁头多了以后硬盘的可靠性就越差,因为多磁头出故障的几率总会比单磁头要高一些。所以fdisk -l
里看到的255 heads其实和扇区一样,也是虚拟出来的。 另外cylinders也一样,也是虚拟出来的。
开发内功修炼之硬盘篇专辑:
我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术理论,也不只介绍实践经验。而是把理论与实践结合起来,用实践加深对理论的理解、用理论提高你的技术实践能力。欢迎你来关注我的公众号,也请分享给你的好友~~~
共同学习,写下你的评论
评论加载中...
作者其他优质文章