关于linux:扒开机械硬盘坚硬的外壳

8次阅读

共计 2957 个字符,预计需要花费 8 分钟才能阅读完成。

明天我以磁盘构造作为硬盘的开篇,来分享我这些年在这方面的思考。

磁盘构造

为了不便探讨,咱们还是先从最根本的磁盘物理构造说起吧,对于常见的机械磁盘,分磁盘面、磁道、柱面和扇区。(留神本文只探讨机械磁盘,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 也一样,也是虚构进去的。



开发内功修炼之硬盘篇专辑:

  • 1. 磁盘开篇:扒开机械硬盘坚挺的外衣!
  • 2. 磁盘分区也是隐含了技术技巧的
  • 3. 咱们怎么解决机械硬盘既慢又容易坏的问题?
  • 4. 拆解固态硬盘构造
  • 5. 新建一个空文件占用多少磁盘空间?
  • 6. 只有 1 个字节的文件理论占用多少磁盘空间
  • 7. 文件过多时 ls 命令为什么会卡住?
  • 8. 了解格式化原理
  • 9.read 文件一个字节理论会产生多大的磁盘 IO?
  • 10.write 文件一个字节后何时发动写磁盘 IO?
  • 11. 机械硬盘随机 IO 慢的超乎你的设想
  • 12. 搭载固态硬盘的服务器到底比搭机械硬盘快多少?

我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术实践,也不只介绍实践经验。而是把实践与实际联合起来,用实际加深对实践的了解、用实践进步你的技术实际能力。欢送你来关注我的公众号,也请分享给你的好友~~~

正文完
 0