何の話かというと
PXEブートと連携してRHEL/CentOSをネットワークインストールするKickstartサーバーは、古くから使われてきましたが、UEFI対応のサーバーをPXEブートするには、少し特別な設定が必要となります。BIOSブート用に構成したKickstartサーバーをUEFIブートに対応させるための追加手順を解説します。
前提環境
RHEL7のKickstartサーバーで、BIOSブートのサーバーに対して、RHEL6.7、および、RHEL7.2をインストールできるようにセットアップしてあるものとします。設定手順は、ざっと次の通りです。
必要なパッケージを導入して、ブートストラップイメージpxelinux.0をTFTPで取得できる場所にコピーします。その他、必要なディレクトリーを作成します。
# yum -y install tftp-server dhcp httpd syslinux # mkdir /var/lib/tftpboot/pxelinux # cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux/ # mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg # mkdir /var/www/html/ks
RHEL6.7のインストールメディアをマウントして、HTTPで取得できる場所にコピーします。
# mkdir /var/www/html/RHEL67-x86_64 # mount /dev/cdrom /mnt/cdrom # cp -af /mnt/cdrom/* /var/www/html/RHEL67-x86_64/ # umount /mnt/cdrom
RHEL7.2のインストールメディアをマウントして、HTTPで取得できる場所にコピーします。
# mkdir /var/www/html/RHEL72-x86_64 # mount /dev/cdrom /mnt/cdrom # cp -af /mnt/cdrom/* /var/www/html/RHEL72-x86_64/ # umount /mnt/cdrom
それぞれのメディアに含まれる、Anaconda起動用のカーネルと初期RAMディスクをTFTPで取得できる場所にコピーします。
# mkdir /var/lib/tftpboot/pxelinux/RHEL67-x86_64 # cp /var/www/html/RHEL67-x86_64/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/RHEL67-x86_64/ # mkdir /var/lib/tftpboot/pxelinux/RHEL72-x86_64 # cp /var/www/html/RHEL72-x86_64/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/RHEL72-x86_64/
DHCPサーバーの設定をします。Kickstartサーバー自身のIPアドレスは、192.168.1.10/24としています。
/etch/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.200 192.168.1.240; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.168.1.10; filename "pxelinux/pxelinux.0"; } }
ブートストラップイメージの設定ファイルとブートメニューファイルを用意します。
/var/lib/tftpboot/pxelinux/boot.msg
================================ Welcome to Kickstart Installer ================================ 1. Red Hat Enterprise Linxu 6.7 (x86_64) 2. Red Hat Enterprise Linxu 7.2 (x86_64)
/var/lib/tftpboot/pxelinux/pxelinux.cfg/default
prompt 1 display boot.msg label 1 kernel /RHEL67-x86_64/vmlinuz append initrd=/RHEL67-x86_64/initrd.img ks=http://192.168.1.10/ks/ks_rhel67.cfg label 2 kernel /RHEL72-x86_64/vmlinuz append initrd=/RHEL72-x86_64/initrd.img ks=http://192.168.1.10/ks/ks_rhel72.cfg
また、お好みのキックスタートファイルを用意しておきます。ここでは、最小限の内容として、インストールレポジトリだけ指定しておきます。
/var/www/html/ks/ks_rhel67.cfg
url --url=http://192.168.1.10/RHEL67-x86_64
/var/www/html/ks/ks_rhel72.cfg
url --url=http://192.168.1.10/RHEL72-x86_64
最後に必要なサービスを起動します。
# systemctl enable dhcpd.service # systemctl enable tftp.service # systemctl enable httpd.service # systemctl start dhcpd.service # systemctl start tftp.service # systemctl start httpd.service
iptablesでパケットフィルタリングしている場合は、udp67,udp69,tcp80へのアクセスを許可しておいてください。
/etc/sysconfig/iptablesに追加
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 67 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 69 -j ACCEPT
セキュアブートに対応させる場合
UEFIブートのサーバーでは、セキュアブートの機能を持つものがあります。PXEブートで、セキュアブートに対応させるには、ブートストラップイメージとして、RHEL7のPXEブート用GRUB2イメージ(shim.efi, grubx64.efi)を使用する必要があります。ところが、このイメージは、RHEL6のカーネルを起動できないという問題があります。そのため、ここでは、セキュアブート対応で、RHEL7.2のみをインストール対象とする設定を行います。
まず、PXEブート用GRUB2イメージをTFTPブート可能な場所にコピーします。
# yum -y install shim # mkdir /var/lib/tftpboot/uefi # cp /boot/efi/EFI/redhat/shim.efi /var/lib/tftpboot/uefi/ # cp /boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/uefi/
GRUB2イメージを置いた場所から、Anaconda起動用カーネル/初期RAMディスクが取れるようにシンボリックリンクを貼っておきます。
# cd /var/lib/tftpboot/uefi # ln -s ../pxelinux/RHEL67-x86_64 RHEL67-x86_64 # ln -s ../pxelinux/RHEL72-x86_64 RHEL72-x86_64
RHEL7.2のエントリーを持ったGRUB2のブートメニューを作成します。
/var/lib/tftpboot/uefi/grub.cfg
set timeout=-1 menuentry 'Red Hat Enterprise Linxu 7.2 (x86_64)' { linuxefi uefi/RHEL72-x86_64/vmlinuz ip=dhcp inst.repo=http://192.168.1.10/RHEL72-x86_64 ks=http://192.168.1.10/ks/ks_rhel72.cfg initrdefi uefi/RHEL72-x86_64/initrd.img }
最後の仕上げに、DHCPサーバーの設定を変更して、クライアントがBIOSブートかUEFIブートかによって、ブートストラップイメージを切り替えるようにします。(ここで設定しているshim.efiはセキュアブートに対応するためのラッパーで、内部的にGRUB2本体であるgrubx64.efiを呼び出します。)
option arch code 93 = unsigned integer 16; # RFC4578 subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.200 192.168.1.240; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.168.1.10; if option arch = 00:07 { filename "uefi/shim.efi"; } else { filename "pxelinux/pxelinux.0"; } } }
DHCPサーバーを再起動して、設定完了です。
# systemctl restart dhcpd.service
セキュアブートに対応させない場合
セキュアブートに対応させる必要がない場合は、RHEL6が提供するPXEブート用GRUBイメージ(grub.efi)を用いると、RHEL6/RHEL7の両方がインストール可能な構成とすることができます。
まず、PXEブート用GRUB2イメージをTFTPブート可能な場所にコピーします。
# mkdir /tmp/grub # cd /tmp/grub # rpm2cpio /var/www/html/RHEL67-x86_64/Packages/grub-0.97-94.el6.x86_64.rpm | cpio -id # cp ./boot/efi/EFI/redhat/grub.efi /var/lib/tftpboot/uefi/
GRUB2イメージを置いた場所から、Anaconda起動用カーネル/初期RAMディスクが取れるようにシンボリックリンクを貼っておきます。
# cd /var/lib/tftpboot/uefi # ln -s ../pxelinux/RHEL67-x86_64 RHEL67-x86_64 # ln -s ../pxelinux/RHEL72-x86_64 RHEL72-x86_64
GRUBのブートメニューを用意します。
/var/lib/tftpboot/uefi/efidefault
default=0 title Red Hat Enterprise Linxu 6.7 (x86_64) root (nd) kernel /RHEL67-x86_64/vmlinuz ks=http://192.168.1.10/ks/ks_rhel67.cfg initrd /RHEL67-x86_64/initrd.img title Red Hat Enterprise Linxu 7.2 (x86_64) root (nd) kernel /RHEL72-x86_64/vmlinuz ks=http://192.168.1.10/ks/ks_rhel72.cfg initrd /RHEL72-x86_64/initrd.img
DHCPサーバーの設定を変更して、UEFI用のブートストラップイメージにgrub.efiを指定します。
option arch code 93 = unsigned integer 16; # RFC4578 subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.200 192.168.1.240; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.168.1.10; if option arch = 00:07 { filename "uefi/grub.efi"; } else { filename "pxelinux/pxelinux.0"; } } }
DHCPサーバーを再起動して、設定完了です。
# systemctl restart dhcpd.service
KVMでUEFIブートをエミュレートする方法
UEFIのサーバーがなくてテストできないという場合は、KVMの仮想マシンでUEFIブートをエミュレートすることができます。
まず、下記のWebサイトから、UEFIファームウエア(OVMF)を入手します。
・http://www.tianocore.org/ovmf/
ダウンロードしたアーカイブファイルに含まれるOVMF.fdを/usr/share/qemu-kvm/にコピーします。
続いて、仮想マシンを作成した後、ゲストOSをインストールする前に強制停止します。その後、「virsh edit」コマンドで構成ファイルを開いて、下記の
<os> <type arch='x86_64' machine='rhel6.5.0'>hvm</type> <loader>OVMF.fd</loader> ← この行を追加 <boot dev='hd'/> </os>
この後、virt-managerから仮想マシンのブートデバイスをNetwork(PXE)に変更して起動します。