我的 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
圖像和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”。如果我從一開始就發現了這一點,也許我會更快地完成它。
這個答案很有幫助。