Last Updated: 2023-06-08 09:59:50 Thursday
-- TOC --
这个话题,涉及到早期硬盘的LBA=63
地址,以及后来的硬盘4K对齐
。
在过去,硬盘的第1个分区总是从LBA=63的位置开始(不知道为什么,也许就是为了留出一点空间出来),MBR在0号扇区(sector 0)。那个时候,硬盘内部的每个sector的size=512字节,这是可接受的。因为这块空间并不是很大!Grub也能够利用这个space gap来存放stage1.5的代码。(参考:Grub启动的3个阶段)
后来的新硬盘,包括SSD,其内部sector=4096byte,即4KB。SSD这类硬盘没有扇区概念,它们内部使用page。外部程序访问硬盘的时候,只是模拟出512字节的sector。有些SSD内部甚至是8KB的sector。在这种情况下,如果还是从LBA=63的位置开始划分第1个分区,就会出现没有4K对齐的问题。如下图:
sector or page,是硬盘内部读写的最小单位,当一个4K的文件系统边缘没有跟硬盘4K对齐的话,就会出现:
这就是文件系统与硬盘没有4K对齐的后果,性能下降!
为了避免这样的情况发生,业界统一将硬盘的第1块分区前,留出1M的空间,2048个512字节的sector,256个4K的page。这样,边缘就对齐了,性能就OK了!
这就是第1个分区前有1M的空间的原因,这就是fdisk查看分区,起始sector总是显示2048的原因!
这个参数在分区的时候,是可配置的。我的移动Fedora就不是:
Disk /dev/sdb: 335.35 GiB, 360080695296 bytes, 703282608 sectors
Disk model: SL500 360GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: B11F9587-9643-4155-B0B4-9815BABC9029
Device Start End Sectors Size Type
/dev/sdb1 65535 1245164 1179630 576M EFI System
/dev/sdb2 1245165 3407819 2162655 1G Linux filesystem
/dev/sdb3 3407820 703190549 699782730 333.7G Linux filesystem
这是GPT分区,开始扇区的LBA=65535,即32MB。
在硬盘最前面的这部分空间,也被称为Hidden Sectors!
1、什么是4K对齐?
早期的硬盘,一个扇区的大小是512个字节,后来随着磁盘容量的不断增加和读写效率不断提升,国际硬盘协会制定了全新标准,将每个扇区的大小调整为4096个字节,也就是4KB,这种扇区又叫4K扇区。4K对齐指的就是对磁盘分区时,让分区的起始扇区位于某一个4K扇区的起始位置。
2、为什么会有4K不对齐?
当硬盘扇区变成4K扇区之后,为了兼容以前的512扇区,为了方便技术人员的习惯思维,为了保证靠512扇区识别的旧操作系统和应用软件不会出错,厂商把一个4K扇区虚拟成8个512扇区,以便和以前的单位统一。这样一来,从这8个扇区中的第一个扇区开始的分区,就是4K对齐了的,从其他7个扇区开始的分区,就是4K没有对齐的。
3、什么是簇(cù)和簇大小?
Windows系统为了提高数据读写速度,对分区空间按簇(簇来自英文单词集群cluster
)划分。对于大于2GB的NTFS格式的分区来说,Windows默认的簇大小是4096字节,也就是以4KB作为一个单位,所有的文件都是对簇的独占。比如说一个10KB的文件,放在簇大小为4K的分区里,就会占掉3个簇,所以实际占用空间为12KB,如果一个文件夹里有100个10KB的文件,他们的实际大小是1000KB,但是占用空间却是1200KB。但是如果把这些文件放到簇大小为8K的分区里,每个10KB的文件就会占用2个簇,也就是16KB,100个文件实际大小仍是1000KB,但占用空间却是1600KB。
这就是4K文件系统!
簇也称为cluster。一个簇由相邻的多个扇区组成。文件在磁盘中存储是以簇为单位,比如文件系统可以把4K字节作为一个簇,所以文件在这样的文件系统中最小的占用空间就是4K。文件在硬盘上存储的簇是不连续的,内核为了能索引到这些簇,于是就有了inode。
4、簇大小有什么影响?
通过上一问,我们已经看出,簇较小时空间利用率较高,较大时会浪费更多空间
,那么为什么不把簇分的更小一些呢?这是因为Windows在读取数据时是以簇为单位进行检索的,识别到空白的簇会直接跳过,如果簇大小为8K,识别1MB就是128个簇,如果簇大小为4K,同样识别1MB就是256个簇,如此一来就会在空白的簇上浪费掉更多的时间。也就是说,簇越小,空间利用率越高,但读取速度也就越慢;反之,簇越大,空间利用率就越低,但读取速度也就越快。NTFS分区的windows默认的簇大小一般是4KB。
5、簇大小和4K对齐有什么关系?
4K对齐分区提高硬盘的读写速度,4K文件系统提高文件系统的性能,两者在不同层面发挥作用。
Windows系统读写是按簇,硬盘读写则是按扇区,如果一个分区的起始扇区为一个4K扇区的第2个虚拟扇区,也就是4K没有对齐,那么对于簇大小为4K的分区,每一个簇都会被割裂在两个不同的4K扇区里,那么当Windows操作一个完整的4K簇的文件时,磁头就要对两个4K扇区进行操作,当存在大量4K左右小文件的时候,操作速度就会较低。而正确的4K对齐就会提升读写速度,尤其是小文件的读写速度。
6、固态硬盘为什么要4K对齐?
固态硬盘众所周知并无扇区的概念,为什么也要4K对齐呢?
因为固态硬盘所使用的NAND颗粒的最小单位是页(Page),页的大小一般也是4KB,所以固态硬盘的页,等同于机械硬盘的扇区。而且由于闪存颗粒的特性所致,4K对齐对其速度影响远大于机械硬盘,所以对于固态硬盘,我们更应该进行4K对齐。
本文链接:https://cs.pynote.net/hd/hdisk/202110206/
-- EOF --
-- MORE --