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かの選択が可能です。
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」になっていることを確認します。
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による起動を試みます。
TFTPでインストールに必要なファイルを収集しています。画面上部に「Loading ktkr ESXi 7.0.2 Installer」と表示されていることから、独自のインストーラーが動作していることが分かります。
インストーラーの起動を待ちます。
以降の対話形式の操作は手作業のインストールと同じです。しかし、このような手作業を行うのは十分な省力化とは言えません。このような対話形式の設定を設定ファイルとして記述するのがkickstartと呼ばれる仕組みです。次節では、kickstartの設定を説明します。
事前準備(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を押下して再起動させます。
再起動後はIPアドレスなどが設定済であることが確認できます。
補足説明
セキュアブート
セキュアブートを有効にしている場合は、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