跳转至

链式加载 iPXE

如果你有大量已经带有 PXE 实现的机器(例如带有现有 Intel PXE ROM 的网卡),那么你可能希望避免逐一重新刷写每台机器的网卡。你可以通过使用链式加载来实现这一点。

要启用链式加载,你需要在你的 TFTP 服务器上放置一份 iPXE 副本。你的机器每次启动时都会从 TFTP 服务器下载这份 iPXE 副本。

设置 PXE 链式加载

A chain

下载 http://boot.ipxe.org/undionly.kpxe 并把它保存到你的 TFTP 服务器目录。

配置你的 DHCP 服务器分发 undionly.kpxe 作为启动文件。如果你使用 ISC dhcpd,则需要编辑 /etc/dhcpd.conf,使其包含:

  next-server X.X.X.X;
  filename "undionly.kpxe";

其中 X.X.X.X 是你的 TFTP 服务器的 IP 地址。

此时,你应该能够启动你的一台支持 PXE 的机器,并看到它从 TFTP 服务器下载 iPXE。如果一切正常,你应该会看到 iPXE 启动横幅出现:

  iPXE -- Open Source Boot Firmware -- http://ipxe.org

打破无限循环

当链式加载的 iPXE 启动时,它会发出一个新的 DHCP 请求,并启动 DHCP 服务器分发的任何内容。DHCP 服务器目前设置为分发 iPXE 镜像,这意味着你将陷入无限循环:PXE 加载 iPXE,iPXE 又加载 iPXE,再加载 iPXE……

用 autoexec 脚本打破循环

打破无限循环的最简单方法是在 TFTP 服务器上,在你的 iPXE 二进制文件旁边放置一个文件名为 autoexec.ipxe 的 iPXE 脚本。iPXE 会自动下载并执行这个脚本。

你可以把 autoexec.ipxe 脚本放在与 iPXE 二进制文件相同的目录中,或者放在 TFTP 服务器的根目录中。

如果你想消除服务器上没有 autoexec.ipxe 脚本时出现的 Not found 消息,可以把 autoexec.ipxe 创建为零长度文件。这将消除错误消息,但 iPXE 随后会继续正常启动,就像不存在 autoexec.ipxe 脚本一样。

并非所有平台都支持使用 autoexec.ipxe 脚本。你可能需要使用下面的其他方法之一。

用 DHCP 服务器打破循环

打破这个无限循环的另一种方法是配置 DHCP 服务器,使其只对第一个 DHCP 请求分发 iPXE;第二个 DHCP 请求将返回"真正的"启动文件名。

用嵌入式脚本打破循环

打破无限循环的另一种方法是构建一个带有嵌入式脚本的 iPXE,该脚本指示 iPXE 从固定的 URL 启动。例如,如果你创建脚本文件 demo.ipxe,内容如下:

  #!ipxe

  dhcp
  chain http://boot.ipxe.org/demo/boot.php

然后构建你自己的嵌入此脚本的 iPXE 版本:

  make bin/undionly.kpxe EMBED=demo.ipxe

那么链式加载的 iPXE 将始终从 http://boot.ipxe.org/demo/boot.php 启动,无论 DHCP 服务器如何配置。

UEFI

如果你有尝试执行 UEFI 网络启动的机器,那么下载 http://boot.ipxe.org/ipxe.efi 并把它保存到你的 TFTP 服务器目录。

你需要配置你的 DHCP 服务器,使其向 BIOS 机器分发 undionly.kpxe 作为启动文件,向 UEFI 机器分发 ipxe.efi 作为启动文件。如果你使用 ISC dhcpd,则编辑 /etc/dhcpd.conf,使其包含:

  option client-arch code 93 = unsigned integer 16;
  if option client-arch != 00:00 {
     filename "ipxe.efi";
  } else {
     filename "undionly.kpxe";
  }
  next-server X.X.X.X;

其中 X.X.X.X 是你的 TFTP 服务器的 IP 地址。

请注意,由于 UEFI 的根本架构限制,UEFI 网络启动往往比 BIOS 网络启动慢得多。大多数 UEFI 系统提供在 BIOS 兼容模式下执行网络启动的能力。你可能希望把你的系统升级为使用 BIOS 模式进行网络启动。