PXE网启

2025-03-07
2分钟阅读时长

pxe网启流程图

image-20250317120508423

本文档将详细介绍如何编译和配置 iPXE,以便在网络引导(PXE)环境中使用。iPXE 是一个开源的网络引导固件,支持多种协议(如 HTTP、iSCSI、TFTP 等),可以替代传统的 PXE 固件,提供更强大的功能。

iPXE 简介

iPXE 是一个增强版的 PXE 固件,支持以下功能:

  • 支持 HTTP、iSCSI、FTP 等协议。
  • 支持从远程服务器加载内核和镜像。
  • 支持脚本化配置,提供灵活的引导选项。
  • 支持多种硬件和虚拟化平台。

iPXE 可以嵌入到网卡 ROM 中,也可以作为链式引导加载器运行。

编译 iPXE

获取源码

  1. 克隆 iPXE 的官方仓库:
git clone git://git.ipxe.org/ipxe.git
cd ipxe/src

安装依赖

在编译 iPXE 之前,确保系统已安装以下依赖:

  • GCC 编译器
  • GNU Make
  • Perl
  • liblzma-dev(可选,用于压缩支持)

在 Debian/Ubuntu 上安装依赖:

apt install build-essential perl liblzma-dev

在 CentOS/RHEL 上安装依赖:

yum install -y gcc binutils make perl xz-devel mtools mkisofs syslinux 

编译 iPXE

  1. 编译标准 iPXE 镜像: 运行以下命令编译一个标准的 iPXE 镜像:
make bin/undionly.kpxe

输出文件 bin/undionly.kpxe 可以用于传统的 PXE 环境。

  1. 编译自定义 iPXE 镜像: 如果需要自定义功能,可以编辑 src/config/general.h 文件,启用或禁用特定功能。例如,启用 HTTP 支持:
#define DOWNLOAD_PROTO_HTTP

然后重新编译:

make bin/undionly.kpxe
  1. 编译 UEFI 镜像: 如果需要支持 UEFI,可以编译以下镜像:
make bin-x86_64-efi/ipxe.efi
  1. 编译 ISO 镜像: 如果需要将 iPXE 编译为 ISO 镜像,可以运行:
make bin/ipxe.iso

ipxe.dsk 是写入软驱用作引导盘的镜像,也可以用作虚拟机的软驱启动;

ipxe.efi 网启UEFI引导,文件比较大大约就是uefi下的ipxe.pxe,EFI引导推荐先用这个有问题就换snponly.efi; ipxe.iso 是写入光盘用作引导盘的镜像,也可以用作虚拟机的光驱启动;

ipxe.lkrn kernel相当于一个linux系统,功能更加完善,比如支持命令行操作,支持initrd等,;一般用在被GRUB,PXELINUX启动;

ipxe.pxe 网启传统引导,文件较大包含驱动多,靠自身来驱动网卡,速度快但是有概率网卡不被支持;

ipxe.usb 是写入U盘启动用的,用dd命令写;

snponly.efi 网启UEFI引导,文件小不自带驱动,大约就是uefi下的undionly.kpxe ;

*undionly.kpxe 网启传统引导,文件小不自带驱动,靠UNDI通用接口或者pxe来驱动网卡,运行速度慢但是驱动几乎100%支持,但是pxe等驱动跟需要引导的系统又有可能存在兼容等问题。

配置 iPXE

创建 iPXE 脚本

iPXE 支持通过脚本配置引导选项。创建一个脚本文件(例如 boot.ipxe):

#!ipxe
echo Welcome to iPXE Boot Menu
set boot-url http://${next-server}
menu Please choose an option:
item --key 1 centos7-install      Install CentOS 7
item --key 2 centos7-diskless     Boot CentOS 7 Diskless
choose --default centos7-diskless --timeout 5000 target && goto ${target}

:centos7-install
kernel ${boot-url}/centos7/vmlinuz
initrd ${boot-url}/centos7/initrd.img
imgargs vmlinuz initrd=initrd.img inst.repo=${boot-url}/centos7
boot

:centos7-diskless
kernel ${boot-url}/centos7-diskless/vmlinuz
initrd ${boot-url}/centos7-diskless/initrd.img
imgargs vmlinuz initrd=initrd.img root=/dev/nfs nfsroot=${next-server}:/nfs/centos7 rw
boot

部署 iPXE 到网络引导服务器

  1. 配置 DHCP 服务器: 在 DHCP 服务器中添加以下配置,将客户端引导到 iPXE:
next-server <TFTP_SERVER_IP>; # TFTP 服务器地址
filename "undionly.kpxe";      # iPXE 镜像文件名
  1. 配置 TFTP 服务器: 将编译好的 iPXE 镜像(如 undionly.kpxe)和脚本文件(如 boot.ipxe)放入 TFTP 服务器的根目录。
  2. 配置 HTTP 服务器: 如果需要通过 HTTP 加载内核和镜像,确保 HTTP 服务器能够访问这些文件。

测试 iPXE

  1. 启动客户端机器,并设置为从网络引导。
  2. 确认客户端加载 iPXE 镜像并显示菜单。
  3. 选择对应的选项,测试是否能够成功引导。

常见问题

  1. 客户端无法加载 iPXE
    1. 检查 DHCP 和 TFTP 服务器配置,确保 next-server 和 filename正确。
    2. 确认客户端网卡支持 PXE 或 网卡是否开启PXE功能(有的网卡会关闭PXE功能)
  2. iPXE 无法加载内核或镜像
    1. 检查 HTTP 或 TFTP 服务器的文件路径和权限。
    2. 确认 iPXE 脚本中的路径和文件名正确。
  3. UEFI 客户端无法引导
    1. 确保编译了 UEFI 版本的 iPXE 镜像(如 ipxe.efi)。
    2. 在 DHCP 服务器中配置 UEFI 文件名。

参考资料

  • iPXE 官方文档:https://ipxe.org/docs
  • iPXE GitHub 仓库:https://github.com/ipxe/ipxe
  • DHCP 配置指南:https://kb.isc.org/docs/isc-dhcp-44-manual-pages

通过以上步骤,您可以成功编译和配置 iPXE,并实现网络引导功能。