Welcome to Snooda's Blog
关于磁盘分区表、系统分区、系统引导方面,有很多名词,目前各种资料也比较杂乱,特意整理了一下。

CHS:Cylinder-Head-Sector
最传统的 柱面-磁头-扇区 模式的磁盘寻址方式。传统只支持8GB以内的磁盘。目前磁盘早已不采用真*CHS来寻址,特别是SSD,压根没有磁头了。但依然保持兼容,支持虚拟CHS信息。

在DOS和Windows XP系统时代,分区必须要对齐柱面(原因是和bios命令INT 13h相关,这里不细展开),而引导分区在第一柱面上,所以根分区从第二个柱面开始。所以XP之前的根分区都是从63扇区开始。
http://www.pixelbeat.org/docs/disk/

DOS had the requirement that its image did not span across cylinders, and so this region was added by partition managers so that the first partition was aligned on a cylinder boundary. Therefore this region's size is determined by the number of sectors (512 bytes) per cylinder. The maximum (and usual given todays disk sizes and LBA) sectors per track is 63, which leaves 62 sectors free after the MBR (31,744 bytes).


按这里的说法,每组扇区是63个。


这里其实就有一个疑问,引导扇区到底是0号还是1号?按习惯来讲,应该是0号开始,那么0-62是第一柱面,63是第二柱面的第一个扇区,所以系统从63开始是合理的。

但CHS资料显示,扇区号范围是1-63。(111111)。这就很奇怪了。。那难道第二柱面的第一个扇区不应该是64才对么?

仔细研究了下
https://en.wikipedia.org/wiki/Cylinder-head-sector

The first LBA sector is sector # zero, the same sector in a CHS model is called sector # one.
    All the sectors of each head/track get counted before incrementing to the next head/track.
    All the heads/tracks of the same cylinder get counted before incrementing to the next cylinder.
    The outside half of a whole Hard Drive would be the first half of the drive.



这就引出了LBA:Logical Block Address。由于磁盘越来越大,CHS已经无法满足寻址需求。
所以现在采用了逻辑寻址,仍然兼容CHS,但LBA的起始扇区是0,对应CHS的起始扇区1.


CHS tuples can be mapped onto LBA addresses using the following formula:

    A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1),

where A is the LBA address, Nheads is the number of heads on the disk, Nsectors is the maximum number of sectors per track, and (c, h, s) is the CHS address.



所以Fdisk使用LBA寻址方式的话,按0开始计算扇区号就ok。

这就引出了第二个经典问题:Windows XP分区使用SSD性能差问题。
核心原因之一就在于此。现代磁盘物理扇区都是4KB,需要4KB对齐,而起始的63显然不是4K对齐的。所以很多XP分区直接安装Windows7后,使用SSD时会报分区未对齐的问题。

目前Windows的默认起始扇区都是2048了,即首个分区前面空出来1MB的空间。这样就没有了4KB对齐的问题。
(1MB原因:Using a 1-MB alignment boundary allows safer editing of the partition table with Vista Disk Management. 详情可见https://en.wikipedia.org/wiki/Logical_Disk_Manager   主要还是空出来足够多的空间为了兼容一下历史的各种分区工具)



综上,CHS和LBA主要讲的是磁盘寻址方式。目前主要是LBA寻址了。历史上的4K对齐问题,就是因为寻址方式切换带来的问题。由于目前均已经采用了LBA模式,所以这块已经比较清爽了。



然后比较杂乱的就是MBR/EFI/GPT这一大堆了。

主要原因在于MBR在不同语境下具有了多种通俗含义。下面分场景来梳理一下。

在磁盘分区表场景,传统的分区表经常被叫做MBR分区表,与之对应的叫GPT分区表。在这里,MBR是分区表类型名。

MBR分区表信息是存在MBR分区里的,限于512容量限制,只支持4个分区槽位,所以就有MBR最大只支持4个主分区的限制。另外由于扇区号为32bit,所以在512扇区场景下,只能寻址2TB,所以也有2TB容量限制。


GPT分区表是UEFI标准的一部分,主要是支持更大磁盘和更新的引导模式,主要是使用扇区1存储主元信息,存储磁盘空间,uuid等信息,扇区2-33存储分区信息(这里有个有趣的点,就是GPT最大到底支持多少个分区,理论推算应该是32扇区 * 512扇区大小 / 128每个分区表项大小= 128,很多文章说gpt支持无限个分区,推测应该是有一些扩展实现。不过OS层面,windows只支持128个分区,linux只支持256个,所以开多了也并没有用)
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/genhd.h?h=v5.0.12#n63


这里就需要注意了:在使用GPT分区表的磁盘上,依然可以有MBR引导扇区。因为GPT是从扇区1开始的。

目前实践上,UEFI模式启动必须要用GPT分区。BIOS/MBR/legacy模式(后面统称传统模式)可以启动MBR分区/GPT分区磁盘。
注意:支持UEFI模式的硬件一般也向下兼容legacy模式

Case1:传统模式启动MBR分区:

传统模式,grub/老的Windows都是如此,差不多从Windows8开始,默认已经都改成UEFI启动了。但依然支持传统引导模式(Windows 11是否依然支持暂时没调研)。

对于grub来讲,大概分为stage1,stage1.5,stage2。
stage1放在MBR中,用来加载第二个扇区的stage1.5(MBR容量有限)
stage1.5加载后面连续n个扇区,用来加载文件系统,进入stage2
stage2进入主分区,启动系统内核

由于使用的都是63扇区之前的内容,所以并不会干扰正常分区中的内容


Case2:传统模式启动GPT分区:

grub2是支持该模式的。由于分区1-33都被gpt分区表占了。所以一般需要一个BIOS Boot Partition
https://en.wikipedia.org/wiki/BIOS_boot_partition
这个分区需要30KB以上,可以在任意位置,part entry type是固定的21686148-6449-6E6F-744E-656564454649 (ASCII string "Hah!IdontNeedEFI",blkid -p可查看)
但由于上面提到,主流分区工具都会预留一个1MB的空间在头部,所以这个分区就可以缩在这里,即扇区34-2047这个区间。目前看debian系是放在这里的。redhat系似乎是放在了2048-4095处(只看了一个样本)。虽然没有对齐之类的,但这个区域本身也基本不读写。所以还ok。


Case3:UEFI启动MBR分区:

Compatibility Support Module (CSM) 兼容模式,用传统模式启动。

Case4:UEFI启动GPT分区:

一般使用EFI system partition (also called ESP),推荐512MB,存放系统内核等文件。类型是EFI System。
文件系统推荐采用FAT32,UEFI默认是支持FAT12/16/32,但是可以扩展。比如apple就支持HFS+。



由上可知。legacy和efi模式启动其实是可以共存的,只要同时有BIOS Boot Partition和ESP,就可以同时支持两种模式启动。当然,更新内核时需要注意同时更新/boot和ESP中的内核。这样才不会产生不一致的问题。


Tags: , , , , ,
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]