参考:

分区表格式

当使用硬盘的时候,我们并不是直接从头写入。当分区之后我们可以进行更好的文件组织管理,同时提高资源的利用率参见虚拟化的好处.
从功能上看,一个分区表承担着记录分区位置和标记可启动系统的任务.

MBR

上一代分区表格式,由硬盘的第一个扇区储存当然扇区的叫法来自于机械硬盘,不过这里只是计量单位,包含了主引导记录(MBR),数据区,分区表(最多四个)和结束标志.

结构

hex data
0x0000-0x0088 Mater Boot Record
0x0089-0x01BD 出错信息数据
0x01BE-0x01CD 分区1信息
0x01CE-0x01DD 分区2信息
0x01DE-0x01ED 分区3信息
0x01EE-0x01FD 分区4信息
0x01FE 0x55
0x01FF 0xAA
  1. 系统启动依靠MBR块的引导程序,从而启动有启动标志的分区.
  2. 分区包含的信息有引导标志,分区类型,分区位置(起始和结束位置),以及总大小,(这里用的是CHS模式,用的物理地址)
  3. MBR最后的是结束位,如果没有就会出错

缺点

同时,由于数据大小的严格限制,MBR最大表示8G的硬盘,但是由于这个实在是太小了,通过一些办法(用LBA模式,通过逻辑地址直接寻址,)将最大调整到2T虽然还是很小

但是MBR最大仍然只支持4个分区,为了解决这个问题,使用了扩展分区的方式(用类似链表的方式),但是这也导致一个问题就是一旦一个分区寄了,剩下的分区也可能会寄.而且由于引导程序大小在MBR块里头也是严格限定的,所以如果安装在逻辑分区的系统不能被直接引导.

注意事项

现代的存储盘超过2T已经很常见了,win10,win11的操作系统也基本上放弃了MBR分区格式,所以如果要装系统的话,一定注意不要使用MBR分区格式(因为有些盘刚买到手上的时候会被识别为MBR分区表不知道是真是还是DG有问题).

可以使用各种工具把MBR转成GPT,在DG里是’转换分区表类型为GUID’格式,微软的diskpart也可以在命令行实现

GPT

这是目前广泛使用的分区表格式,同时他也留下保护区给MBR.

GPT的分区开头会空一个扇区的大小,用来兼容MBR(如果你用过一些分区工具看到开头空了一点点,原因就是这个了)

在最后GPT分区表也会空几个扇区用来备份分区表(这就是为什么你最后一点点也分不干净)

起始信息区结构

字节偏移量 内容
0x00-0x07 GPT签名”EFI PART”
0x08-0x0B 版本号
0x0C-0x0F EFI信息区大小
0x10-0x13 GPT头CRC校验和
0x14-0x17 留空
0x18-0x1F EFI信息区的起始扇区号
0x20-0x27 备份位置的扇区号
0x28-0x2F 分区的起始扇区号
0x30-0x37 GPT分区的结束区扇区号
0x38-0x47 磁盘的GUID
0x48-0x4F 分区表的起始扇区号
0x50-0x53 分区表总个数(是的,可以自定义的),默认128个
0x54-0x57 每个分区表的大小,通常是128个字节
0x58-0x5B 分区表CRC校验和

分区表结构

相对偏移量 内容
0x00-0x0F GUID表示的分区类型
0x10-0x1F GUID表示的唯一标识符
0x20-0x27 起始扇区,用LBA表示
0x28-0x2F 结束扇区,用LBA表示
0x30-0x37 分区的属性标志
0x38-0x7F UTF-16LE的分区名称

分区类型GUID被各个系统用于特殊用途,比如linux的home分区是有一个固定的GUID的,可以在不被fstab定义的情况下自动挂载.

EFI的区域有以下内容

  1. EFI信息区(GPT头),来定义分区表的大小,并且存储了校验码.
  2. 分区表,分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值(分区全局ID)组成,EFI的分区表个数是可以扩展的(上面可以自定义分区表的大小),默认存储128个分区表.
  3. GPT分区,实际上的存放分区的地方
  4. 备份区,就是上面的那个最后的几个扇区,一共33个,备份了EFI信息区和分区表

所以从任何角度上看,GPT都是比MBR先进的,包括在可拓展性上和数据安全性上.

ESP分区

ESP分区(EFI系统分区)存储着启动需要的.efi文件,代替主引导记录的功能.通过一个分区类型GUID进行标志.在UEFI启动时启动其中的.efi文件(得益于UEFI统一接口).
一个问题就在于,按照标准,如果一个ESP分区里有linux和win的.efi,那么在UEFI设置里头是可以设置启动项的,但是微软这个asshole,

  • 首先不会允许bootmgr.efi启动非win系统,
  • 会在更新的时候偷摸UEFI启动项不停把自己设置成默认项,
  • 会把bootx64.efi这一通用启动文件偷摸成自己的,
  • 会和硬件厂商进行py交易,把默认引导项从bootx64改成bootmgfw.efi
  • 还有就是secure boot的数字签名一共就几个公司提供(对一般用户我认为没什么用其实)

文件系统

可以理解为系统使用硬盘的驱动所需要的对应格式.

(linux的文件权限存在文件系统里,win存在注册表或者其他什么东西里)

一些常见文件系统以及其特点

ext4

专为linux定制的文件系统,目前为止,ext4被认为是一个需要改进的文件系统,原则上可以支持16T的文件,支持无限的子目录和在线检查,日志记录等功能.

btrfs

被认为是先进的文件系统,提供很强的稳定性,提供大量的备份校验功能,但是性能不行

NTFS,FAT16,FAT32,exFAT

win开发出来的一系列文件系统,其中FAT16,FAT32都是以及淘汰调的文件系统,NTFS是他们的继任者,有日志功能等

exFAT是去除了日志等功能(读写更少)的NTFS,常用于,但所能存储的单文件的最大大小是大于NTFS的.一般多用于移动存储介质.

分区复制

如何实现一个分区的复制?
可以在另一个盘上分好一个相同大小的分区,然后直接按扇区把数据复制过去.
也可以分一个新区然后通过文件系统操作把文件拷贝过去.
当然也复制完了之后也可以通过修改GUID让新分区的GUID和原分区一样.