DevOps自动化运维实践_Legacy Boot与UEFI Boot网络启动(PXE)的原理解析

基于Cobbler的系统自动化安装部署------各类Linux系统镜像的导入配置与客户端安装测试https://blog.csdn.net/xiaochenXIHUA/article/details/159314778?spm=1001.2014.3001.5501

一、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的网络启动解析

基于Cobbler的系统自动化安装部署------原理https://blog.csdn.net/xiaochenXIHUA/article/details/159200419?spm=1001.2014.3001.5501

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启动方式就配置完成了。

相关推荐
Gnix102972 天前
Copier 总报错?一篇讲透排查、升级、治理和团队落地
devops
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql