我的 PxE grub2 配置中缺少什么

我的 PxE grub2 配置中缺少什么

我正在尝试使用 PxE 自动安装物理服务器。在本例中,我正在安装 Oracle 虚拟服务器(简称 OVS,带有 Xen 和自定义 Linux 内核的 RHEL/Centos 类系统)。我跟着步骤概述官方文档并使用 ansible 实现它们。

总而言之,我考虑了一些重要的注意事项:

  • 我使用的是 3.4.2 版本,因此我正在为基于 UEFI 的 PXE 客户端构建自己的引导加载程序。
  • 我使用的是 Oracle Linux 7.3,因为它提供了构建 GRUB2 引导加载程序所需的 grub2-tools 软件包。

使用ansible,我配置了我的tftp、dhcp和http服务器(为了简单起见,它们都在同一个盒子里),它们似乎都按预期工作(测试下载文件和IP分配,一切正常)。这是我构建引导加载程序的方法

$ grub2-mkimage -p '(tftp,<tftp server IP>)' -O x86_64-efi -d <path to grub2 modules taken from installation iso> -c <path to grub2.cfg file> -o <path to tftp-server dir>/core.efi <embeded modules: net efinet tftp gzio part_gpt efi_gop efi_uga video_bochs video_cirrus all_video ext2 multiboot2 normal>

这是我的 grub2.cfg 文件的当前状态:

set timeout=60

# Load modules
insmod net
insmod efinet
insmod tftp
insmod gzio
insmod part_gpt
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
insmod ext2
insmod multiboot2
insmod normal

menuentry 'Install Oracle VM Server 3.4.2' --class fedora --class gnu-linux --class gnu --class os {

    # dhcp, tftp server in my network
    set net_default_server=<tftp IP>

    # This is for testing
    echo 'Network status: '
    net_ls_addr
    net_ls_routes

    echo 'Loading Xen...'
    multiboot2 /isolinux/xen.gz dom0_mem=max:11582M dom0_max_vcpus=20 noreboot
    echo 'Loading Linux Kernel...'
      module2 /isolinux/vmlinuz ip=dhcp vlanid=<vlan> repo=http://<Http server IP>/pxelinux/ISOs/OVS3.4.2 ks=http://<http server IP>/pxelinux/kickstart/ovs-3.4.2.ks ksdevice=<mac address of the dhcp configured nic>
      echo 'Loading initrd...'
    module2 /isolinux/initrd.img
}

服务器正确启动,正在设置 IP,正在从 tftp 服务器下载core.efi映像和文件,我收到“欢迎使用 Grub!”grub2.cfg消息,但当它应该运行grub2.cfg文件中配置的内容时,会发生这种情况:

//Start PXE Over IPv4
Station IP Address is X.X.X.X

Server IP Address is X.X.X.X
NBP filename is /boot/grub2/core.efi
NBP filesize is 397824 Bytes
Downloading NBP file...

  Succeed to download NBP file.

Downloading NBP file...

  Succeed to download NBP file.

Welcome to GRUB!

Unknown command 'menuentry'.
Unknown command '#'.
Unknown command '#'.
Unknown command 'echo'.
efinet0 <mac address> <dhcp delivered ip>
efinet0:local <net segment>/<netmask> efinet0
efinet0:default 0.0.0.0/0 gw <network gateway>
Unknown command 'echo'.
Unknown command 'echo'.
Unknown command 'echo'.
Unknown command '}'.

最后,我被定向到 grub 提示符,在这里我可以正确键入 grub2.cfg 文件中的所有命令,并使用 kickstart 实际引导和安装我的系统。所以我猜我在 grub2 映像创建中遗漏了一些东西,因为就像在运行 grub2.cfg 文件之前没有导入某些模块?仅运行某些命令,其余命令为“未知”。

答案1

在研究这个问题几周后,我终于掌握了它的窍门。我尝试了 Oracle 文档中的内容,甚至尝试升级到较新版本的 OVS ISO,因为我在下一次更新(3.4.3 和 3.4.4)的变更日志中发现了这一点。

Oracle VM 服务器的简化 UEFI PXE 引导

从此版本开始,您无需手动构建 GRUB 2 引导加载程序即可在 PXE 引导环境中基于 UEFI 的系统上安装 Oracle VM Server。 Oracle VM Server ISO 映像文件为基于 UEFI 的系统提供 /EFI/BOOT/grubx64.efi 引导加载程序。请参阅《Oracle VM 安装和升级指南》中的从 PXE 引导安装 Oracle VM Server for x86。

无论我在何处设置 grub.cfg 文件或如何命名它,使用该版本的 grub 映像也不起作用。

我回去创建自己的 grub 映像,这个说明非常有效:

  • 使用以下命令创建 grub 映像:

    grub2-mkimage -p '(tftp,)/' -O x86_64-efi -d /grub2/lib/grub/x86_64-efi -o /mycore.efi efinet tftp

  • 使用以下内容创建“grub.cfg”(不要更改此文件的名称)并将其放在核心映像和包含所有 grub2 模块的子目录旁边:

set default="1"

function load_video {
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod all_video
}

load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2

set timeout=60

'### END /etc/grub.d/00_header ###

echo "Setting root with device lable Oracle VM Server"
search --no-floppy --set=root -l 'Oracle VM Server'

'### BEGIN /etc/grub.d/10_linux ###

menuentry 'Install Oracle VM Server 3.4.4' --class fedora --class gnu-linux --class gnu --class os {
  echo 'Loading Xen...'
  multiboot2 /isolinux/xen.gz dom0_mem=max:11582M dom0_max_vcpus=20 noreboot
  echo 'Loading Linux Kernel...'
  module2 /isolinux/vmlinuz ip=dhcp vlanid=<vlan> repo=http://<path to ISO> ks=http://<path to kickstart> ksdevice=<device mac address>
  echo 'Loading initrd...'
  module2 /isolinux/initrd.img
}
  • 当然,还要确保在 dhcp 的“文件名”指令中指向 /mycore.efi。

  • 最后我的 tftp 文件如下所示:

tftproot
 grub2
  grub.cfg
  mycore.efi
  x86_64-efi
      *.mod
 isolinux
  initrd.img
  TRANS.TBL
  vmlinuz
  xen.gz

我的关键错误是我将文件命名为“grub2.cfg”而不是“grub.cfg”。如果我从一开始就发现这一点,也许我会更快地完成它。

这个答案帮了很多忙。

相关内容