前续
因所在企业最近有一个服务器自动装机的需求,就大概研究了下ipxe。因为在我们设计的流程里,需要ipxe引导启动时能按照我们设定好的优先级顺序去读取引导文件,所以需要使用到自定义编译,在这里记录一下ipxe自定义编译方法。
IPXE官网
官方地址:http://ipxe.org/
源码下载地址
https://github.com/ipxe/ipxe
相关设计逻辑
服务器在安装os之前,先引导进入一次内存OS,执行一些信息上报或raid制作等操作,完成后由服务端(另外一个服务,和本文关系不大)根据上报的信息生成一个专属的引导文件,比如以服务器网口MAC地址命名的引导文件。该引导文件会指定服务器安装的OS版本等信息。
这里就涉及一个启动引导顺序的问题,服务器加载ipxe.efi文件时,需优先下载执行以自己网口MAC地址命名的引导文件,如找不到该文件,才使用默认的default引导文件。这里使用默认的default引导文件时,服务器会引导进入内存OS,而MAC地址命名的配置文件是需要服务器进入内存OS后服务端才会生成,这里有个依赖关系。所以有了以上优先级顺序,就顺利解决了我们的需求。如下图:
编译
1.下载ipxe源码,并进入对应目录
cd ipxe/src
make
2.编写自定义执行脚本 (引导文件名字可以自定义,不一定非是default或mac地址)
ipxe-master/src# cat boot.ipxe
#ipxe
dhcp
echo begin download pxelinux.cfg...
chain pxelinux.cfg/${mac} && echo pxelinux.cfg/${mac}... OK || chain pxelinux.cfg/default && echo pxelinux.cfg/default... OK
3.编译 (我这里分三种,分别适用于legacy模式、UEFI模式以及ARM架构的UEFI模式)
- legacy
ipxe-master/src# make bin/undionly.kpxe EMBED=boot.ipxe
- UEFI
ipxe-master/src# make bin-x86_64-efi/ipxe.efi EMBED=boot.ipxe
- ARM架构的UEFI
ipxe-master/src# make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 bin-arm64-efi/ipxe.efi EMBED=boot.ipxe
至此,三种类型的文件均已编译完成,直接拷贝至tftp服务端即可使用。
附:
- default引导文件
#!ipxe
kernel http://xxxxxx/bootos/vmlinuz initrd=initrd.img console=tty0 selinux=0 ipv6.disable=1
initrd http://xxxxxx/bootos/initrd.img
boot
- OS引导安装文件(MAC地址命名的,以Centos79为例)
#!ipxe
kernel http://xxxxxx/centos/79/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif inst.ks=http://xxxxxx/ksfile/7ks.cfg inst.repo=http://xxxxxx/centos/79 ip=dhcp console=tty0 selinux=0 ipv6.disable=1
initrd http://xxxxxx/centos/79/images/pxeboot/initrd.img
boot
OVER
2022-11-13