跳转至

嵌入式脚本

你可以使用嵌入式脚本改变 iPXE 的默认行为。例如,可以嵌入这样的脚本:

  #!ipxe

  dhcp
  chain http://bootserver/boot.php

这个脚本会让 iPXE 通过 DHCP 获取 IP 地址,然后从固定的 URL http://bootserver/boot.php 引导(忽略 DHCP 提供的任何引导文件名)。如果你无法重新配置 DHCP 服务器来提供合适的引导文件名,这个方法会很有用。

有几种方法可以把脚本嵌入到 iPXE 中。

Some PXE ROMs

嵌入到 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。

A disk

通过 initrd 嵌入

你可以通过向 iPXE 传递 initrd 的方式嵌入脚本。例如,要把保存为 myscript.ipxe 的脚本嵌入到一个由 GRUB 加载的 iPXE 镜像中:

  timeout 10
  default 0

  title iPXE
  kernel (hd0,0)/ipxe.lkrn
  initrd myscript.ipxe

这里使用的是标准版的 iPXE 二进制文件 ipxe.lkrnmyscript.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 ||

A boot ROM

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