我正在尝试使用 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”。如果我从一开始就发现这一点,也许我会更快地完成它。
这个答案帮了很多忙。