PXE bootとkickstartを用いたESXiの自動インストール (UEFI編)

スポンサーリンク

ESXiをPXE bootとkickstartを用いて自動インストールする方法をまとめます。OSをBIOSで起動するかUEFIで起動するかで設定方法が異なりますが、このページでは近年の多数派であるUEFIを使用する場合の自動インストール方法をまとめます。

前提条件

ベアメタルの場合

起動方法がUEFIになっていることを確認します。設定方法はハードウェアごとに異なるため説明を省略します。

HPE Proliantの場合は、起動メニューで「F9(System Utilities)」「System Configuration」「BIOS/Platform Configuration (RBSU)」「Boot Options」「Boot Mode」の順にメニューを選ぶとBIOSかUEFIかの選択が可能です。

ベアメタルサーバのUEFI設定

kickstartのfirstbootと呼ばれるインストール直後に行う処理を使用する場合は、セキュアブートを無効にする必要があります。設定方法はハードウェアごとに異なるため説明を省略します。

HPE Proliantの場合は、起動メニューで「F9(System Utilities)」「System Configuration」「BIOS/Platform Configuration (RBSU)」「Server Security」「Secure Boot Settings」「Secure Boot Enforcement」の順にメニューを選ぶとセキュアブートするか否かを選択できます。

ベアメタルサーバのセキュアブート無効設定

仮想マシンの場合

ESXiのPXE bootはNested ESXiを使って練習することもできます。Nested ESXiの構築方法は「Nested ESXiの構築方法」を参照ください。Nested ESXiとなる仮想マシンは、「起動オプション」「ファームウェア」が「EFI」になっていることを確認します。

仮想マシンのUEFI設定

kickstartのfirstbootと呼ばれるインストール直後に行う処理を使用する場合は、セキュアブートを無効にする必要があります。「起動オプション」「セキュアブート」のチェックを外します。

仮想マシンのセキュアブート無効設定

事前準備(1/2)

DHCPサーバ構築

PXEブートは、起動時にDHCPによるアドレス取得を試みます。このDHCPによるアドレス通知の一部としてサーバの起動情報を通知します。近年の自動化ブームで再脚光を浴びつつありますが、実はサーバOSやネットワーク機器でも実装可能な古くから存在する仕組みです。以下、CentOS 8.3を使用した場合の設定例を紹介します。

まずDHCPサーバをインストールします。

dnf install dhcp-server

デフォルト設定はほぼ空白ですので、サンプル設定をコピーした方が構築が容易になるでしょう。サンプル設定をコピーします。

cp -p /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf

PXE bootをするサンプル設定は以下の通りです。後述の手順で、PXE bootでの起動イメージファイルをTFTPサーバに格納します。「next-server」「filename」それぞれに、「TFTPサーバのIPアドレス」と「起動イメージファイルのパス」を指定しhます。

option domain-name "gokatei.go";
option domain-name-servers 192.168.1.221, 192.168.1.1;

default-lease-time 600;
max-lease-time 7200;

subnet 192.168.2.0 netmask 255.255.255.0 {
   range 192.168.2.20 192.168.2.39;
   option routers 192.168.2.1; # デフォルトゲートウェイ
   option broadcast-address 192.168.2.255;
   next-server 192.168.2.16; # TFTPサーバのIPアドレス
   filename "/mboot.efi"; # TFTPに格納された起動イメージファイル
}

dhcpdを起動します。

systemctl enable dhcpd.service --now

TFTPサーバ構築

TFTPサーバと動作確認用途のTFTPクライアントをインストールします。

dnf install tftp-server tftp

CentOS 8.3の場合は、TFTPサーバの特段の設定は必要ありません。起動しただけで、/var/lib/tftpboot/配下が公開されます。

systemctl enable tftp --now

動作確認のために、テスト用のファイルを作成します。

echo "this is test" > /var/lib/tftpboot/test.txt

テスト用ファイルをTFTPクライアントでダウンロード可能なことを確認します。

[root@sandbox16 ~]# cd /tmp/
[root@sandbox16 tmp]# tftp localhost -c get test.txt
[root@sandbox16 tmp]# ls -l
total 4
-rw-r--r-- 1 root root 13  5月 14 20:08 test.txt
[root@sandbox16 tmp]# 

インストール資材の配置

ESXiのインストーラーISOファイル内に含まれるファイル群を適切なディレクトリに配置することでPXE bootを実現できます。まずは作業しやすいようにESXiインストーラーを/var/lib/tftpboot/ESXi70u2にマウントします。

マウント先のディレクトリは、今後のバージョンアップを見据えて、バージョン番号を含むディレクトリ名にしておくと良いでしょう。

mkdir /var/lib/tftpboot/iso
mkdir /var/lib/tftpboot/ESXi70u2
mv VMware-VMvisor-Installer-7.0U2-17630552.x86_64.iso /var/lib/tftpboot/iso
cd /var/lib/tftpboot
mount iso/VMware-VMvisor-Installer-7.0U2-17630552.x86_64.iso ESXi70u2

上記操作後のディレクトリ構成は以下の通りです。

[root@sandbox16 ~]# tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── ESXi70u2
│   ├── atlantic.v00
│   ├── basemisc.tgz
│   ├── b.b00
│   ├── bnxtnet.v00
│   ├── bnxtroce.v00
│   ├── boot.cat
│   ├── boot.cfg
│   ├── brcmfcoe.v00
│   ├── brcmnvme.v00
│   ├── btldr.v00
│   ├── clusters.v00
│   ├── crx.v00
│   ├── efi
│   │   └── boot
│   │       ├── boot.cfg
│   │       ├── bootx64.efi
│   │       ├── crypto64.efi
│   │       └── safeboot.efi
│   ├── efiboot.img
│   ├── elx_esx_.v00

  <omitted>

└── iso
    └── VMware-VMvisor-Installer-7.0U2-17630552.x86_64.iso

5 directories, 122 files

前述のDHCPサーバで指定した起動イメージファイルを指定のディレクトリにコピーします。前述の設定例は「mboot.efi」という名前にしていますので、この名前でコピーします。

cd /var/lib/tftpboot/
cp -p ESXi70u2/efi/boot/bootx64.efi ./mboot.efi

boot.cfgと呼ばれる起動に関する設定を記述したファイルをtftpboot直下にコピーします。

cd /var/lib/tftpboot/
cp -p ESXi70u2/efi/boot/boot.cfg ./

boot.cfgのファイルパス指定について「/」を削除します。設定量が多く手作業編集は困難のため、sedコマンドなどで一括置換します。

sed -i 's|/||g' boot.cfg

「title」と「prefix」を環境に応じて適宜変更します。「title」は自動インストール時に表示されるタイトル文字で何か分かりやすい名前にしておくと良いでしょう。「prefix」はESXiインストーラーの格納先のディレクトリを指定します。このシナリオの場合ならば「ESXi70u2」になります。

# chmod 755 boot.cfg 
# vi boot.cfg

bootstate=0
title=Loading ktkr ESXi 7.0.2 installer
timeout=5
prefix=ESXi70u2
kernel=b.b00
kernelopt=runweasel cdromBoot
modules=jumpstrt.gz --- useropts.gz --- features.gz --- k.b00 --- uc_intel.b00 --- uc_amd.b00 --- uc_hygon.b00 --- procfs.b00 --- vmx.v00 --- vim.v00 --- tpm.v00 --- sb.v00 --- s.v00 --- atlantic.v00 --- bnxtnet.v00 --- bnxtroce.v00 --- brcmfcoe.v00 --- brcmnvme.v00 --- elxiscsi.v00 --- elxnet.v00 --- i40enu.v00 --- iavmd.v00 --- icen.v00 --- igbn.v00 --- irdman.v00 --- iser.v00 --- ixgben.v00 --- lpfc.v00 --- lpnic.v00 --- lsi_mr3.v00 --- lsi_msgp.v00 --- lsi_msgp.v01 --- lsi_msgp.v02 --- mtip32xx.v00 --- ne1000.v00 --- nenic.v00 --- nfnic.v00 --- nhpsa.v00 --- nmlx4_co.v00 --- nmlx4_en.v00 --- nmlx4_rd.v00 --- nmlx5_co.v00 --- nmlx5_rd.v00 --- ntg3.v00 --- nvme_pci.v00 --- nvmerdma.v00 --- nvmxnet3.v00 --- nvmxnet3.v01 --- pvscsi.v00 --- qcnic.v00 --- qedentv.v00 --- qedrntv.v00 --- qfle3.v00 --- qfle3f.v00 --- qfle3i.v00 --- qflge.v00 --- rste.v00 --- sfvmk.v00 --- smartpqi.v00 --- vmkata.v00 --- vmkfcoe.v00 --- vmkusb.v00 --- vmw_ahci.v00 --- clusters.v00 --- crx.v00 --- elx_esx_.v00 --- btldr.v00 --- esx_dvfi.v00 --- esx_ui.v00 --- esxupdt.v00 --- tpmesxup.v00 --- weaselin.v00 --- loadesx.v00 --- lsuv2_hp.v00 --- lsuv2_in.v00 --- lsuv2_ls.v00 --- lsuv2_nv.v00 --- lsuv2_oe.v00 --- lsuv2_oe.v01 --- lsuv2_oe.v02 --- lsuv2_sm.v00 --- native_m.v00 --- qlnative.v00 --- vdfs.v00 --- vmware_e.v00 --- vsan.v00 --- vsanheal.v00 --- vsanmgmt.v00 --- tools.t00 --- xorg.v00 --- gc.v00 --- imgdb.tgz --- basemisc.tgz --- resvibs.tgz --- imgpayld.tgz
build=7.0.2-0.0.17630552
updated=0

PXE boot 動作確認

PXE bootによるOSインストールを試みます。仮想マシンを起動すると、EFIがDHCPによる起動を試みます。

PXE bootによる起動 01

TFTPでインストールに必要なファイルを収集しています。画面上部に「Loading ktkr ESXi 7.0.2 Installer」と表示されていることから、独自のインストーラーが動作していることが分かります。

PXE bootによる起動 02

インストーラーの起動を待ちます。

PXE bootによる起動 03

以降の対話形式の操作は手作業のインストールと同じです。しかし、このような手作業を行うのは十分な省力化とは言えません。このような対話形式の設定を設定ファイルとして記述するのがkickstartと呼ばれる仕組みです。次節では、kickstartの設定を説明します。

PXE bootによる起動 04

事前準備(2/2)

HTTPサーバの構築

インストール時の対話処理はkickstartファイルによって記述します。このファイルはHTTPなどによって公開し、OSインストール時に読み込ませます。HTTPサーバをインストールします。CentOS8.3にapacheをインストールする例を紹介します。

httpd(apache)をインストールします。

dnf install httpd

httpd(apache)を起動します。以上の操作によって、/var/www/html以下がhttpで公開されるようになります。

systemctl enable httpd.service --now

サンプルkickstartファイル

サンプルとなるkickstartのファイルはESXiの/etc/vmware/weasel/ks.cfgに格納されています。これをhttpサーバの/var/www/htmlにコピーします。

[root@esxi181:~] cat /etc/vmware/weasel/ks.cfg
#
# Sample scripted installation file
#

# Accept the VMware End User License Agreement
vmaccepteula

# Set the root password for the DCUI and Tech Support Mode
rootpw myp@ssw0rd

# The install media is in the CD-ROM drive
install --firstdisk --overwritevmfs

# Set the network to DHCP on the first network adapter
network --bootproto=dhcp --device=vmnic0

# A sample post-install script
%post --interpreter=python --ignorefailure=true
import time
stampFile = open('/finished.stamp', mode='w')
stampFile.write( time.asctime() )

初期設定

ks.cfgを環境に応じて編集します。指定可能なパラメタ一覧の詳しくは「インストール スクリプトおよびアップグレード スクリプトのコマンド」を参照ください。

「rootpw」はrootパスワードを指定します。以下のサンプルは平文ですが、暗号化したパスワードを指定することもできます。

「network」はIPアドレスやデフォルトゲートウェイなどの指定です。

「keyboardTyep」はキーボードの指定です。

「reboot」はインストール後に自動でリブートするか否かの指定です。もし、手作業でリブートするのが手間ならば「reboot」を加筆しておきましょう。

# vim /var/www/html/ks.cfg

# Accept the VMware End User License Agreement
vmaccepteula

# Set the root password for the DCUI and Tech Support Mode
rootpw P@ssw0rd

# The install media is in the CD-ROM drive
install --firstdisk --overwritevmfs

# Set the network on the first network adapter
network --bootproto=static --device=vmnic0 --ip=192.168.1.141 --netmask=255.255.255.0 --vlanid=0 --gateway=192.168.1.1 --hostname=esxi141.gokatei.go --nameserver=192.168.1.221

# Set the keyboard
keyboard Japanese

# reboot after install
reboot

# A sample post-install script
%post --interpreter=python --ignorefailure=true
import time
stampFile = open('/finished.stamp', mode='w')
stampFile.write( time.asctime() )

postスクリプトとfirstbootスクリプト

kickstartはpostスクリプトやfirstbootスクリプトを用いて、インストール後に行う共通的な設定を自動化することができます。

postスクリプトはパッケージインストール後に実行されるスクリプトです。パッケージインストール後の再起動が行われていない状態なので、使用可能なコマンドは限られており、vim-cmdコマンドやesxcliコマンドは使用できません。

firstbootスクリプトはOSインストール後に1回だけ実行される処理で、postスクリプトと異なりvim-cmdコマンドやesxcliコマンドの使用可能です。ただし、セキュアブートが有効になっている場合は実行されないことに注意が必要です。

postスクリプトやfirstbootスクリプトのインタプリタは、busyboxまたはpythonが指定可能です。busyboxは聞きなれないインタプリタですが、ESXiが標準で使用するシェルで、B-shellよりも軽量なシェルです。インタプリタを明示指定しなかった場合はbusyboxになります。

以下、インストール直後にSSHを有効にしたりNTPを設定したりするfirstbootの設定例を示します。

# vim /var/www/html/ks.cfg

# Accept the VMware End User License Agreement
vmaccepteula

# Set the root password for the DCUI and Tech Support Mode
rootpw P@ssw0rd

# The install media is in the CD-ROM drive
install --firstdisk --overwritevmfs

# Set the network on the first network adapter
network --bootproto=static --device=vmnic0 --ip=192.168.1.141 --netmask=255.255.255.0 --vlanid=0 --gateway=192.168.1.1 --hostname=esxi141.gokatei.go --nameserver=192.168.1.221

# Set the keyboard
keyboard Japanese

# reboot after install
reboot

%firstboot --interpreter=busybox
vim-cmd hostsvc/enable_ssh
vim-cmd hostsvc/start_ssh
vim-cmd hostsvc/enable_esx_shell
vim-cmd hostsvc/start_esx_shell

/bin/esxcli system ntp set --server=192.168.1.221
/bin/chkconfig ntpd on

esxcli system settings advanced set -o /UserVars/SuppressShellWarning -i 1

cat << EOF > /etc/ssh/keys-root/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbQpQ/2nNb9mSzxjzrEW9rOi86Wm+naGUGzajjfrLa7IFSz6768Yo4NzC1z33usksF63quOUu33/72eYNMtSanSId0EPW1j5rBMvMPzHq0q5u1U4KhHiLVyavzd7Bw56vMBWxL0UuLBlCOOgZOL7owhDfhaW9uns+PshqOBs6jaGFNznRps8BktLLToRNrLZNaRy/hSLs+WwzPcGtN21TLWZR8QNYQhMYosb1G5ck+DoFCXaMMTxnzEHsvc+vAyvgIQKe68Uxhpe6kod0ss/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX xxxxxxxxx@gokatei.go
EOF

date > /finished.stamp

ks.cfdのURL指定

boot.cfgのkerneloptを以下のように編集し、ks.cfgが格納されているURLを指定します。

# vi /var/lib/tftpboot/boot.cfg

bootstate=0
title=Loading ktkr ESXi 7.0.2 installer
timeout=5
prefix=ESXi70u2
kernel=b.b00
kernelopt=ks=http://192.168.1.16/ks.cfg
modules=jumpstrt.gz --- useropts.gz --- features.gz --- k.b00 --- uc_intel.b00 --- uc_amd.b00 --- uc_hygon.b00 --- procfs.b00 --- vmx.v00 --- vim.v00 --- tpm.v00 --- sb.v00 --- s.v00 --- atlantic.v00 --- bnxtnet.v00 --- bnxtroce.v00 --- brcmfcoe.v00 --- brcmnvme.v00 --- elxiscsi.v00 --- elxnet.v00 --- i40enu.v00 --- iavmd.v00 --- icen.v00 --- igbn.v00 --- irdman.v00 --- iser.v00 --- ixgben.v00 --- lpfc.v00 --- lpnic.v00 --- lsi_mr3.v00 --- lsi_msgp.v00 --- lsi_msgp.v01 --- lsi_msgp.v02 --- mtip32xx.v00 --- ne1000.v00 --- nenic.v00 --- nfnic.v00 --- nhpsa.v00 --- nmlx4_co.v00 --- nmlx4_en.v00 --- nmlx4_rd.v00 --- nmlx5_co.v00 --- nmlx5_rd.v00 --- ntg3.v00 --- nvme_pci.v00 --- nvmerdma.v00 --- nvmxnet3.v00 --- nvmxnet3.v01 --- pvscsi.v00 --- qcnic.v00 --- qedentv.v00 --- qedrntv.v00 --- qfle3.v00 --- qfle3f.v00 --- qfle3i.v00 --- qflge.v00 --- rste.v00 --- sfvmk.v00 --- smartpqi.v00 --- vmkata.v00 --- vmkfcoe.v00 --- vmkusb.v00 --- vmw_ahci.v00 --- clusters.v00 --- crx.v00 --- elx_esx_.v00 --- btldr.v00 --- esx_dvfi.v00 --- esx_ui.v00 --- esxupdt.v00 --- tpmesxup.v00 --- weaselin.v00 --- loadesx.v00 --- lsuv2_hp.v00 --- lsuv2_in.v00 --- lsuv2_ls.v00 --- lsuv2_nv.v00 --- lsuv2_oe.v00 --- lsuv2_oe.v01 --- lsuv2_oe.v02 --- lsuv2_sm.v00 --- native_m.v00 --- qlnative.v00 --- vdfs.v00 --- vmware_e.v00 --- vsan.v00 --- vsanheal.v00 --- vsanmgmt.v00 --- tools.t00 --- xorg.v00 --- gc.v00 --- imgdb.tgz --- basemisc.tgz --- resvibs.tgz --- imgpayld.tgz
build=7.0.2-0.0.17630552
updated=0

kickstart 動作確認

kickstart設定済の状態で、PXE bootを試みます。今度は、一切の操作なしにOSインストールが完了します。OSインストールが完了すると、以下のような画面が表示されます。

もし、kickstart内に「reboot」の指定があれば2,3秒後に自動的に再起動します。「reboot」の指定がなければ、手作業でEnterを押下して再起動させます。

kickstartの動作確認 01

再起動後はIPアドレスなどが設定済であることが確認できます。

kickstartの動作確認 02

補足説明

セキュアブート

セキュアブートを有効にしている場合は、firstbootスクリプトが動作しません。/var/log/kickstart.logを見るとfirstbootが抑制された旨が記録されています。

[root@esxi142:~] cat /var/log/kickstart.log 
2021-05-14 12:24:57,905 INFO UEFI Secure Boot Enabled, skipping execution of /var/lib/vmware/firstboot/001.firstboot_001
タイトルとURLをコピーしました