物理服务器的配置和维护是现代IT基础设施的基本组成部分。对于运行大规模网络服务或需要高性能的专用人工智能/机器学习工作负载的组织来说,服务器部署自动化有助于提高运营效率。通过PXE进行网络引导和增强的iPXE引导是在这些场景中常用的方法。
本教程将解释PXE和iPXE技术,包括它们的工作原理以及在裸金属配置中的重要作用。本文将进一步阐述PXE和iPXE之间的区别,同时探讨配置和脚本编写方面的问题。我们将解决安全问题,并提供自动化操作系统部署的逐步设置说明。阅读完本文后,您将了解如何在您的基础设施中实现PXE或iPXE引导。
注意,本教程不仅适用于 DigitalOcean 云平台的 NVIDIA H100/H200 GPU 裸金属服务器。如果你使用了其它的裸金属服务器,都可以参考本教程进行配置。如果你的团队需要 DigitalOcean 的裸金属服务器,可联系 DigitalOcean 中国区独家战略合作伙伴卓普云的团队商谈合作、咨询迁移建议。
准备工作
- 要理解裸金属配置中的PXE引导和iPXE引导操作,需掌握IP地址分配、DHCP及TFTP协议。
- 读者应熟悉BIOS、UEFI引导机制和远程操作系统部署的网络引导协议。
- 了解PXE与iPXE的区别,以及PXE服务器与客户端的交互,对掌握配置过程至关重要。
- 了解裸金属专用服务器、自动化操作系统部署及其在大规模基础设施管理中的作用将大有裨益。
- 熟练掌握iPXE命令、Linux shell及类似Wireshark的网络工具,有助于解决PXE/iPXE配置问题。
什么是网络引导
网络引导(Netwokr Booting)使计算机能够从网络而不是本地存储设备加载其操作系统和必要组件。运营大规模服务器群的公司,尤其是裸金属专用服务器,可以使用网络引导来部署或重新配置操作系统。
什么是PXE
PXE代表预引导执行环境。这种网络引导协议采用客户端-服务器模型,使客户端能够通过网络获取其引导加载程序和附加文件。英特尔在1998年将PXE引入作为行业标准技术。它允许计算机通过网络卡启动引导过程,然后再访问安装操作系统的本地存储设备。这种能力使数据中心和裸金属服务器环境受益,通过允许服务器配置而无需手动部署CD或USB驱动器。
什么是iPXE
iPXE是一种开源网络引导固件解决方案,提供了超出标准PXE功能的实质性改进。它从gPXE发展而来,而gPXE最初是Etherboot的一个分支。iPXE提供了传统PXE实现中缺乏的高级功能。iPXE的GitHub存储库包含其源代码和文档。其高度可配置性允许开发人员将其编译成多种格式,包括EFI(可扩展固件接口)应用程序和PXE映像。他们还可以将其嵌入到网络接口卡(NIC)的只读存储器(ROM)中。
PXE/iPXE引导的核心组件
PXE和iPXE都有一些基本组件。让我们考虑其中的一些组件:
- 动态主机配置协议(DHCP):DHCP服务器分配IP地址并指示在哪里可以找到引导文件。
- 引导加载程序:客户端在引导时加载的初始软件。它可以包括PXE系统的pxelinux.0和iPXE系统的ipxe.lkrn或undionly.kpxe。
- 引导配置文件:这些配置文件指定要加载的内核和initramfs(初始RAM磁盘)以及必要的引导选项和环境变量。
- 操作系统镜像/安装介质:这些是在裸金属硬件上安装操作系统所需的 essential 文件。
- PXE服务器:PXE服务器向客户端提供引导配置文件。
- 简单文件传输协议(TFTP):TFTP是一种 minimal 文件传输协议,专为引导目的而设计。
- 网络引导程序(NBP):客户端软件启动引导过程。
有了这些组件,您可以管理需要 minimal 人工干预的复杂配置过程。因此,它可以让您高效、可靠地维护裸金属专用服务器配置。
PXE的工作原理
PXE引导需要客户端固件、DHCP服务器、TFTP服务器以及其他提供实际操作系统文件的服务器之间的同步协作。以下是典型的PXE引导工作流程的逐步说明:
客户端PXE请求
当配置为网络引导的机器启动时,其网络接口卡(NIC)固件(PXE ROM)将接管。NIC发送一个DHCP发现广播消息,表明其支持PXE引导功能(这是通过在消息中嵌入特定于PXE的DHCP选项来实现的)。客户端请求网络配置服务,并打算启动PXE引导。
DHCP提供 + PXE信息
在接收到请求后,网络DHCP服务器(或代理DHCP服务)回复一个DHCP提供消息,其中包含网络详细信息和分配的IP地址。它还包括PXE引导信息:网络详细信息包括PXE引导服务器名称(通常与TFTP服务器地址匹配)和引导文件标识符(通常称为NBP或网络引导程序)。例如,DHCP回复说:“分配IP地址11.1.1.5,从服务器11.1.1.1获取引导文件pxelinux.0。”
客户端通过TFTP下载NBP
一旦客户端确定了正确的引导文件位置,它将使用简单文件传输协议(TFTP)从引导服务器检索文件。NBP文件可能是一个轻量级引导加载程序,如PXELINUX(来自Syslinux),一个iPXE映像,或作为Windows部署服务(WDS)等。
执行NBP
客户端将NBP下载到内存后,PXE固件将控制权交给NBP。NBP继续加载实际的操作系统或安装程序。如果PXELINUX作为NBP,它将通过TFTP检索一个PXELINUX配置文件,以显示引导菜单或直接开始加载Linux内核,使用initrd映像。
操作系统加载
这个最终阶段的具体情况完全取决于网络引导程序(NBP)的性质。主要目标是将目标操作系统(OS)内核加载到内存中执行,并在需要时加载初始RAM磁盘(initrd)。PXE引导过程通常需要NBP或第二阶段引导加载程序通过TFTP下载操作系统内核和initrd文件。一旦操作系统接管,网络引导过程即视为完成。
iPXE如何增强了PXE
iPXE增强了基本的PXE,提供了一个更强大且更用户友好的解决方案。使用iPXE主要有两种方式:
本机iPXE配置
这涉及将网络接口卡(NIC)的固件或ROM替换为iPXE。相比之下,链式加载iPXE利用原始PXE固件作为第二阶段加载iPXE。一旦iPXE在客户端设备上开始运行,它提供了以下功能:
- 扩展协议支持:除了TFTP,iPXE还支持HTTP、FTP、iSCSI、FCoE等协议。
- 高级脚本编写:PXE的脚本引擎允许用户编写引导脚本,用于执行复杂任务,如条件引导、菜单系统和动态配置文件检索。
- 嵌入式引导脚本:将脚本嵌入iPXE二进制文件中,允许您实现完全自动化的引导过程,无需依赖其他配置文件。
- 安全性和身份验证:结合HTTPS支持、802.1x身份验证和加密检查,允许在高安全环境中进行安全的引导操作。
- 直接从云存储引导:iPXE允许通过各种通信协议从远程资源加载内核或操作系统映像。
- 增强的调试和命令:内置命令(如链式加载、imgfetch、自动引导等) enables 对引导过程的高级控制。
简而言之,当需要高级网络引导选项时,iPXE是比PXE的更好的替代品。
示例:使用iPXE引导自定义Linux环境
您可以使用iPXE创建如下所示的脚本:
#!ipxe
dhcp # 获取网络配置
kernel http://192.168.1.10/boot/vmlinuz initrd=initrd.img ro console=ttyS0
initrd http://192.168.1.10/boot/initrd.img
boot
该脚本指示iPXE获取DHCP地址,并通过HTTP从服务器下载内核和initramfs文件,然后启动引导过程。该过程类似于PXE引导,但使用HTTP,并增强了控制能力和允许轻松包含内核命令行参数,如console=ttyS0
(控制台输出定向到串行端口ttyS0)。
PXE与iPXE的区别
尽管PXE和iPXE的目标相似(基于网络的引导),但在功能和能力方面存在显著差异。以下是对比:
功能 | PXE(传统) | iPXE |
---|---|---|
来源 | 固件(通常是封闭源代码的供应商网络接口卡ROM) | 开源(可以替代或从PXE链式启动) |
引导协议 | 仅支持DHCP + TFTP | 支持DHCP + TFTP、HTTP、HTTPS、iSCSI、FTP、NFS等 |
文件传输速度 | 使用TFTP(基于UDP,对于大文件可能较慢) | 可以使用HTTP/HTTPS(基于TCP,传输速度更快) |
引导介质支持 | 需要支持PXE的网络接口卡固件 | 可以通过网络接口卡(PXE或本机)、USB/CD(作为.iso文件)等引导 |
脚本和逻辑 | 无(因为引导过程是固定的) | 是的,支持脚本编写、条件逻辑、菜单等 |
扩展功能 | 仅限基本网络引导 | 支持Wi-Fi、VLAN、IPv6和身份验证功能 |
UEFI兼容性 | 支持UEFI PXE(通过EFI规范网络引导) | 支持UEFI(通过ipxe.efi),包括HTTP引导集成 |
维护者 | 供应商特定(如英特尔等),规范是开放的 | 社区驱动的开源项目 |
PXE 在涉及小型镜像的简单引导过程中表现出色。当涉及到大规模部署或云集成需求,以及依赖高级脚本功能的用户时,iPXE 显得尤为突出。
通过使用 iPXE 脚本,你可以通过集成脚本来检测硬件类型、选择正确的操作系统安装程序或显示引导菜单,从而实现引导过程的自动化。
与硬件和 UEFI 的交互
从传统 BIOS 向 UEFI 的过渡增强了安全性和模块化设计。尽管 PXE(预引导执行环境)和 iPXE 都与 UEFI 兼容,但仍有一些关键差异需要考虑:
- UEFI PXE 引导:与使用 .pxe 或 .kpxe 文件进行网络引导的旧版 BIOS 不同,UEFI 需要一个 .efi 应用程序。
- 链式引导:某些配置允许通过 UEFI 进行 PXE 引导,然后继续链式加载 iPXE 以扩展功能。
- 本机 iPXE EFI 二进制文件:用户可以直接在 UEFI 环境中引导 iPXE,因为它提供了与 UEFI 兼容的二进制文件(如 ipxe.efi),从而消除了链式加载的需要。
重要的是要检查硬件系统是否支持 UEFI PXE 或 iPXE 引导。在 GPU 裸金属服务器环境中,运行专用的人工智能/机器学习工作负载和优化的引导解决方案可以提高配置效率。为 GPU 密集型任务分配投资的组织必须优先考虑 UEFI 支持,以利用所有现代服务器主板功能。
为裸金属服务器设置 PXE 和 iPXE
现在我们了解了 PXE 和 iPXE 的工作原理,是时候为裸金属配置配置 PXE/iPXE 环境了。我们将先配置一个 PXE 服务器,然后集成 iPXE 以实现高级网络引导。
设置 PXE/iPXE 环境的前提条件
- 要设置 PXE/iPXE 环境,请从强大的网络基础设施开始。将所有服务器保持在同一局域网(LAN)上,或者如果在不同子网上进行引导,则设置 DHCP 中继。使用 VLAN 可以帮助提高安全性。
- 检查裸金属服务器是否可以在 BIOS/UEFI 设置中处理 PXE,并且是否已启用网络引导。
- 配置 DHCP 服务器以分配 IP 地址并指定引导文件位置,同时 TFTP 服务器将传输这些引导文件。
- 对于 iPXE,HTTP 服务器将高效地提供脚本和操作系统镜像。
- 收集必要的引导文件,如 pxelinux.0、bootx64.efi 和 ipxe.efi,以及你的操作系统安装镜像。
- 为了保持顺利运行,请使用具有静态 IP 的专用 PXE 服务器机器来托管 DHCP、TFTP 和 HTTP 服务,用于网络引导。
最佳实践:记录你的网络环境(如 IP 范围和服务器 IP)。在将 PXE 设置部署到生产服务器之前,使用测试机进行实验也是一个好主意。
设置 PXE 服务器
设置 PXE 服务器涉及两个关键角色:
- DHCP 响应引导请求,提供必要的网络详细信息,并指定引导文件。
- TFTP 负责将引导文件发送给客户端。
以下是如何将这些组件设置好的简单指南:
安装并配置带有 PXE 选项的 DHCP
如果你还没有为 PXE 配置 DHCP 服务,现在是时候安装一个了。例如,如果你使用的是基于 Debian 或 Ubuntu 的 Linux 服务器,可以安装 ISC DHCP 服务器:
sudo apt update && sudo apt install isc-dhcp-server
在基于 Red Hat 的系统上,可以通过 dnf 或 yum 安装 dhcp-server。确保 DHCP 服务已启用,并将在启动时运行。
基本 DHCP 配置: 开始编辑配置文件,例如 ISC DHCP 的 /etc/DHCP/dhcpd.conf
。你必须定义网络的子网、IP 范围、网关、DNS 设置以及任何特定于你的配置的内容。为了支持通过引导协议(BOOTP)或 PXE 进行引导,检查 DHCP 服务器是否需要添加诸如 allow booting; allow bootp;
之类的行。例如:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.50 192.168.1.100;
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
...
}
配置 PXE 特定选项
在你的子网的 DHCP 配置中,包含 PXE 引导文件和 TFTP 服务器。
- 选项 66(下一服务器): 这里指定 TFTP 服务器的 IP 地址。它通常与 PXE 服务器相同。使用 ISC DHCP 时,你可以通过
next-server 192.168.1.10;
来设置(只需替换为你自己的 TFTP 服务器 IP)。 - 选项 67(引导文件名): 这里,你将提供客户端从 TFTP 服务器下载的文件名。对于使用 BIOS 的 PXELINUX 客户端,可以使用 pxelinux.0。对于 UEFI 客户端,可以是 EFI 加载程序(如用于 x86_64 UEFI 的 bootx64.efi)。在你的 ISC DHCP 配置中,使用
filename pxelinux.0;
(它在子网或主机组内定义)。
如果你有同时使用 BIOS 和 UEFI 的客户端,最好的做法是根据 DHCP 架构类型对它们进行区分。例如,可以实现条件语句来实现此目的:
if option arch = 00:07 {
filename "bootx64.efi"; # UEFI x86-64
} else {
filename "pxelinux.0"; # BIOS
}
这确保了每个客户端都能获得正确的引导加载程序。(对于架构代码,00:07 指的是 x64 UEFI,00:06 是用于 x86 UEFI,而 00:00 或 00:09 表示 BIOS 等)。
启动 DHCP 服务: 保存配置后,启动 DHCP 服务。例如,可以使用 sudo systemctl start isc-dhcp-server
。然后,检查系统日志(如 /var/log/syslog
或 /var/log/messages
)以确认它是否顺利启动且没有错误。
安装并配置 TFTP 服务器
在 PXE 服务器(或你设置为 TFTP 服务器的任何服务器)上安装 TFTP 服务。如果你使用的是 Ubuntu 或 Debian,只需运行以下命令:
sudo apt install tftpd-hpa
如果你在 RHEL 或 CentOS 上,可以尝试以下命令:
sudo dnf install tftp-server
确保 TFTP 服务(或 xinetd 如果使用 xinetd)已启用。修改防火墙设置以允许 TFTP 流量通过(以防万一,UDP 端口 69)!
TFTP 根目录:现在,你必须确定 TFTP 根目录。根据系统配置,TFTP 根目录通常位于 /var/lib/tftpboot
或 /tftpboot
。如果它不存在,可以通过运行以下命令轻松创建:
sudo mkdir -p /var/lib/tftpboot
只要记得设置正确的权限,以便每个人都能读取它即可。TFTP 客户端需要在没有特定用户账户的情况下访问文件。你可以使用以下命令来处理权限:
sudo chmod -R 755 /var/lib/tftpboot
这样,通常以用户 nobody 身份运行的 TFTP 服务器将能够访问该目录。
获取 PXE 引导文件:接下来,将引导加载程序文件复制到 TFTP 根目录。如果你使用的是来自 Syslinux 项目的 PXELINUX,你需要一些必备文件:
- pxelinux.0:这是 BIOS 客户端的主要 PXE 引导加载程序。
- 其他重要文件包括 ldlinux.c32、libcom32.c32、libutil.c32,以及如果你喜欢菜单界面的 menu.c32 或 vesamenu.c32 等菜单模块。这些文件通常随 Syslinux 包提供。当你在大多数 Linux 发行版上安装 syslinux 或 syslinux-common 包时,这些文件通常位于 /usr/lib/PXELINUX/ 目录中。只需将它们复制到 tftpboot 目录即可。如果你使用的是 Red Hat,你可以直接从 Syslinux RPM 中提取它们。
- 如果你需要 UEFI 引导加载程序,获取 syslinux.efi 或 iPXE EFI 二进制文件,特别是如果你计划从一开始就使用 iPXE 进行 UEFI 引导。
- 可选地,其他工具如 undionly.kpxe(用于链式引导的 BIOS 二进制文件)或 wimboot(用于 Windows PE 引导)。这将取决于使用情况。
设置 PXELINUX 配置:
PXELINUX 会在 TFTP 根目录下的 pxelinux.cfg 目录中查找配置。让我们创建该目录:
mkdir -p /var/lib/tftpboot/pxelinux.cfg
接下来,创建一个默认配置文件,如下所示:/var/lib/tftpboot/pxelinux.cfg/default。在这个文件中,你将设置 PXE 引导菜单或任何必要的设置。例如:
DEFAULT menu.c32
PROMPT 0
TIMEOUT 600
MENU TITLE PXE Boot Menu
LABEL linux
MENU LABEL Install Linux OS
KERNEL images/linux/vmlinuz
APPEND initrd=images/linux/initrd.img ip=dhcp inst.repo=http://192.168.1.10/os_repo/
LABEL memtest
MENU LABEL Run Memtest86+
KERNEL images/memtest86+-5.31.bin
LABEL local
MENU LABEL Boot from local disk
LOCALBOOT 0
PXE 引导菜单设置为通过网络引导,并使用多个选项使用 Syslinux(menu.c32)。在自动选择默认选项之前,你将有 600 秒的倒计时。菜单提供三个选项:
- 安装 Linux,这将加载内核(vmlinuz)和初始 RAM 磁盘(initrd.img),同时从 HTTP 仓库下载安装文件(inst.repo)。
- 使用 memtest86±5.31.bin 进行内存检查的 Memtest86+。
- 从本地磁盘引导(LOCALBOOT 0)将退出 PXE 并启动已安装在机器上的操作系统。
确保根据你的环境调整路径(例如,你可能会将内核和 initrd 存储在 tftpboot 下的 images 文件夹中,同时为 OS 文件保留 HTTP 仓库)。KERNEL 行指向网络引导内核。此外,APPEND 行包含 initrd 和任何必要的内核参数,例如安装程序的位置或 Kickstart 文件。
注意:KERNEL 和 INITRD(使用 APPEND)的路径基于 TFTP 根目录,除非你指定了不同的协议(如 http://)。只需确保这些文件在 TFTP 目录中或按指示可访问即可。例如,images/linux/vmlinuz 实际上指向服务器上的 /var/lib/tftpboot/images/linux/vmlinuz。
如果需要,为 OS 文件设置 NFS 或 HTTP:如果你的操作系统安装程序需要仓库(如完整的发行版树或 ISO),你应该通过 NFS 或 HTTP 提供它。例如,你可以挂载 ISO 并通过 HTTP 共享,以便安装程序可以访问和检索必要的软件包。
启动/重启 TFTP 服务:上传文件后,重启 TFTP 服务以确保它识别新文件。例如,可以运行:
sudo systemctl restart tftpd-hpa
通常,TFTP 在获取新文件时不需要重启,因为它每次请求都会直接从磁盘检索文件。然而,确认服务正常运行是明智之举。
至此,你已经完成了基本的 PXE 服务器配置。当客户端使用 PXE 启动时,DHCP 服务器将分配 IP 地址并指定引导文件(如 pxelinux.0)。客户端将从 TFTP 服务器获取此文件并加载 PXELINUX 引导加载程序。从那里开始,它将读取配置,显示菜单选项,并继续进行操作系统安装。
安装并配置 iPXE
我们将探讨通过 PXE 链式加载 iPXE,这与我们之前讨论的设置非常契合。
下载或编译 iPXE
你可以通过以下方法获取 iPXE 二进制文件:
- 预编译二进制文件:为了快速实验,iPXE 项目提供了一个预编译的 ISO 镜像,可以轻松获取。此外,还可以从源代码构建 undionly.kpxe 和 ipxe.efi 等二进制文件。
- 从源代码编译:为了获取最新功能或遵循自定义过程(如嵌入脚本或启用 HTTPS),从源代码编译 iPXE。首先,你需要安装一些构建工具(如 make、gcc、Perl 等)。
例如,在基于 Debian/Ubuntu 的系统上:
sudo apt install -y git make gcc binutils perl liblzma-dev mtools
git clone https://github.com/ipxe/ipxe.git
cd ipxe/src
# 构建 BIOS PXE 二进制文件:
make bin/undionly.kpxe
# 构建 UEFI PXE 二进制文件(x86_64):
make bin-x86_64-efi/ipxe.efi
构建成功后,你将在 bin/ 或 bin-x86_64-efi/ 目录中找到二进制文件。如果你想在二进制文件中包含启动脚本,请在 make 命令中添加 EMBED=script.ipxe。
配置 DHCP 以链式加载 iPXE
现在,为了在引导过程中使用 iPXE,你将按照上述部分中解释的方式配置 DHCP 设置:
- BIOS 客户端将通过 TFTP 下载 undionly.kpxe(这是适用于 BIOS 的 iPXE 固件),而不是直接跳转到 PXELINUX。
- 对于 UEFI 客户端,他们可以直接加载 ipxe.efi。
更新 DHCP 文件名和相关选项:
- 对于 BIOS,将文件名设置为“undionly.kpxe”(确保下一服务器仍然指向托管此文件的 TFTP 服务器)。
- 对于 UEFI,将文件名设置为“ipxe.efi”;对于 x86_64 UEFI(你可以根据需要更改架构)。
避免循环:其中一个挑战是避免陷入 iPXE 不断重复加载自身的循环。当 iPXE 启动时,它会发送自己的 DHCP 请求。如果 DHCP 服务器响应 undionly.kpxe 或 ipxe.efi,你将陷入无尽循环。
配置 DHCP 服务器以识别 iPXE 客户端以打破此循环。
默认情况下,iPXE 使用用户类标识符“iPXE”。如果你使用的是 ISC DHCP,可以利用这一点来区分第二阶段请求。例如:
if exists user-class and option user-class = "iPXE" {
filename "http://192.168.1.10/";
} else {
filename "undionly.kpxe";
}
在上述示例中,我们处理的是名为“iPXE”的客户端。与其通过 TFTP 获取另一个引导文件,它将直接发送到 HTTP URL,具体来说是一个自定义的 iPXE 脚本。尚未切换到 iPXE 的客户端(初始的 BIOS PXE 引导)将接收 undionly.kpxe 以进行链式加载。如果你处理的是 UEFI,请采用类似的方法:提供 ipxe.efi 并配置它通过 HTTP 加载脚本。
确保更新 DHCP 设置并重新启动服务。别忘了将新的 undionly.kpxe 和 ipxe.efi 文件放入 TFTP 根目录。现在流程如下:
- BIOS 客户端启动 PXE 引导。
- 它从 TFTP 下载 undionly.kpxe。
- iPXE 接管后续流程。
- iPXE 发出第二个 DHCP 请求,提供 ** URL。
- iPXE 对该 URL 进行 HTTP GET 以获取引导脚本。
设置 iPXE 的 HTTP 服务器
现在既然我们让 iPXE 通过 HTTP 获取引导脚本(可能还有一些其他文件),让我们来配置一个 HTTP 服务器:
安装 HTTP 服务器
你可以在 PXE 服务器或其他任何机器上进行安装,但为了简单起见,我们继续使用 PXE 服务器。安装如 Apache 或 Nginx 等 Web 服务器。例如,在 Ubuntu 上,你可以运行以下命令:
sudo apt install apache2
确保服务器正在运行,并且可以从目标网络访问。如果需要,请在防火墙中打开 80 端口。
创建 iPXE 脚本文件:这将是你在 DHCP 配置中引用的文件。在 /var/www/html/
目录下创建一个文件,并在其中编写 iPXE 命令。至少,此文件可以链式加载到另一个脚本或直接加载操作系统安装程序。一个基本的配置可能会提示 iPXE 显示菜单或启动安装程序。
#!ipxe
kernel http://192.168.1.10/os_install/vmlinuz initrd=initrd.img nomodeset ro
initrd http://192.168.1.10/os_install/initrd.img
boot
此示例(非交互式)指示 iPXE 通过 HTTP 下载内核和 initrd 并引导它们。
托管操作系统安装文件(如果需要):在继续之前,请确保 iPXE 能够访问必要的操作系统安装文件,例如内核、initrd 或完整的 ISO 仓库。iPXE 可以检索内核和 initrd 文件。这些重要文件应位于 Web 服务器的主目录或子目录中。
例如,将 Linux 发行版安装文件 vmlinuz 和 initrd.img 复制到目录 /var/www/html/os_install/
。iPXE 可以通过 HTTP 检索大型文件,例如 Windows PE 映像或 Linux ISO,并将它们加载到内存中或传递给引导加载程序。
测试 HTTP 访问:通过从另一台机器或使用 curl 命令进行检索测试,验证 Web 服务器是否正常工作。
创建 iPXE 引导脚本
脚本编写能力是 iPXE 最强大的功能之一。iPXE 脚本编写过程涉及编写一个包含一系列 iPXE 命令的文本文件,这些命令从 shebang 行 #!ipxe 开始。通过脚本,可以创建菜单、自动化操作系统选择,并传递内核参数以完全自动化部署过程。
iPXE 脚本基础
以下命令可以在 iPXE 脚本中实现:
- kernel:选择应下载并执行的内核或引导程序。
- initrd:允许定义要下载的初始 ramdisk。
- boot:用于使用指定的 initrd 启动加载的内核。
- chain:允许脚本将引导控制权转移给另一个脚本或引导程序。
- 流程控制命令,如 goto、ifopen,以及与菜单相关的命令,如 menu、item 和 choose,以启用交互式决策。
- 嵌入式 iPXE 脚本可以使用 chain 命令通过指定相应的服务器 URL 加载 boot.ipxe。
示例:交互式引导菜单脚本
在你的网络服务器上创建一个脚本文件(如 menu.ipxe),或者直接将其嵌入 iPXE。例如:
#!ipxe
console --x 1024 --y 768 # 设置控制台分辨率(可选)
menu iPXE 引导菜单
item --key u ubuntu 安装 Ubuntu 22.04
item --key m memtest 运行 Memtest86+
choose --timeout 5000 target || goto cancel
:ubuntu
kernel http://192.168.1.10/boot/ubuntu/vmlinuz initrd=initrd.img autoinstall ds=nocloud-net;s=http://192.168.1.10/ubuntu-seed/
initrd http://192.168.1.10/boot/ubuntu/initrd.img
boot
:memtest
kernel http://192.168.1.10/boot/memtest86+
boot
:cancel
echo 引导已取消或超时。正在重启...
reboot
此 iPXE 脚本创建了一个引导菜单,允许用户启动 Ubuntu 安装或使用 Memtest 进行诊断。脚本配置了控制台分辨率,并显示了选项,用户可以通过按下“u”键启动 Ubuntu 安装,按下“m”键启动 Memtest。如果用户在5秒内未进行选择,系统将取消进程并重启。Ubuntu 引导选项通过 HTTP 启动内核和 initrd 的加载,并通过 nocloud-net 启用自动化安装。Memtest 选项从同一服务器加载内存测试工具。此整个网络操作远程运行,无需与机器进行物理交互,这就是裸金属配置的核心。
网络引导的安全影响和缓解措施
网络引导配置不当可能会产生潜在的安全漏洞。攻击者可能会冒充 DHCP 或 TFTP 服务器,向客户端发送有害映像。以下是一些最佳实践:
- 使用独立的 VLAN:确保你的生产网络与引导网络隔离。
- 使用支持 HTTPS 的 iPXE:iPXE 支持从使用 HTTPS 的服务器进行网络引导,以保持流量加密。
- 启用客户端身份验证:iPXE 脚本允许与安全协议集成,如用户名/密码身份验证或基于证书的验证。
- 配置安全引导:在使用 UEFI 固件的系统上启用安全引导。尽管这会增加额外的复杂性,但可以阻止未经授权的引导程序运行。
- DHCP 侦听:在某些环境中,实现 DHCP 侦听的网络交换机可以阻止未经授权的 DHCP 服务器分发地址和有害的引导指令。
常见问题和故障排除技巧
使用 PXE/iPXE 时,您会遇到典型问题。下表列出了问题及故障排除技巧:
问题 | 故障排除技巧 |
---|---|
未触发 PXE 引导 | 检查 BIOS/UEFI 设置。确保网络适配器已启用引导,并且在引导顺序中高于磁盘。 |
未收到 DHCP 提供(PXE-E51) | 确保 DHCP 服务器正在运行且可访问。如果在不同子网上,配置 DHCP 中继(IP 帮助程序)。 |
PXE 下载失败 / TFTP 超时(PXE-E32) | 检查 TFTP 服务器是否在运行,文件路径是否正确,以及防火墙规则是否允许 TFTP 流量。 |
无限引导循环(iPXE 链式加载) | 确保 DHCP 为 iPXE 提供不同的文件名,或使用嵌入式 iPXE 脚本链式加载到 HTTP URL。 |
iPXE 命令失败 | 验证 URL 或文件名。在浏览器中测试 HTTP 链接,并使用 TFTP 客户端测试 TFTP 文件。 |
UEFI 引导问题 | 确保使用正确的二进制文件(对于 UEFI,使用 ipxe.efi)。检查安全引导设置以及与引导文件的兼容性。 |
TFTP 访问被拒绝 | 确保 TFTP 文件具有正确的权限,并且位于服务器的 TFTP 目录中。 |
PXE 引导速度慢 | 为了提高速度,使用 iPXE 通过 HTTP/HTTPS 加载引导文件,而不是 TFTP。 |
PXE VLAN 配置错误 | 检查 PXE VLAN 是否正确标记,并且 DHCP 中继已配置为传递数据包。 |
客户端架构不匹配 | 确保 BIOS 客户端接收 BIOS 引导文件,UEFI 客户端接收兼容 UEFI 的引导文件。 |
PXE 引导的故障排除较为复杂,因为它依赖于多个互联系统,包括客户端、DHCP 服务器和 TFTP 服务器。通常可以通过检查每个阶段来定位问题(例如:是否获取了 IP 地址?是否下载了文件?文件是否成功执行?)。
微软关于调试 PXE 问题的文档以及 Wireshark 等用于捕获 DHCP/TFTP 交互信息的工具,对于高级故障排除非常有帮助。
FAQ
如何安装裸金属服务器?
你需要设置一个PXE服务器或iPXE引导环境,并将服务器的BIOS或UEFI设置为网络引导,同时从网络资源中获取操作系统安装程序。操作系统安装可以完全自动化,也可以采用手动和自动相结合的方式进行。
iPXE与PXE有何区别?
PXE是传统的网络引导标准,基于TFTP协议运行。而iPXE作为增强型的开源网络引导解决方案,支持现代协议,如HTTP/HTTPS、iSCSI以及脚本编写功能。
什么是iPXE文件?
iPXE文件可以是来自iPXE GitHub仓库的脚本或编译后的引导加载程序二进制文件。脚本包含从网络获取并引导镜像的指令集。以二进制形式存在时,iPXE通常作为独立版本或可链式加载的版本运行。
PXE引导代表什么?
预引导执行环境(PXE)是一种引导技术,允许计算机通过网络接口引导,无需依赖本地存储设备或已安装的操作系统。
PXE和gPXE有何区别?
gPXE从Etherboot发展而来,通过添加网络引导协议来增强PXE功能。iPXE是gPXE的进一步发展,它取代了gPXE,同时保持了持续的开发工作。
在IT领域,PXE代表什么?
在IT领域,PXE指的是英特尔创建的预引导执行环境规范,用于实现基于网络的引导。
iPXE是引导加载程序吗?
iPXE作为引导加载程序运行,可以通过多种网络协议加载内核、initrd和磁盘镜像。
iPXE命令行是什么?
启动iPXE后,它会提供一个命令行界面,使你能够执行诸如dhcp、ifstat、chain、boot等命令。该界面为实时调试和高级配置任务提供了广泛的功能。
PXE和UEFI有何区别?
PXE是一种网络引导协议,而UEFI(统一可扩展固件接口)是一种替代传统BIOS的现代固件。UEFI具备内置的网络堆栈功能,支持通过PXE和HTTP协议进行网络引导。
PXE是什么,它是如何工作的?
PXE是一种网络引导协议,允许客户端通过DHCP分配IP地址,并通过TFTP下载引导加载程序,从而从服务器加载操作系统。引导过程从DHCP广播开始,该广播将请求引导至TFTP服务器,然后下载引导加载程序以继续进行操作系统安装或加载。
iPXE与PXE有何不同?
iPXE通过支持新协议(如HTTP、HTTPS、iSCSI等)、脚本引擎和更好的性能,扩展了PXE的功能。
使用iPXE脚本有哪些好处?
- 自动化:可以实现复杂逻辑,减少手动干预的需要。
- 动态引导选择:系统可以根据检测到的硬件规格、MAC地址信息或用户输入,自动选择要加载的操作系统镜像。
- 安全性:通过HTTPS集成确保镜像的安全下载,并对用户进行身份验证。
PXE和iPXE能否用于混合云环境?
PXE和iPXE技术在混合云和多云环境中得到了应用。组织通常利用它们快速部署本地裸金属服务器,并管理基于云的自动扩展组,以应对临时工作负载峰值。
如何排查PXE引导问题?
- 检查 DHCP:DHCP服务器应正常运行并正确分配IP地址。
- 查看 TFTP 日志:TFTP需要精心配置,因为它需要准确的文件路径和适当的权限才能正确运行。
- 防火墙配置:确保必要的TFTP和DHCP端口保持开放。
- UEFI 与BIOS:在继续之前,检查引导文件是否与固件类型相对应。
总结
网络引导是现代IT系统的基础,特别是在配置裸金属服务器和部署专用基础设施时。通过使用PXE和iPXE引导,组织可以实现操作系统的自动化部署,优化服务器配置,并高效管理其基础设施。
对于裸金属服务器的网络引导,IT专业人员需要了解PXE和iPXE之间的差异、PXE服务器的配置以及自动化操作系统部署的实现方法。本指南详细介绍了配置步骤、安全影响,并提供了故障排除方法,以帮助组织实施可扩展且安全的网络引导解决方案。通过正确的PXE/iPXE配置,企业可以实现高效的裸金属服务器配置,同时提升其IT运营性能。
最后,如果你的团队在寻找价格实惠、性能稳定的 GPU 裸金属服务器,欢迎联系咨询 DigitalOcean 中国区独家战略合作伙伴卓普云。