一、Legacy Boot与UEFI Boot
1.1、Legacy启动模式与UEFI启动模式解析

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Legacy启动模式 | UEFI启动模式 |
| 定义: 《1》Legacy Boot是基于主板上传统BIOS固件,开机后通过主引导记录(MBR)加载系统。 《2》Legacy启动模式,是一种传统、古老的BIOS启动方式,必须搭配【MBR分区表】使用。 | 定义: 《1》UEFI(Unified Extensible Firmware Interface)是新一代的主板启动方式,用来替代Legacy BIOS,目前的电脑、新系统默认都使用它。 《2》UEFI为操作系统和固件提供了更加强大、安全、方便的交互途径。UEFI BIOS作为一种新的BIOS自然也兼容老的legacy启动方式。 《3》如何确定自己的启动模式呢,方法是进入BIOS,然后找到有一项叫"boot mode",选中"UEFI boot"就是UEFI启动模式,选中"Legacy boot"就是Legacy启动模式。 |
| 完整启动流程: 【上电与复位-->上电自检-->BIOS启动介质选择-->MBR读取与验证-->MBR解析分区表-->VBR启动系统引导管理器-->加载系统内核并启动-->内核接管启动系统】 《1》上电与复位(Power-On/Reset;主板通电后,CPU从固定物理地址0xFFFFFFF0或0xFFFF0取第一条指令;该地址映射到主板上的SPI Flash ROM中的BIOS固件入口点,CPU处于16位实模式,寻址空间限制在1MB); 《2》上电自检(Power-On Self-Test;BIOS ROM中的Boot Block模块执行CPU寄存器初始化、内存检测、显卡初始化、键盘控制器检测、CMOS读取、存储设备枚举等硬件串行检测,耗时久,上电自检过程中若有错误则通过蜂鸣提示,且显示出自检信息); 《3》BIOS启动介质选择(根据CMOS中设置的启动顺序,BIOS按照顺序遍历每个设备(硬盘-->USB-->光驱-->网络PXE)对每个设备执行可启动介质检查); 《4》主引导记录(MBR)读取与验证(按照CMOS启动顺序扫描存储设备,读取硬盘的第一个扇区(512字节【0-445字节是Bootstrap code引导代码;446-509字节是4*16字节的分区表;510-511是启动签名0x55AA】)到内存地址0x7C00); 《5》MBR解析分区表(MBR代码扫描4个分区表条目,找到活动分区,然后从该活动分区的VBR(Volume Boot Record)读取首扇区,VBR包含包含该分区文件系统的引导代码); 《6》VBR启动系统引导管理器(如:windows的bootmgr;Linux的grub); 《7》加载系统内核并启动(如:windows的winload.exe/winresume.exe;linux的vmlinuz(压缩内核)+initrd(initramfs);Bootloader读取分区文件系统,将内核镜像加载到内存,设置引导参数,将CPU从实模式切换到包含模式(32位);跳转执行内核入口点)。 《8》内核接管启动系统(Windows是WinLoad.exe-->ntoskrnl.exe-->会话管理器-->wininit.exe;Linux是start_kernel()-->初始化各子系统-->启动1号进程(systemd/init))。 | 完整启动流程: 【上电与复位-->SEC安全验证-->PEI前期硬件初始化-->DXE驱动执行环境-->BDS启动设备选择-->系统加载-->内核加载与系统启动】 《1》SEC安全验证(Security Phase;上电-->CPU复位-->SEC阶段开始;CPU同样从固化地址执行第一条指令【建立临时内存(Cache-as-RAM,CAS),验证固件完整性,创建启动固件卷(Boot Firmware Volume,BFV)的信息,将控制权传递给PEI】); 《2》PEI前期硬件初始化(Pre-EFI Initialization;SEC-->PEI Foundation-->PEI Modules(PEIM);PEI Foundation是内存检测与初始化;PEIM是PEI模块发现并安装主要固件卷;这一步骤主要是对【内存初始化(从CAR过渡到真实DRAM)-->主板平台初始化(芯片组、南桥固件加载)-->DXE入口发现(定位DXE固件卷)-->CPU模式切换(可能从32位过渡到64位)-->S3/S5唤醒支持(休眠/关机状态恢复)】); 《3》DXE驱动执行环境(Driver Execution Environment;PEI-->DXE Foundation-->DXE Drivers-->BDS;【DXE Foundation是提供UEFI核心服务】【DXE Drivers是按依赖顺序逐个加载的驱动程序】【Boot Services服务包含(AllocatePages、LoadImage、StartImage、ExitBootServices)】【Runtime Services服务包含(GetTime、SetVariable等)】【Protocols服务包含设备驱动协议(如:Block I/O、Device Path、Graphics)】DXE阶段枚举所有硬件并加载对应驱动,完成后构建硬件抽象层(HAL)所有设备已初始化); 《4》BDS启动设备选择(Boot Device Selection;DXE-->BDS-->UEFI Boot Manager-->ESP;【BDS(Boot Device Select)是固件与操作系统的分界点】;【UEFI Boot Manager执行逻辑如下:1、读取NVRAM中的Boot Order(如:boot0001是\EFI\Ubuntu\grubx64.efi;boot0002是\EFI\Microsoft\Boot\bootmgfw.efi;boot0003是USB(FAT32);2、尝试按顺序启动(对每个Boot条目都读取并验证.efi文件);3、EFI System Partition(ESP)查找;4、安全启动(Secure Boot)验证(验证.efi的PK/KEK/DB/DBX签名;未签名或签名在黑名单中则拒绝执行);5、加载EFI应用(LoadImage()+StartImage()将.efi加载到内存);然后将控制权交给Bootloader(如GRUB、Windows Boot Manager)】); 《5》系统加载(OS Bootloader;Linux的EFI入口是grubx64.efi/shimx64.efi,后续加载GRUB读取/boot/grub/-->加载vmlinuz+initrd;windows的EFI入口是bootmgfw.efi,读取BCD-->加载winload.efi-->ntoskrnl.exe); 《6》内核加载与系统启动(Bootloader完成ExitBootServices()调用;UEFI Boot Services终止,Runtime Services保留(供OS运行时调用);内核完全接管系统)。 |
| 关键特性: **《1》分区表绑定:**必须使用MBR,不支持GPT; **《2》硬盘上限:**最大仅支持2.2TB,超量的空间无法识别; **《3》分区数量:**最多只支持4个主分区与多个扩展分区; **《4》兼容性:**完美支持windowsxp/7等老旧系统; **《5》性能:**开机后自检慢、引导效率低、没有安全启动(Secure Boot); **《6》文件系统:**主要支持FAT32,对NTFS引导则依赖引导代码; 《7》Legacy启动模式支持32位、64位的操作系统; | 关键特性: **《1》启动速度更快:**跳过复杂自检,直接加载系统; **《2》支持超大硬盘:**搭配GPT分区表,无容量限制; 《3》分区更灵活:GPT支持128个主分区,不用再纠结主分区与扩展分区; **《4》安全启动:**防止恶意程序篡改引导(Win11强制要求); 《5》图形化界面:固件界面支持鼠标、高分辨率、设置更友好; 《6》UEFI启动模式只支持64位的操作系统; 《7》Linux系统若采用UEFI启动模式,必须添加【/boot/efi】分区; |
| 适用场景: 《1》2012年及其以前的老电脑、旧硬件(主板/BIOS不支持UEFI); 《2》必须安装Windows7/xp这类更早的原生不支持UEFI的系统; 《3》硬盘容量小于等于2TB、不用多分区与安全启动。 《4》只安装32位的windows系统; 《5》极简、嵌入式系统(UEFI固件体积大,资源首先环境下BIOS更轻量); | 适用场景: 《1》2012年后的新电脑、新主板主板默认支持UEFI; 《2》需要安装Windows8、Windows10、Windows11系统; 《3》硬盘容量大于2TB; 《4》需要多系统、多引导(如:windows+Linux双系统); 《5》需要安全启动(防止恶意软件、勒索病毒篡改引导); 《6》追求更快的开机速度(可跳过冗长自检、直接加载EFI引导、支持快速启动); 《7》新硬件(如:NVME固态硬盘在UEFI+GPT才能发挥应有性能); 《8》需要超过4个主分区; 《9》虚拟机/云环境(QEMU/KVM、VMware、Azure VM大多使用UEFI)。 |
[【legacy启动模式】与【UEFI启动模式】解析]
1.2、BIOS与UEFI的对比
|------------|------------------------|---------------------------------|
| 对比维度 | Legacy BIOS | UEFI |
| 执行模式 | 16位实模式 | 32/64位保护模式/长模式 |
| 寻址能力 | 最大1MB | 物理、虚拟内存全都支持 |
| 分区方案 | MBR(4个主分区;最大支持2TB硬盘空间) | GPT(128个主分区,最大18EB) |
| 引导代码位置 | MBR首446字节 | EFI System Partition(FAT32) |
| 启动介质扫描 | 遍历设备MBR | NVRAM Boot Entries+回退路径 |
| 固件架构 | 单体式(monolithic) | 模块化(SEC-->PEI-->DXE-->BDS) |
| 安全机制 | 无内置安全 | Secure Boot+TPM支持 |
| 驱动加载 | BIOS中内置 | DXE驱动加载 |
| 高速启动 | 无 | Fast Boot/Quick Boot |
| 多系统支持 | 依赖第三方bootloader | 原生多系统引导 |
| 用户交互 | 文本界面(CMOS Setup) | 图形界面(HII) |
| 运行时服务 | 无 | Runtime Services(Get Variable等) |
[Legacy BIOS与UEFI的对比]
二、Legacy Boot的网络启动解析
2.1、Legacy Boot集成的PXE实现原理
虽然现在所有的服务器厂商都将BIOS的实现换成了UEFI,但为了兼容性考虑,所有的厂商依然提供老的BIOS形式的基于MBR的Legacy引导方式,在这个模式下,通过PXE可以实现最基础的功能。
**在Legacy模式下,简单来说,PXE是通过网卡内置的一个小固件(PXE Client)实现的。**大致的流程是:在系统启动的时候,会启动网卡里的PXE Client,固件启动后、会发起DHCP请求、当DHCP服务器收到PXE Client的DHCP请求后,会通过预定义的字段返回给客户端IP地址信息、TFTP地址信息、以及需要加载的bootloader的名字。PXE Client收到这些信息后,首先会配置IP地址,此时网络就可以通信了,再根据TFTP的地址和名字信息获取到bootloader并执行,剩下的,就由bootloader去拉起内核和OS。
PXE工作在Client/Server模式下,其中,PXE client集成在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,由PXE client将放置在远端主机(Server)的文件通过网络下载到本地运行。
如下图可知:运行PXE协议需要设置【DHCP服务器】和【TFTP服务器】。DHCP服务器用来给PXE client(将要安装系统的主机)分配一个IP地址,由于是给PXE client分配IP地址,所以在配置DHCP服务器时需要增加相应的PXE设置。此外,在 PXE client的ROM中,已经存在了TFTP Client。PXE Client通过TFTP协议到TFTP Server上下载所需的文件。

2.2、DHCP服务配置
以Cobbler中的DHCP服务的配置文件为例说明【最重要的配置只有【next-server】和【filename】,next-server指明了tftp server服务器的地址,filename指明了bootloader的名字(是相对路径,对应tftp根目录下的【grub】目录下的文件),有了这两个内容,PXE Client就可以去tftp上去获取bootloader并加载了。】(DHCP服务配置文件中,对于不同平台,有不同的标识,可查看RFC4578标准):
bash
#Cobbler中DHCP服务的配置文件【/etc/cobbler/dhcp.template】需修改的内容如下
#【subnet】表示网段。
#【option routers】表示网关。
#【option domain-name-servers】表示DNS
#【option subnet-mask】表示子网掩码
#【range dynamic-bootp】表示DHCP动态分配的IP地址范围(前提是这些IP未被使用,否则会冲突)
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option domain-name-servers 223.5.5.5;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.1.130 192.168.1.254;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.1.35;#关键配置!用于指明tftp server所在的服务器的IP地址
filename "pxelinux.0"; #关键配置!用于指明引导加载程序(bootloader)的名字
}


2.3、TFTP服务配置引导加载程序及其加载程序的界面配置
TFTP不需要配置,只用安装并启动就行了;主要是需要准备好启动所需要的【引导加载程序(bootloader)】和【内核(vmlinuz)】【临时根系统(initrd)】等文件。 为了简单、一般来说PXE里不使用grub作为bootloader、使用最多的还是pxelinux,他是syslinux的一部分,所以很简单,只需要安装【syslinux】就行了,在CentOS系统里,这个文件在/usr/share/syslinux/pxelinux.0(在Cobbler中TFTP的pxelinux.0文件是在【/var/lib/tftpboot/】目录下),直接拷贝到tftp的根目录下即可。需要注意的是,在syslinux 5.0以上的版本,还需要把ldlinux.c32这个文件同步拷贝到tftp根目录下。

有了引导加载程序(bootloader;即:pxelinux.0)、还需要引导加载程序(bootloader)的配置文件(如:pxelinux.cfg/default),针对pxelinux.0来说,默认会根据以下的顺序加载配置文件:
/pxelinux.cfg/b8945908-d6a6-41a9-611d-74a6ab80b83d
/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/pxelinux.cfg/C0A8025B
/pxelinux.cfg/C0A8025
/pxelinux.cfg/C0A802
/pxelinux.cfg/C0A80
/pxelinux.cfg/C0A8
/pxelinux.cfg/C0A
/pxelinux.cfg/C0
/pxelinux.cfg/C
/pxelinux.cfg/default
其中,根目录指的是和pxelinux.0相同的目录,这么做的目的是为了方便同一个PXE Server为多个机器服务,每个机器可以通过单独的配置文件进行配置,而不用为每台客户端配置一个PXE Server了。实际上、装机系统cobbler、也是基于这个特性,来解决不同机器的不同装机配置问题的【引导加载程序(bootloader)的配置文件(如:pxelinux.cfg/default)很简单,只需要指明文件中的【kernel】和【initrd】的文件即可,默认情况下这些文件依然会从tftp里去取。至于vmlinuz和initrd.img这两个文件的获取,最简单的办法,就是从系统发行版的iso安装镜像里去找就可以了】

bash
#引导加载程序(bootloader)的配置文件(如:pxelinux.cfg/default)内容示例
LABEL 启动的菜单名称(如:centos7.9-x86_64)
MENU LABEL 启动的菜单名称(如:centos7.9-x86_64)
kernel /images/centos7.9-x86_64/vmlinuz
append initrd=/images/centos7.9-x86_64/initrd.img inst.ks.sendmac inst.ks=http://192.168.1.35/cblr/svc/op/autoinstall/profile/centos7.9-x86_64 inst.repo=http://192.168.1.35/cblr/links/centos7.9-x86_64
ipappend 2
到这里,恭喜你一个最简单的PXE Server就搭建完成了。已经可以在客户端测试是否可以安装系统了。
三、UEFI Boot的网络启动解析
2.1、UEFI Boot集成PXE的实现原理
相比Legacy启动直接读取MBR启动分区的第一个扇区作为引导的逻辑,UEFI启动变得强大了很多,在UEFI模式下,固件具有直接读取FAT文件系统的能力,并且直接通过运行EFI可执行文件的方式进行引导。 因为这个显而易见的变化,导致对应到PXE相关的实现上,也会有相应的区别。
下面再看一个PXE配置方案,与Legacy+PXE一样,UEFI的网络启动也是需要【DHCP】与【TFTP Server】,只是DHCP服务器的配置有些不一样(即filename后的引导加载程序不同):
bash
#Cobbler中DHCP服务的配置文件【/etc/cobbler/dhcp.template】需修改的内容如下
#【subnet】表示网段。
#【option routers】表示网关。
#【option domain-name-servers】表示DNS
#【option subnet-mask】表示子网掩码
#【range dynamic-bootp】表示DHCP动态分配的IP地址范围(前提是这些IP未被使用,否则会冲突)
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option domain-name-servers 223.5.5.5;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.1.130 192.168.1.254;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.1.35;#关键配置!用于指明tftp server所在的服务器的IP地址
filename "grubx64.efi"; #关键配置!用于指明引导加载程序(bootloader)的名字
}
2.2、DHCP服务配置
只是把DHCP的配置文件中的【filename】的配置换成了【grubx64.efi】,这意味着在UEFI启动里,放弃了使用pxelinux,转而使用了grub,当然其实SYSLINX也是有efi的,文件名syslinux.efi,但是因为确实用的比较少,所以在这个环境里就换成了grub作为引导加载程序(Bootloader)。
接下来是grubx64.efi和配置文件的准备(以红帽为例,若本身机器就是用的UEFI启动,则可以直接拷贝【/boot/efi/EFI/redhat/grubx64.efi】文件即可;若系统是基于MBR安装,那么可以从对应的系统iso介质的【EFI/BOOT】目录中拷贝【grubx64.efi】出来放置到TFTP服务的根目录下【/var/lib/tftpboot/】即可;其它Linux发行版本获取grubx64.efi的方法也是类似)。

2.3、TFTP服务配置引导加载程序及其加载程序的界面配置
TFTP不需要配置,只用安装并启动就行了;主要是需要准备好启动所需要的【引导加载程序(bootloader)(如:grub/grubx64.efi)】和【内核(vmlinuz)】【临时根系统(initrd)】等文件。 。因此,只需要配置一个grub.cfg就行了,把这个配置文件放在和grubx64.efi同目录下:
bash
#引导加载程序(bootloader)的配置文件(如:pxelinux.cfg/default)内容示例:
set timeout=5
menuentry 'RHEL' {
linuxefi images/vmlinuz
initrdefi images/initrd.img
}
到这里,恭喜你,一个最简单的UEFI的PXE启动方式就配置完成了。