今天在给安装CentOS虚拟机时,突然开始思考制作U盘启动盘的原理,一直想不明白有了iso文件为什么还要工具制作启动盘,后来发现因为iso是磁盘的整个镜像文件,说到底他也只是个文件,如果直接拷贝的话,文件系统会把它放到一个不知道的地方,而我们需要这个磁盘镜像从第一个扇区完完整整的写入磁盘,其实u盘启动盘制造工具起了Linux中dd命令的作用,因此要用工具刻入,而不能直接复制进去。后面又心血来潮想复习一下MBR和GPT的知识,顺便看一眼自己的磁盘情况。
环境
-
Windows10
-
1块470G的磁盘
-
Windows自带的磁盘管理
-
winhex(试用版)
前置知识
探索之旅
可以看到本机上有一整块的磁盘,总大小为476.92GB,共有如下五个分区:
-
100MB的EFI系统分区
-
226GB的C盘
-
100GB的E盘
-
150GB的D盘
-
505MB的恢复分区
根据微软官方给出的解释,EFI系统分区用来存放启动操作系统的启动代码,恢复分区用来存放一些特殊工具,在系统出错时可以帮助你恢复Windows,而C盘、E盘和D盘用来存放数据,其中Windows操作系统数据存放在C盘。
可是你的电脑真的只有五个分区吗?
Winhex是一款强大的磁盘分析工具,可以从传送门下载,之前自己在取证课上用到过,了解的不是很深,但也够用了。下面简单给出winhex使用步骤
-
使用管理员权限打开winhex.exe
-
点击file,创建新的case
-
创建完成后再次点击file,点击add medium,然后选择整块磁盘
-
查看结果
可以看到这块GPT分区的磁盘共有六个分区,但Partition 2他的文件系统是未知的。其他五个分区分别对应着上面说的五个分区,这时候也能明白下图中磁盘分区1和磁盘分区6的意义了。
继续分析,我们来看一下起始扇区,GPT的第一个sector被称为PMBR,第二个扇区是表头,接着32个扇区是分区表,剩下的是数据。
其中第一个扇区,在原始MBR分区表中,分区类型使用EE来表明是GPT分区,范围从LBA 0x01到0xFFFFFFFF,识别不了该标志的legacy BIOS此时就会启动操作系统失败,而不会乱写入数据破坏分区;可以指别GPT分区的UEFI或legacy BIOS可以明白这是一个GPT分区而不是MBR分区。
第二扇区存放GPT表头,定义了硬盘的可用空间以及组成分区表的项的大小和数量。在使用64位Windows Server2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。
起始字节 | 偏移量 | 内容 |
---|---|---|
0 | 16 | 分区类型GUID |
16 | 16 | 分区GUID |
32 | 8 | 起始LBA(小端格式) |
40 | 8 | 末尾LBA |
48 | 8 | 分区属性 |
56 | 72 | 分区名字 |
后面的三十二个扇区都为分区表,由于本电脑上只有六个分区,因此只需要看前两个扇区就好。
我们先来分析分区1
可以从分区名字上看出,分区1为EFI system partition(ESP),他的分区类型GUID其实也证明了这一点。
该分区属性中63位为1,表示不自动挂载,也就是不自动分配盘符,这就是为什么我们只能看到C、D、E分区而看不到该分区的原因。
EFI System Partition分区存放着系统启动文件,可以看到里面都是UEFI相关的文件。
前面我们看到这个分区的文件系统是FAT32,为什么是FAT文件系统呢?osdev中有这么一段话:
UEFI firmware loads an arbitrary sized UEFI application (a relocatable PE executable file) from a FAT partition on a GPT-partitioned boot device to some address selected at run-time.
这里面的PE格式文件就是我们看到的后缀为.EFI文件,上面这段话很好的解释了需要FAT32文件系统的原因。
分区2从分区名字和分区类型GUID中都可以看出为微软保留分区,值得一提的是,该分区未在磁盘管理中出现。使用windows自带工具diskpart,发现当list volume时五个volume,此时看不到分区2,list partition时便可以看到分区2了,因此猜测,可能是微软不将保留分区视为volume,所以在磁盘管理上才看不见的。
分区2的属性同样是不自动挂载,同理分区6属性中63位也为1,表示不自动挂载,需要注意的是它的第0位也为1,表示为系统分区,磁盘分区工具必须将此分区保持原样,不得做任何修改。
分区3、4、5皆为Basic data partition分区,他们的文件系统类型需要去分区内第一个扇区中获得。
到这里就分析完了,感觉自己对文件系统和UEFI启动还不是特别了解,因此后面有机会还是要去探索一番。