めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

UEFI対応のKickstartサーバー構成手順

何の話かというと

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)に変更して起動します。