我如何询问定义的服务器要启动什么

我如何询问定义的服务器要启动什么

有哪些选项可用于完成以下引导场景?

启动时(启动前)联系定义的网络服务器并询问启动什么(正常答案:从本地硬盘驱动器启动;替代答案:启动映像 XYZ)

目标是能够重新安装客户端,而无需在客户端进行用户交互。执行此操作的逻辑方法是 PXE 引导,但由于我们无法控制默认为常规引导的环境,因此 PXE 是不安全的,因为它会打开攻击向量。

到目前为止,我发现并尝试过以下内容:从本地硬盘驱动器启动 Grub2 并链式加载 iPXE。然后 iPXE 通过 http 联系定义的 Web 服务器并获取 iPXE 脚本。但从那里我还没有找到从本地驱动器启动的方法(除了再次启动 Grub 并以无限循环结束)。我想要启动的操作系统位于启动 Grub/iPXE 的同一硬盘的分区 2 上。

  1. 有没有其他方法可以实现我们想要实现的目标?
  2. 有没有办法告诉 Grub 在第二次启动时选择不同的选项(从 iPXE 返回)或告诉 iPXE 从分区 2 启动?

旁注:分区 2 包含 Windows Boatloader,可以从 Grub 菜单启动。

答案1

我使用了以下技术来升级远程系统,这也可能对您有所帮助。在该系统上,我只能启动重置,而不能查看(启动)屏幕。系统启动到 grub(在 Ubuntu 12.04 上)并有一个额外分区和一个数据分区。诀窍是插入 /etc/default/grub

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false

您始终启动到 0 条目 (Ubuntu 12.04),除非:

  • 控制台上的某人选择了其他内容
  • grub-reboot X登录 Ubuntu 后运行,然后重新启动

从 Ubuntu,我将下载一个 tar 文件并将其解压到额外分区(或手动进行一些小更改),然后运行update-grub以更新 grub 菜单(它扫描新填充的额外分区并为其操作系统创建菜单项),然后使用grub-rebootreboot

如果机器无法恢复(即ssh在宽限期后无法恢复),我可以重置机器,并且它将在 Ubuntu 中重新启动,准备分析出了什么问题以及下一个周期。

通过在启动时运行适当的程序,您可以检查需要下载的下一个“映像”是什么,看看您是否已经拥有该映像(如果没有下载)并安装。然后按照上面的方法重新启动。

对于基于精益的systemd发行版,重新启动过程应该相对较快,并且下载/安装替代操作系统/发行版将花费大部分时间。

答案2

我找到了一种方法来实现我们正在寻找的目标。感谢@jc__ 对 grubenv 的提示以及@Anthon。

所以这是我的解决方案:将 iPXE 内核二进制文件 (.lkrn) 与自定义脚本联系启动控制服务器放入 /boot

然后设置Grub

1-使用 grubenv 中的变量

GRUB_DEFAULT=saved

2- 从 Grub 在 /boot 上链式加载 iPXE,并在启动 iPXE 之前包含以下命令

set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry

3- 在 Grub 菜单项前面添加从本地驱动器加载操作系统的命令

set saved_entry='<menuentry iPXE>'
save_env saved_entry

4- 如果不需要执行任何操作,引导控制服务器将指示 iPXE 从本地驱动器引导

sanboot --no-describe --drive 0x80

5- 再次加载 Grub 并启动到本地驱动器,再次将下次启动设置为 iPXE。

进入 Windows 10 的启动时间(包括询问启动控制服务器)约为 25 秒。所以实际上相当快。 :)

答案3

至少有两种方法可以实现这一点:

  1. 看一眼http://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples,以下命令之一可能适合您:

    chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR"
    chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
    
  2. 我目前正在使用以下内容,因为我在 iPXE 站点上的 GRUB4DOS 上找到该页面之前构建了此内容。创建包含 ISOLINUX 和以下配置的 ISO 映像:

    NOESCAPE 1
    PROMPT 0
    ALLOWOPTIONS 0
    
    DEFAULT chain-hd0-2
    LABEL chain-hd0-2
    SAY Chaining hd0 2...
    COM32 chain.c32
    APPEND hd0 2
    

    并使用以下命令启动它(这里必须使用 0x81,因为它默认使用 0x80,这会覆盖本地磁盘):

    sanboot --drive 0x81 ${server}/chain-hd0-2.iso
    

相关内容