web-dev-qa-db-ja.com

PxEのgrub2構成に欠けているもの

PxEを使用して物理サーバーのインストールを自動化しようとしています。この場合、私はOracle Virtual Servers(OVS、略してXenとカスタムLinuxカーネルを備えたRHEL/Centosのようなシステム)をインストールしています。 手順の概要 in 公式ドキュメント に従い、ansibleを使用して実装しました。

要約すると、私はいくつかの重要な注意事項を考慮に入れました:

  • バージョン3.4.2を使用しているので、UEFIベースのPXEクライアント用に独自のブートローダーを構築しています。
  • GRUB2ブートローダーのビルドに必要なgrub2-toolsパッケージを提供するため、Oracle Linux7.3を使用しています。

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が設定され、core.efiイメージとgrub2.cfgファイルの両方がtftpサーバーからダウンロードされ、「Welcome toGrub!」が表示されます。メッセージですが、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ファイルのすべてのコマンドを正しく入力し、キックスタートを使用してシステムを実際に起動してインストールできます。したがって、grub2.cfgファイルを実行する前に一部のモジュールがインポートされていないように見えるため、grub2イメージの作成に何かが欠けていると思いますか?特定のコマンドのみが実行されており、残りは「不明」です。

1
Nocturn

この問題を何週間も遊んだ後、ようやくコツをつかんだ。次のアップデート(3.4.3および3.4​​.4)の変更ログでこれを見つけたので、Oracleドキュメントにあるものを試し、OVSISOの新しいバージョンにアップグレードしようとしました。

Oracle用の簡略化されたUEFIPXEブートVMサーバー

このリリース以降、PXEブート環境のUEFIベースのシステムにOracle GRUBサーバーをインストールするために、VM 2ブートローダーを手動でビルドする必要はありません。 。OracleVMサーバーISOイメージファイルは、UEFIベースのシステム用の/EFI/BOOT/grubx64.efiブートローダーを提供します。OracleのインストールVM Server for OracleのPXEブートからのx86 VMインストールおよびアップグレードガイド。

そのバージョンのgrubイメージを使用しても、grub.cfgファイルをどこに設定したか、またはどのように名前を付けたかに関係なく、機能しませんでした。

私は自分のグラブ画像の作成に戻り、この手順は魅力のように機能しました。

  • 次のコマンドで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の「filename」ディレクティブで/mycore.efiを指すようにしてください。

  • 最後に、私のtftpファイルは次のようになりました。

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

私の重大な間違いは、ファイルに「grub.cfg」ではなく「grub2.cfg」という名前を付けていたことです。もし私が最初からそれを見つけていたら、多分私はこれをもっと早く終えていただろう。

この回答 大いに役立ちました。

2
Nocturn