今天就从硬盘的磁盘结构说起,分享一下我这些年在这方面的思考。磁盘结构为了讨论方便,我们先从磁盘最基本的物理结构说起。对于常见的机械磁盘,分为盘面、磁道、柱面和扇区。(注意本文只讨论机械盘,先讨论SSD)。机械硬盘拆解后结构如下。我们用逻辑图来看。我们可以看到以下几个概念:磁盘面:一个磁盘是由一堆磁盘面组成的,每个磁盘面都有一个磁头负责读写。磁道:每个盘面以圆心为中心分为多个同心圆,每个圆称为一个磁道。柱面:所有盘片上相同位置的磁道组成的三维结构称为柱面。扇区:以磁道为单位来管理磁盘还是太大了,所以计算机的前辈们把每个磁道分成了多个扇区。因此,磁盘存储的最小单位是扇区。单个柱面的存储容量=每个扇区的字节数\每个柱面的扇区数\磁盘面数。整个磁盘的容量等于单个柱面的容量乘以柱面总数。扇区之间并不相邻,但实际上在每个扇区的末尾都有一个用于存储纠错码的位置。假设在读取某个扇区时发生错误,则可以找到扇区末尾的纠错码。下一次磁盘转动时,磁头将再次读取它。实际看Linux相对于Windows操作系统的优势之一是它对开发非常友好和透明。只要你想,你总能得到你想要的信息。在Linux上,可以使用fdisk命令查看当前系统使用的磁盘的物理信息。首先,我们查看服务器上安装的硬盘数量和大小,这需要借助lsblk命令。#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsdb8:16020T0disk`-sdb18:17020T0part/searchsda8:00278.5G0disk|-sda18:10200M0part/boot`-sda28:20278.3G0部分|-vgroot-lvroot(dm-0)253:0010G0lvm/|-vgroot-lvswap(dm-1)253:108G0lvm[SWAP]|-vgroot-lvvar(dm-2)253:2015G0lvm/var|-vgroot-lvusr(dm-3)253:3010G0lvm/usr`-vgroot-lvopt(dm-4)253:40136.7G0lvm/opt通过上面的命令我们可以看到笔者的服务器上安装了两块硬盘,分别是sda(278.5G)和sdb(20T)。接下来我们使用fdisk命令查看硬盘更详细的信息:#fdisk-l/dev/sdaDisk/dev/sda:299.0GB,298999349248bytes255heads,63sectors/track,36351cylindsUnits=cylindersof16065*512=8225280字节扇区大小(逻辑/物理):512字节/4096字节I/O大小(最小/最佳):4096字节/4096字节磁盘标识符:0x00053169设备引导开始结束块IdSystem/dev/sda1*12683Linuxnotendoncylinderboundary./dev/sda226363522917857288eLinuxLVM可以看到sda磁盘有255个磁头(heads),也就是说一共有255个磁盘面。有36351个柱面,也就是说每个磁盘上有36351个磁道,63sectors/track就是每个磁道上有63个扇区。逻辑扇区大小为512字节。上面的Units是指每个磁道的存储容量,8225280字节(=255个磁盘,63个扇区,逻辑扇区大小512字节)。那么磁盘的总大小=36351个柱面*单元(8225280字节)=299GB。关于fdisk结果的问题1:每个单元可存储的数据是一样的,8225280字节?按理说磁道是一组同心圆,磁道的外周越长,存储的数据就越多。这个问题的答案其实应该从时间上来看:在老式的磁盘中,每个磁道上的数据确实是一样的。这样,内磁道的存储密度就更大了。目的是为了方便访问,通过一个CHS地址:柱面地址(Cylinders)、磁头地址(Heads)、扇区地址(Sectors)来直接定位数据所在的扇区。然而,由此带来的问题是外磁道的数据密度没有得到充分利用,难以增加磁盘的存储容量。现代磁盘采用等密度结构生产,即外磁道的扇区数多于内磁道的扇区数。这个磁盘中的扇区是线性编号的,即从0到某个最大值排列,连成一条线。这种寻址方式称为LBA,全称LogicBlockAddress(即扇区的逻辑块地址)。在磁盘内部,它会通过磁盘控制器完成从CHS到LBA的转换,然后定位到具体的物理扇区。问题2:为什么fdisk命令的结果中有4096字节的物理扇区大小?现在新磁盘的实际扇区不是512字节,实际磁盘的I/O大小和物理扇区大小都是4096字节。但此时有个问题,512字节扇区大小的假设已经贯穿了整个软件链,如BIOS、引导加载程序、操作系统内核、文件系统代码和磁盘实用程序等等。直接切换到4096字节兼容性太麻烦了,所以每个新的磁盘控制器都将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个磁头其实和扇区一样,也是虚拟的。另外,圆柱体也是一样,也是虚拟的。练内功练硬盘特技:1、开盘:剥去机械硬盘的硬外衣!2.磁盘分区也暗示技术水平。3、机械硬盘速度慢,容易坏,如何解决?4.拆解SSD结构5.一个新的空文件占用多少磁盘空间?6.一个只有1字节的文件实际占用多少磁盘空间?7、为什么文件太多时ls命令会卡住?8.理解格式化原理9.读取文件一个字节实际会发生多少磁盘IO?10.文件写入一个字节后什么时候开始写磁盘IO?11、机械硬盘的随机IO比你想象的要慢。12、服务器配置固态硬盘比机械硬盘快多少?我的公众号是“练内功练功”。在这里,我不是简单地介绍技术理论,也不是只介绍实践经验。而是理论联系实际,用实践加深对理论的理解,用理论提高技术实践能力。欢迎关注我的公众号,分享给你的朋友吧~~~
