UEFI環境でのPXEブート
以前@ITで「PXE+Kickstartで動かすVirtualBox+CentOS環境自動構築サーバーの作り方 」という記事を書いたのですが、この時はUEFIを意識せずレガシーBIOSの場合のみの記述でした。(´・ω・`)
http://www.atmarkit.co.jp/ait/articles/1407/17/news010.html
最近UEFIが前提になったサーバを自動構築する際に軽くハマったので、UEFI環境に対するPXEブートサーバを設定する際の差分を備忘録代わりにまとめておきます。(゚∀゚)
あ、先に書いておきますが、RedHat 6系のUEFI環境でのPXEブートのマニュアルは、嘘がいっぱい書いてあるのでご注意を。僕はずっぽりハマりました。゚ヽ(゚`Д´゚)ノ゚。
ブートローダーを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の場合はオプション設定で普通に変更できます。ヽ(´ー`)ノ