更改boot分区记录三
目前在更改boot分区后,发现sda1 开始柱面为5 不是从1开始的,问了一下提供镜像的研发人员,才知道原因如下:
为了解决其余的产品容量4T 磁盘引入的!磁盘开始位置需要对其
顺便来了解一下相关知识
磁盘构成简介
磁盘的基本知识:
1.盘片(platter)和磁头(heads):
硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。

2.磁道(track)和扇区(sector):
下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)。扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)

3.磁头(heads)和柱面(cylinders):
硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。 如下图:

4.磁盘容量计算:
存储容量 = 磁头数 (heads)× 磁道(柱面)数(cylinders) × 每道扇区数(sectors/track) × 每扇区字节数(Units)
fdisk -l /dev/sda Disk /dev/sda: 8019 MB, 8019099648 bytes 16 heads, 32 sectors/track, 30590 cylinders Units = cylinders of 512 * 512 = 262144 bytes Device Boot Start End Blocks Id System /dev/sda1 5 404 102400 83 Linux /dev/sda2 405 800 101376 83 Linux
大小为:16 (heads) * 32 (sectors/track) * 30590 (cylinders) * 512 (Units)= 8019099648 bytes
2048S由来:
Legacy引导中的MBR(Master Boot Record,主分区引导记录)信息,就存放在磁盘头部最开始的0~512 Bytes中。(MBR 概念在 1983 年的 PC DOS 2.0 中正式引入,并从那时起一直运行在 BIOS系统的个人计算机上 。尽管 MBR 格式的一些内部细节有时记录不充分(这有时会导致兼容性问题),但由于 PC 计算机的高度普及,几十年来它已被广泛接受为行业标准。包括Linux也是沿用该行业标准。参考资料:https://en.linuxportal.info/encyclopedia/m/mbr-master-boot-record)
那么,MBR仅仅只占用磁盘头部0 ~ 512 Bytes。
1s=512 Bytes
2048s =512 Bytes * 2048 = 1048576 Bytes
MBR信息仅占用磁盘头部的0.04%,完全是大材小用,为什么第一分区不是从2s开始,而是从2048s 开始呢?
早期的操作系统对应的分区工具在分区的时候,其第一个分区总是63号扇区开始的,意味着在第一个分区之前总是有63个扇区,除了MBR扇区,其他的扇区都是空闲扇区。
This odd number is an artifact of cylinder-head-sector (CHS) addressing used in INT 13h, the legacy BIOS API used for disk access. On legacy systems and bootloaders that used the INT 13h API, all partitions must begin and end on cylinder boundaries. Even after logical block addressing (LBA) was introduced, fake CHS values (which did not correspond to the actual disk geometry) were used to maintain compatibility with the legacy API. Since CHS addressing originally supported a maximum of 63 sectors per cylinder, the first partition would begin on sector 63. Windows XP (before Service Pack 3) and earlier versions of Windows will not boot if the system volume isn't on a cylinder boundary.
从上面的引用可以看出,在最开始的BIOS中,INT13h的磁盘访问中断服务(早期的磁盘访问都通过该服务)要求磁盘分区必须是按照进行分配的,所以在早期磁盘的分区就必须按照柱面进行分配,即分区的以柱面对齐。
对于早期磁盘来说,一个柱面上的某个盘面正好对应一条磁道,一条磁道上刚好有63个扇区,如果按照柱面分配,由于第一个扇区是MBR,所以那一个磁道上的所有扇区都不能分配给第一个分区,第一个分区必须从第二条磁道开始分配,导致第一个分区前面有一段空闲的扇区,这些扇区不属于任何分区。
后来磁盘引入了LBA寻址,磁盘的物理几何模型已经与CHS不相符了,但是为了保证兼容性,第一个分区之前依然要保留63个扇区,LBA0为MBR扇区,第一个分区从LBA63开始。这就是历史上的BIOS对磁盘分区的影响。
但是,随着磁盘容量越来越大,一些磁盘厂商的开始提供物理扇区为4KiB大小的磁盘,为了提高对磁盘的访问性能,分区就必须按照4KiB大小的物理扇区对齐进行访问,否则就会降低访问性能。
那么,如果仍然按照原来的分区方式,第一个分区从63s开始,由于63不是8的倍数,使得分区没有按照4KiB进行对齐,于是就会造成RMW的性能损失问题。
现代操作系统建议第一个分区从2048s开始,前面正好预留1MiB的空闲空间,2048正好是8的倍数,于是分区4KiB对齐了。
文件系统block对齐
Linux操作系统层次,通过文件系统提供了一个也称为块的读写单元,文件系统数据块的大小一般为1024bytes(1K)或2048bytes(2K)或4096bytes(4K)。文件系统数据块也是逻辑概念,是文件系统层次维护的,而磁盘上的逻辑数据块是由磁盘控制器维护的,文件系统的IO管理器知道如何将它的数据块翻译成磁盘控制器维护的数据块地址LBA。
对于使用文件系统的IO操作来说,比如读写文件,这些IO的基本单元是文件系统上的数据块,一次读写一个文件系统数据块。比如需要读一个或多个块时,文件系统的IO管理器首先计算这些文件系统块对应在哪些磁盘数据块,也就是计算出LBA,然后通知磁盘控制器要读取哪些块的数据,硬盘控制器将这些块翻译成扇区地址,然后从扇区中读取数据,再通过硬盘控制器将这些扇区数据重组写入到内存中去。
文件系统block的出现使得在文件系统层面上读写性能大大提高,也大量减少了碎片。但是它的副作用是可能造成空间浪费。由于文件系统以block为读写单元,即使存储的文件只有1K大小也将占用一个block,剩余的空间完全是浪费的。在某些业务需求下可能大量存储小文件,这会浪费大量的空间。
尽管有缺点,但是其优点足够明显,在当下硬盘容量廉价且追求性能的时代,使用block是一定的。
fdisk -l /dev/sda Disk /dev/sda: 8019 MB, 8019099648 bytes 16 heads, 32 sectors/track, 30590 cylinders Units = cylinders of 512 * 512 = 262144 bytes Device Boot Start End Blocks Id System /dev/sda1 5 404 102400 83 Linux /dev/sda2 405 800 101376 83 Linux
tune2fs -l /dev/sda1 |grep Block Block count: 102400 Block size: 1024 Blocks per group: 8192

浙公网安备 33010602011771号