参考:
- https://www.cnblogs.com/cyx-b/p/14091603.html
- https://zhuanlan.zhihu.com/p/183238194
- https://zhuanlan.zhihu.com/p/448817053
- https://learn.microsoft.com/zh-cn/windows-server/storage/file-server/ntfs-overview
- https://linux.cn/article-7083-1.html
- https://juejin.cn/post/6844903664235069454
- https://www.zhihu.com/question/21672895
分区表格式
当使用硬盘的时候,我们并不是直接从头写入。当分区之后我们可以进行更好的文件组织管理,同时提高资源的利用率参见虚拟化的好处.
从功能上看,一个分区表承担着记录分区位置和标记可启动系统的任务.
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 |
- 系统启动依靠MBR块的引导程序,从而启动有启动标志的分区.
- 分区包含的信息有引导标志,分区类型,分区位置(起始和结束位置),以及总大小,(这里用的是CHS模式,用的物理地址)
- 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的区域有以下内容
- EFI信息区(GPT头),来定义分区表的大小,并且存储了校验码.
- 分区表,分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值(分区全局ID)组成,EFI的分区表个数是可以扩展的(上面可以自定义分区表的大小),默认存储128个分区表.
- GPT分区,实际上的存放分区的地方
- 备份区,就是上面的那个最后的几个扇区,一共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和原分区一样.