嵌入式脚本¶
你可以使用嵌入式脚本改变 iPXE 的默认行为。例如,可以嵌入这样的脚本:
#!ipxe
dhcp
chain http://bootserver/boot.php
这个脚本会让 iPXE 通过 DHCP 获取 IP 地址,然后从固定的 URL http://bootserver/boot.php 引导(忽略 DHCP 提供的任何引导文件名)。如果你无法重新配置 DHCP 服务器来提供合适的引导文件名,这个方法会很有用。
有几种方法可以把脚本嵌入到 iPXE 中。

嵌入到 iPXE 二进制文件中¶
在构建 iPXE 时,你可以使用 EMBED=... 构建参数把脚本嵌入到 iPXE 二进制文件中。例如,要把保存为 myscript.ipxe 的脚本嵌入到一个可链式加载的 iPXE 镜像中:
make bin/undionly.kpxe EMBED=myscript.ipxe
这会生成一个包含你的嵌入式脚本的定制版 iPXE 二进制文件 undionly.kpxe。
这个方法适用于所有 iPXE 二进制格式(.rom、.iso、.kpxe 等等)。要修改嵌入式脚本,需要重新构建 iPXE 二进制文件。
通过命令行嵌入¶
你可以通过向 iPXE 传递命令行的方式嵌入脚本。例如,要把脚本嵌入到一个由 GRUB 加载的 iPXE 镜像中:
timeout 10
default 0
title iPXE
kernel (hd0,0)/ipxe.lkrn dhcp && chain http://bootserver/boot.php
这里使用的是标准版的 iPXE 二进制文件 ipxe.lkrn。只需编辑 GRUB 配置文件即可修改嵌入式脚本,无需重新构建 iPXE 二进制文件。
这个方法只适用于支持命令行的 iPXE 二进制格式,例如 .lkrn。
注意,你可能需要对某些特殊字符进行转义,才能让它们传递给 iPXE。

通过 initrd 嵌入¶
你可以通过向 iPXE 传递 initrd 的方式嵌入脚本。例如,要把保存为 myscript.ipxe 的脚本嵌入到一个由 GRUB 加载的 iPXE 镜像中:
timeout 10
default 0
title iPXE
kernel (hd0,0)/ipxe.lkrn
initrd myscript.ipxe
这里使用的是标准版的 iPXE 二进制文件 ipxe.lkrn。myscript.ipxe 文件就是一个普通的 iPXE 脚本文件,不需要使用 mkinitrd 之类的工具。
你可以通过编辑 myscript.ipxe 文件来修改嵌入式脚本,无需重新构建 iPXE 二进制文件。
这个方法只适用于支持 initrd 的 iPXE 二进制格式,例如 .lkrn。
"Press Ctrl-B" 提示符¶
嵌入脚本之后,启动时或引导失败时将不再出现 "Press Ctrl-B for the iPXE command line" 提示。[^1]
如果你希望给用户提供进入 iPXE 命令行的机会,可以使用 prompt 命令提供自己的替代提示。例如:
prompt --key 0x02 --timeout 2000 Press Ctrl-B for the iPXE command line... && shell ||

[^1]: 如果你使用的是 iPXE ROM,那么在加电自检(POST)期间仍然会出现最初的 "Press Ctrl-B to configure iPXE" 提示。如果你想禁用这个初始提示,可以编辑文件 config/general.h,加入以下行:\<code> #define BANNER_TIMEOUT 0\</code>