我有兴趣了解有关 UEFI HTTPBoot 的更多信息,并将其设置为我的 LAN 作为网络启动选项,但细节非常稀疏。我发现的最好的文档是苏塞文档用于配置 HTTP Boot 服务器,但它缺少一些我想知道的信息。
我使用 PFSense 作为我的 DHCP/DNS 服务器。根据这个博客,PFSense 中的 HTTP 启动选项在 2.6 中可用,这是一个相当新的版本。根据博客文章,PFSense 必须配置一个特殊选项才能使其正常工作:
vendor-class-identifier “HTTPClient”
“数量”为 60。
关于 (NBP) 的启动过程或要求Network Boot Program
,或者为网络启动准备有效负载的过程的信息非常少。
有几个问题:
*.efi
是否可以指向任何支持 UEFI(并且具有文件)的 Linux 发行版进行 HTTP 引导?- 准备 NBP 的过程是怎样的?将给定发行版的 ISO 内容提取到任何 HTTP 静态服务器并指向
*.efi
URL 中的文件? - 似乎一旦加载 EFI 文件,就会启动引导加载程序?任何引导加载程序都可以工作吗?或者它是否需要专门支持 HTTPBoot?如何配置引导加载程序,以便该进程
*.efi
或其他进程理解启动该特定引导加载程序? - 根文件系统是否仅指定为 URI 文件中相对于主机的路径?
- 一旦我配置了引导加载程序,如果我想要有几个不同的可用发行版,我是否只需要在引导加载程序配置中相应地配置它们,然后我就可以选择其中一个文件
*.efi
来启动它? - 该选项是什么
vendor-class-identifier
以及与之相关的“编号”?
答案1
是否可以指向任何支持 UEFI(并且具有 *.efi 文件)的 Linux 发行版进行 HTTP 引导?
假设它的 UEFI 引导加载程序没有任何错误或其他行为会阻止它使用 HTTP 引导,我不明白为什么不这样做。
准备 NBP 的过程是怎样的?将给定发行版的 ISO 内容提取到任何 HTTP 静态服务器并指向
*.efi
URL 中的文件?
是的,这将是第一步。根据发行版,您还可以添加一些内核引导选项来告诉安装环境 a) 一旦操作系统驱动程序接管网络接口的控制,(重新)设置网络,b) 告诉安装 initramfs 在哪里可以找到任何进一步的安装程序组件(例如,squashfs 文件系统映像)(如果适用) - 这是特定于发行版的。
似乎一旦加载 EFI 文件,就会启动引导加载程序?任何引导加载程序都可以工作吗?或者它是否需要专门支持 HTTPBoot?如何配置引导加载程序,以便该进程
*.efi
或其他进程理解启动该特定引导加载程序?
UEFI 引导加载程序可以使用 UEFILoadFile
固件协议从磁盘加载文件。如果 UEFI 实现支持 HTTPBoot,则相同的固件协议也可以接受 HTTP URL。固件只需要 DHCP 服务器告诉它要加载的第一个文件的 URL - 它可以是*.efi
引导加载程序可执行文件,或者显然甚至是完整的 UEFI 可启动 ISO 映像(参见第 13 页)。
据推测,引导加载程序可以引用同一 URI 目录路径中的其他文件,就像从磁盘介质引导时引用与初始引导加载程序文件相同的目录中的其他文件一样,并且任何以正斜杠或反斜杠开头的文件路径都将被引用。被解释为使用由 DHCP 服务器给出的原始完整 URL 指定的主机名的完整 URI 路径。
根文件系统是否仅指定为 URI 文件中相对于主机的路径?
稍安毋躁。 HTTPBoot 的唯一工作是启动并运行引导加载程序,并允许它轻松地从 HTTP 服务器加载其他文件。在 Linux 启动的情况下,这些文件通常是:
- GRUB 配置文件,指定要加载的其他文件的路径(或 URI)以及默认内核引导选项
- 内核文件
- initramfs 文件(如果适用)
选择根文件系统是内核或 initramfs 的工作,而且它会发生后内核已从 UEFI 固件手中接管了系统的控制权。所以 HTTPBoot 有什么都没有与指定根文件系统有关。
关于根文件系统,HTTPBoot 本质上应该与旧式 PXE 启动没有什么不同:您可能需要一个 initramfs 来启动和配置 Linux 网络驱动程序,然后您可以使用任何方法来访问您的根文件系统。 initramfs可以支持。对于安装程序来说,它可以是从 HTTP URL 下载到本地 RAM 磁盘的 squashfs 映像;出于其他目的,如果您有理由这样做,它可能是 NFSroot。如何配置它完全取决于您使用的发行版。
一旦我配置了引导加载程序,如果我想要有几个不同的可用发行版,我是否只需要在引导加载程序配置中相应地配置它们,并且我可以选择一个 *.efi 文件来启动它?
是的,但是安全启动可能会使事情变得复杂。如果您需要shimx64.efi
安全启动支持,则单个填充程序通常只能支持其附带的发行版的签名密钥以及可选的机器所有者密钥 (MOK)。如果您无法从启动菜单链接加载到另一个发行版的 shim,则需要选择一个“主要”发行版,并使用您自己的 MOK 手动重新签署所有非主要发行版的内核和内核模块,并将您的 MOK 注册到系统 NVRAM。或者,如果您的系统允许操作固件的安全启动密钥,您可以将每个发行版的安全启动证书添加到固件安全启动白名单(UEFI NVRAM 变量db
)。
该选项是什么
vendor-class-identifier
以及与之相关的“编号”?
option vendor-class-identifier
ISC DHCP 服务器的配置语法为DHCP 选项 #60。
支持 HTTPBoot 的 UEFI 固件应在其 DHCP 请求中包含 DHCP 选项 #60,并将选项值设置为字符串HTTPClient
,就像更经典的 PXE 启动客户端将此选项设置为字符串PXEClient
+ 一些硬件/固件架构标识符一样。
DHCP 服务器可以使用它来检测支持 HTTPBoot 的客户端,并且它必须在对这些客户端的 DHCP 响应中包含相同的选项。
您链接的 SuSE 文档中的 DHCP 配置片段:
class "httpclients" {
match if substring (option vendor-class-identifier, 0, 10) = "HTTPClient";
option vendor-class-identifier "HTTPClient";
filename "http://www.httpboot.local/sle/EFI/BOOT/bootx64.efi";
}
本质上是说:“如果 DHCP 请求包含 DHCP 选项 60 且其值的前 10 个字节形成一个字符串HTTPClient
,请在答案中重复相同的选项,并将 URL 提供给bootx64.efi
旧版 BOOTP 启动文件名参数。
理论上,您还可以使用 DHCP 选项 #67(“启动文件名”)来指定启动 URL,但在实践中,我见过一些固件实现,如果指定为 DHCP 选项,则会损坏文件名/URL,但接受 BOOTP 形式的固件实现使用 - 我猜其他实现可能有相反的错误。因此,请尝试以一种方式指定 URL,如果它不能立即起作用,并且 HTTP 服务器日志或网络流量转储表明固件发出了损坏的 HTTP 请求,请尝试相反的方式。