磁盘开篇:扒开机械硬盘坚硬的外衣!

图片

刚看了一下,上一次我分享完内存篇的时候是2019年12月25号。没想到在我酝酿和打磨磁盘篇的这段时间里,咱们的生活发生了如此大的变化。人类一直以为本身是地球上全部生物的主宰,没想到此次被一个小小的病毒狠狠地咬了一口,并且还在欧美继续猖狂。也许是人类安逸过久了,早已经没有原始社会那种须要战战兢兢过日子的心态,在病毒初见端倪的时候,并无获得足够的重视。甚至中国已经和病毒进行着全国大战役的时候,欧美的同窗们还在开开心心的闲逛,聚会。原本他们有足够多的时间和机会的,结果却演变到了今天这个局面。我想说的一句是,人类在宇宙中可以存在,原本就已是一个极低几率的事件了,宇宙中的各类射线,上千度万度的高温,都是脆弱的人类生命的不可承受之重。人类如今已经把宇宙观测到放大到星系团了暂时也没发现其它文明存在。无论本身多牛逼,始终仍是要保存一颗敬畏天然、敬畏其它物种的心,且行且珍惜。
windows

今天我以磁盘结构做为硬盘的开篇,来分享我这些年在磁盘、文件方面的思考和总结。服务器

1磁盘结构app

为了方便讨论,咱们仍是先从最基本的磁盘物理结构提及吧,对于常见的机械磁盘,分磁盘面、磁道、柱面和扇区。(注意本文只讨论机械磁盘,SSD先放一放再说)。 机械硬盘拆开之后,结构以下:ide

图片

图1 机械硬盘内部工具

咱们再用一个逻辑图看一下spa

图片图2 磁盘逻辑结构图操作系统

可见有如下概念 :code

1. 磁盘面:磁盘是由一叠磁盘面叠加组合构成,每一个磁盘面上都会有一个磁头负责读写。orm

2. 磁道(Track):每一个盘面会围绕圆心划分出多个同心圆圈,每一个圆圈叫作一个磁道。blog

3. 柱面(Cylinders):全部盘片上的同一位置的磁道组成的立体叫作一个柱面。

4. 扇区(Sector):以磁道为单位管理磁盘仍然太大,因此计算机前辈们又把每一个磁道划分出了多个扇区。

因此,磁盘存储的最小组成单位就是扇区。 

单柱面的存储容量 = 每一个扇区的字节数 * 每柱面扇区数 * 磁盘面数 

总体磁盘的容量 = 单柱面容量 * 总的柱面数字。

扇区与扇区之间其实不是紧挨着的,而是在每一个扇区结尾其实还有一个存储纠错码的位置。假设某一个扇区读取时发生了错误,这样在扇区结尾的纠错码就能发现。磁头就会在磁盘下一圈转过来的时候再读取一遍。

2动手实际查看

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这块磁盘:

1. 有255个heads(磁头),也就是说共有255个盘面。

2. 36351个cylinders,也就是说每一个盘面上都有36351个磁道,

3. 63sectors/track说的是每一个磁道上共有63个扇区。

4. 逻辑扇区大小是512 bytes

上面的Units说的是每一个磁道的存储容量大小,8225280 bytes(=255盘面 * 63扇区 * 逻辑扇区大小512字节)。 那么该磁盘的总大小=36351 cylinders * Units(8225280 bytes)=299GB。

3关于fdisk结果中的几个疑问

问题1:每个units的可存储的数据都是同样的,都是8225280字节?

按理说,磁道是一组同心圆,越是外圈的磁道周长会越长,存储的数据应该越多才对。这个问题的答案其实应该按时间来看:

在老式的磁盘里,确实是每一个磁道数据都是同样的。这样越是内圈磁道的存储密度越大。目的就是为了访问方便,经过一个CHS地址:柱面地址(Cylinders)、磁头地址(Heads)、扇区地址(Sectors)直接定位到存储数据所在的扇区。可是这产生的问题就是外圈磁道的数据密度没有充分发挥出来,形成磁盘存储容量很难提高。

现代的磁盘人们改用等密度结构生产硬盘,也就是说,外圈磁道的扇区比内圈磁道多。这种磁盘里扇区是线性编号的,即从0到某个最大值方式排列,并连成一条线。这种寻址模式叫作LBA,全称为Logic Block Address(即扇区的逻辑块地址)。磁盘内部是本身会经过磁盘控制器来完成CHS到LBA的转换,进而定位到具体的物理扇区

问题2:在fdisk命令的结果里,存在的physical Sector size是什么?

现代科技进步了,磁盘底层的最小组成单位并非扇区512字节,physical Sector size 4KB。但这时存在一个问题是扇区大小为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个? 

咱们先来看一张从磁盘上拆下来的磁头的真实照片

图片

图3 机械硬盘磁头

上面的图片里只有几个磁头,若是硬盘里真的装下255个这样的磁头的话,很难想象磁盘得有多厚。并且磁头多了之后硬盘的可靠性就越差,由于多磁头出故障的概率总会比单磁头要高一些。因此fdisk -l里看到的255 heads其实和扇区同样,也是虚拟出来的。 另外cylinders也同样,也是虚拟出来的。

相关文章
相关标签/搜索