Grub2

我的 PxE 的 grub2 配置中缺少什麼

  • September 15, 2017

我正在嘗試使用 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圖像和grub2.cfg文件,我得到“歡迎使用 Grub!” 消息,但就在它應該執行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 文件之前沒有導入某些模組?只有某些命令正在執行,其餘的是“未知”。

好吧,在玩了這個問題幾週後,我終於掌握了竅門。我嘗試了 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”。如果我從一開始就發現了這一點,也許我會更快地完成它。

這個答案很有幫助。

引用自:https://unix.stackexchange.com/questions/391200