でんかのブログ

テクニカル系ネタをメインに、つれづれなるままに書いていきます。

UEFI環境でのPXEブート

以前@ITで「PXE+Kickstartで動かすVirtualBoxCentOS環境自動構築サーバーの作り方 」という記事を書いたのですが、この時はUEFIを意識せずレガシーBIOSの場合のみの記述でした。(´・ω・`)

http://www.atmarkit.co.jp/ait/articles/1407/17/news010.html

最近UEFIが前提になったサーバを自動構築する際に軽くハマったので、UEFI環境に対するPXEブートサーバを設定する際の差分を備忘録代わりにまとめておきます。(゚∀゚)

あ、先に書いておきますが、RedHat 6系のUEFI環境でのPXEブートのマニュアルは、嘘がいっぱい書いてあるのでご注意を。僕はずっぽりハマりました。゚ヽ(゚`Д´゚)ノ゚。

https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config-efi.html

ブートローダーをUEFI用に変更

レガシーBIOSの場合はpxelinux.0がブートローダーでしたが、UEFI環境ではbootia32.efiもしくはbootx64.efiブートローダーになります。このブートローダーはRedHat系であればインストールメディアに入っています。CentOS 6.5の場合は/(DVDメディアへのパス)/EFI/BOOT/ディレクトリ配下に入っていました。ただファイル名が全部大文字になってますが、別にリネームしてしまっても、そのまま使っても構いませんのでご安心を。(・∀・

というワケでブートローダーをコピーしてしまいましょう。

# cp /(DVDメディアへのパス)/EFI/BOOT/BOOTX64.* /var/lib/tftpboot/pxeboot_cent6

ここで注意なのですが、BOOTX64.confも必要なのです。後で説明しますが、pxelinux.cfg配下に入れていた設定ファイルを使わないのです。代わりにBOOTX64.confを編集してefidefaultファイルとして使います。ちなみにMACアドレスによるファイル名付与ルールはレガシーBIOSの場合と同様ですが、設定ファイルを配置するパスがpxelinux.cfg配下ではなくブートローダーの置いてあるディレクトリと同じになりますのでご注意を。(´・ω・`)

次にブートローダを代えるため、以下のようにdhcpd.confを変更しましょう。

変更前:

filename "/pxeboot_cent6/pxelinux.0";

変更後:

filename "/pxeboot_cent6/bootx64.efi";

言うまでも無いと思いますが、ブートローダーのファイル名は大文字なら大文字、小文字なら小文字、はたまた別の名前ならその名前で読み替えて設定してください。

ちなみにアーキテクチャを自動で判別して適切なブートローダーを返すなんて芸当もできます。以下の設定例を参考にしてみてください。classを使っていますが、この記事を読まれるような皆さんなら読み替えできるでしょう。(・∀・

# ここから冒頭に記述
option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16;
# ここまで冒頭に記述

class "pxeclients" {
  match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
  next-server 10.0.0.1;

  if option arch = 00:06 {
    filename "/pxeboot_cent6/bootia32.efi";
  } else if option arch = 00:07 {
    filename "/pxeboot_cent6/bootx64.efi";
  } else {
    filename "/pxeboot_cent6/pxelinux.0";
  }
}

設定ファイル修正

さて、お次は先ほどちょこっと触れたefidefaultファイルを作ってしまいましょう。

先ほども書きましたが、これまでのpxelinux.0の設定ファイルとは異なりますので流用はできません。というか、むしろコレgrub.confなんですよね。(´・ω・`)

書き換える内容ですが、最初にスプラッシュイメージの行を書き換えます。3行目辺りを以下のようにします。

変更前: splashimage=/EFI/BOOT/splash.xpm.gz

変更後: splashimage=(nd)/splash.xpm.gz

やっている事はイメージパスの書き換えです。ここで指定するパスですが、(nd)は“Network Drive”の略な意味で、コレを付けるとPXEブートしている時はブートローダーのあるディレクトリになります。つまり先の例なら、tftpのpxeboot_cent6/のディレクトリです。そういえばスプラッシュイメージがありませんね。ついでにコピーしてしまいましょう。

# cp /(DVDメディアへのパス)/EFI/BOOT/splash.xpm.gz /var/lib/tftpboot/pxeboot_cent6

次はブート設定の部分を修正しましょう。以下のように修正します。

変更前:

title CentOS 6.5
        kernel /images/pxeboot/vmlinuz
        initrd /images/pxeboot/initrd.img

変更後:

title CentOS 6.5
        root (nd)
        kernel /vmlinuz ks=http://192.168.xx.xx/ks/default.cfg
        initrd /initrd.img

変更のイメージは伝わったでしょうか。

まず“root (nd)”が追加されています。これは先に出ていた通りNetwork Driveを表しています。つまりtftp経由でファイルを取得せよ、というコトになります。

kernelとinitrdのエントリは余計なパスが取り除かれています。vmlinuxとinitrd.imgの配置場所は先と同様ブートローダーのあるディレクトリです。先の例ならtftpのpxeboot_cent6/のディレクトリから読み取ろうとします。もしサブディレクトリを作成するなら、サブディレクトリの指定は必要です。

またvmlinuzにksオプションが追加されています。これはKickstartファイルの指定ですので詳細は割愛します。

これらの変更によって、UEFI環境でもPXEブートしてKickstartの実行ができるようになります。(゚∀゚)

おまけでVMware PlayerでのUEFIファームの設定方法など。まぁ設定方法なんて大層なモノでもありませんが、vmxファイルに以下の行を足すだけです。

firmware = "efi"

ちなみにESXiの場合はオプション設定で普通に変更できます。ヽ(´ー`)ノ