本教程参考的相关内容如下:
鸟哥私房菜
维基百科EFI
维基百科GPT
CSDN博客几篇:
https://blog.csdn.net/qq_24965035/article/details/51659697
https://blog.csdn.net/yeshahayes/article/details/52806095
https://blog.csdn.net/u013201439/article/details/50273113
主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,一般就是磁盘的第一个扇区。
开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区,这个扇区通常是512Bytes的大小(旧的磁盘扇区都是 512Bytes喔!,所以说第一个扇区512Bytes会有这两个数据
由于分区表所在区块仅有64Bytes容量,因此最多仅能有四组记录区,每组记录区录了该区段的启始与结束的柱面号码。 若将硬盘以长条形来看,然后将柱面以直条图来看,那么那64Bytes的记录区段有点像下面的图示:
上图中我们假设硬盘只有400个柱面,共分区成为四个分区,第四个分区所在为第301到400号柱面的范围。当你的操作系统为Windows时,那么第一到第四个分区的代号应该就是C, D, E, F,当你有数据要写入F盘时, 你的数据会被写入这颗磁盘的301~400号柱面之间的意思。
由于分区表就只有64Bytes而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)或延伸(Extended)分区。根据上面的图示与说明,我们可以得到几个重点信息:
既然分区表只有记录四组数据的空间,那么是否代表我一颗硬盘最多只能分区出四个分区?当然不是啦!有经验的朋友都知道, 你可以将一颗硬盘分区成十个以上的分区的!那又是如何达到的呢?在Windows/Linux系统中, 我们是通过刚刚谈到的延伸分区(Extended)的方式来处理的啦!延伸分区的想法是: 既然第一个扇区所在的分区表只能记录四笔数据, 那我可否利用额外的扇区来记录更多的分区信息?实际上图示有点像下面这样
实际上延伸分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记载分区信息的!同时在上图当中,我们知道硬盘的四个分区记录区仅使用到两个,P1为主要分区,而P2则为延伸分区。请注意, 延伸分区的目的是使用额外的扇区来记录分区信息,延伸分区本身并不能被拿来格式化。 然后我们可以通过延伸分区所指向的那个区块继续作分区的记录。如上图右下方那个区块有继续分区出五个分区, 这五个由延伸分区继续切出来的分区,就被称为逻辑分区(logical partition)。 同时注意一下,由于逻辑分区是由延伸分区继续分区出来的,所以他可以使用的柱面范围就是延伸分区所设置的范围喔! 也就是图中的101~400啦!
仔细看看,怎么设备文件名没有/dev/sda3与/dev/sda4呢?因为前面四个号码都是保留给Primary或Extended用的嘛! 所以逻辑分区的设备名称号码就由5号开始了!这在 MBR方式的分区表中是个很重要的特性,不能忘记喔!
MBR总结如下:
举个例子如下:在Windows操作系统当中,如果你想要将D与E盘整合成为一个新的分区,而如果有两种分区的情况如下图所示, 图中的特殊颜色区块为D与E盘的示意,请问这两种方式是否均可将D与E整合成为一个新的分区?
上图可以整合:因为上图的D与E同属于延伸分区内的逻辑分区,因此只要将两个分区删除,然后再重新创建一个新的分区,就能够在不影响其他分区的情况下,将两个分区的容量整合成为一个。
下图不可整合:因为D与E分属主分区与逻辑分区,两者不能够整合在一起。除非将延伸分区破坏掉后再重新分区。 但如此一来会影响到所有的逻辑分区,要注意的是:如果延伸分区被破坏,所有逻辑分区将会被删除。 因为逻辑分区的信息都记录在延伸分区里面嘛!
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准它是可扩展固件接口(UEFI)标准(被Intel用于替代个人计算机的BIOS)的一部分。
因为过去一个扇区大小就是 512Bytes 而已,不过目前已经有 4K 的扇区设计出现!为了相容于所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块位址(Logical Block Address, LBA)来处理。GPT 将磁盘所有区块以此 LBA(默认为512Bytes 喔!) 来规划,而第一个 LBA 称为 LBA0 (从 0 开始编号)。与 MBR 仅使用第一个 512Bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份!这样或许会比较安全些吧!详细的结构有点像下面的模样:
GPT总结:
在了解了两种主要的分区表之后,现在来解释boot,MBR+Legacy, GPT+EFI的计算机启动过程
启动用英文来讲是boot,但是boot的意思是靴子,靴子又怎么和计算机的启动联系起来呐,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:“pull oneself up by one’s bootstraps”。其字面意思就是拽着鞋带把自己拉起来,这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!
早期是这样,必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行。所以,工程师们把这个过程叫做”拉鞋带”,久而久之就简称为boot了。
也就是传统的BIOS启动方式,相对应的刚是新型UEFI BIOS+GPT的启动方式。计算机里面有CMOS和BIOS两个东西,CMOS是记录各项硬件参数且嵌入在主板上面的储存器,BIOS则是一个写入到主板上的一个固件(再次说明, 固件就是写入到硬件上的一个软件程序)。这个BIOS就是在开机的时候,计算机系统会主动执行的第一个程序了!
也就是:
第二点要注意,如果你的分区表为GPT 格式的话,那么BIOS也能够从LBA0 的MBR相容区块读取第一阶段的开机管理程序码, 如果你的开机管理程序能够认识GPT 的话,那么使用BIOS同样可以读取到正确的操作系统核心喔!换句话说, 如果开机管理程序不懂GPT ,例如Windows XP 的环境,那自然就无法读取核心文件,开机就失败了,一般来说GPT分区中的系统核心是放在ESP分区当中的,要找到ESP分区,前提就是开机管理程序懂GPT分区。
由上面的说明我们会知道,BIOS与MBR都是硬件本身会支持的功能,至于Boot loader则是操作系统安装在MBR上面的一套软件了。由于MBR仅有446Bytes而已,因此这个开机管理程序是非常小而美的。 这个boot loader的主要任务有下面这些项目:
上面前两点还容易理解,但是第三点很有趣喔!那表示你的计算机系统里面可能具有两个以上的开机管理程序呢!那表示你的计算机系统里面可能具有两个以上的开机管理程序呢!有可能吗?我们的硬盘不是只有一个MBR而已?是没错啦!但是开机管理程序除了可以安装在MBR之外, 还可以安装在每个分区的开机扇区(boot sector)喔!瞎密?分区还有各别的开机扇区喔?没错啊!这个特色才能造就“多重开机”的功能啊!
比如你如果将ubuntu和windows同时装在一个MBR分区当中,通过BIOS界面下调整它们的启动顺序则是调整MBR里面的开机管理程序的顺序。如果只有一个开机管理程序在MBR当中,则该开机管理程序会转交给其他的Loader来实现多重开机。
再比如你的个人计算机只有一个硬盘,里面切成四个分区,其中第一、二分区分别安装了Windows及Linux,你要如何在开机的时候选择用Windows还是Linux开机呢?假设MBR内安装的是可同时认识Windows/Linux操作系统的开机管理程序,
MBR的开机管理程序提供两个菜单,菜单一(M1)可以直接载入Windows的核心文件来开机;菜单二(M2)则是将开机管理工作交给第二个分区的开机扇区(boot sector)。当使用者在开机的时候选择菜单二时,那么整个开机管理工作就会交给第二分区的开机管理程序了。当第二个开机管理程序启动后,该开机管理程序内(上图中)仅有一个开机菜单,因此就能够使用Linux的核心文件来开机啰。这就是多重开机的工作情况啦!
总结如下:
那现在请你想一想,为什么人家常常说:“如果要安装多重开机,最好先安装Windows再安装Linux”呢?这是因为:
Linux在安装的时候,你可以选择将开机管理程序安装在MBR或各别分区的开机扇区, 而且Linux的loader可以手动设置菜单(就是上图的M1, M2…),所以你可以在Linux的boot loader里面加入Windows开机的选项;Windows在安装的时候,他的安装程序会主动的覆盖掉MBR以及自己所在分区的开机扇区,你没有选择的机会, 而且他没有让我们自己选择菜单的功能。因此,如果先安装Linux再安装Windows的话,那MBR的开机管理程序就只会有Windows的项目,而不会有Linux的项目(因为原本在MBR内的Linux的开机管理程序就会被覆盖掉)。 那需要重新安装Linux一次吗?当然不需要,你只要用尽各种方法来处理MBR的内容即可。 例如利用Linux的救援模式来挽救MBR啊!
以windows启动过程为例,我们来看看windows的具体启动:
系统启动时顺序BIOS->MBR->DPT->PBR->寻找根目录下bootmgr(WIN7/Vista)/grldr(Grub)/btldr.mbr(Boot Link)->\boot\bcd->winload.exe->内核
其中引导配置数据库(BCD)写入的是winload的加载位置,目前内置用于管理配置数据库的公用程序为"bcdedit.exe;若要快速设置系统分区或是修复错误的引导选项则使用"bcdboot.exe"公用程序;其他用于管理BCD的工具还有EasyBCD、Bootice或是WMI等工具修改BCD。
统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人计算机系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。也就是说,现在加电后首先进入的不再是BIOS,而是UEFI接口。UEFI在概念上非常类似于一个低阶的操作系统,并且具有操控所有硬件资源的能力。而平时我们装机所说的进入BIOS,一来是因为现在大多数的固件是BIOS,和UEFI同时具备,所以这个固件不好命名,二来是没有将它们具体分开,只是称呼加电后进入的那个界面为BIOS。
UEFI主要是想要取代BIOS这个固件界面,因此我们也称 UEFI 为 UEFI BIOS 就是了。UEFI 使用 C 程序语言,比起使用组合语言的传统 BIOS 要更容易开发!也因为使用 C 语言来撰写,因此如果开发者够厉害,甚至可以在 UEFI 开机阶段就让该系统了解 TCP/IP 而直接上网! 根本不需要进入操作系统耶!这让小型系统的开发充满各式各样的可能性!
UEFI相比于BIOS的好处在于:
UEFI的启动顺序如下:
系统创建UEFI启动时,会创建ESP(EFI SYSTEM PARTITION),格式为FAT分区,该分区位置随意设置,可以在硬盘起始,中间,末尾,只要在硬盘的前2T空间内就可以,用于存放启动文件。
以windows为例,启动顺序如下
EFI/Boot/bootx64.efi(或bootia32.efi) > EFI/Microsoft/Boot/bootmgfw.efi >EFI/Microsoft/Boot/BCD >EFI/Microsoft/Boot/winload.efi
下面具体讲解每个步骤:
EFI\BOOT\bootx64.efi(bootia32.efi)是用于UEFI固件加载的启动文件,相当于BIOS里面的开机管理程序,然后它会根据开机菜单,加载BCD,这是一个存储启动配置且独立于硬件的数据库,它会确定加载哪个分区的winload.efi,这样就完成了启动。
要注意双系统的安装,其启动方式必须一致。虽然不一致可以通过某些软件来修复引导文件,但是如果引导文件出错容易引发一些模糊的问题
对于UEFI启动的windows加ubuntu双系统,在第一个启动盘ESP分区里会有两个系统的开机管理程序,它们的加载顺序可以在BIOS里面调整。
对于legacy启动的双系统,在MBR里面会有开机管理程序(boot loader),然后它可以提供菜单,以便加载其它loader。