ESXi は、PXE でネットワーク ブートしてインストールすることができます。そこで、PXE 環境を Linux と dnsmasq を利用して構築してみます。
PXE 環境を用意するには、DHCP や TFTP といったサービスが必要です。dnsmasq は簡易的な DNS サーバとして利用されることが多いですが、PXE に必要な DHCP サービスと TFTP サービスも提供できます。
今回の内容です。
- 今回の環境
- PXE サーバにする OS の準備
- DHCP / TFTP サーバの構築
- syslinux での PXE 設定ファイルの用意
- PXE サーバへの ESXi インストーラの配置
- インストール対象マシンのパワーオン
- UEFI の場合
ドキュメントでは下記のあたりです。
今回の環境
使用するソフトウェアは下記です。まずは BIOS(Legacy Boot)のパターンで環境構築しますが、最後に UEFI のパターンについても説明します。
- OS: Oracle Linux 7
- DHCP / TFTP サーバ: Linux ディストリビューション提供の dnsmasq RPM
- syslinux ブートローダ: Linux ディストリビューション提供の syslinux-tftpboot RPM
- PXE ブート対象マシンのファームウェア: BIOS
- ESXi インストール メディア: TFTP サーバに配置(PXE サーバ自身)
PXE サーバにする OS の準備
Linux は、Oracle Linux 7.9 を利用しています。ちなみに RHEL や CentOS でも同様の手順で構築可能なはずです。
[root@localhost ~]# cat /etc/system-release Oracle Linux Server release 7.9
わかりやすく、ホスト名を変更しておきます。ホスト名は lab-pxe-01 にします。そして OS にログインしなおしてプロンプトの文字列を変更しておきます。
[root@localhost ~]# hostnamectl set-hostname lab-pxe-01
手順を簡略化するため、firewalld は停止しています。
[root@lab-pxe-01 ~]# systemctl stop firewalld [root@lab-pxe-01 ~]# systemctl disable firewalld
DHCP / TFTP サーバの構築
dnsmasq をインストールします。
[root@lab-pxe-01 ~]# yum install -y dnsmasq [root@lab-pxe-01 ~]# rpm -q dnsmasq dnsmasq-2.76-16.el7.x86_64
あわせて、TFTP で利用する syslinux ブートローダの RPM(syslinux-tftpboot)もインストールしておきます。
[root@lab-pxe-01 ~]# yum install -y syslinux-tftpboot
ちなみに、syslinux-tftpboot をインストールすると、下記のように /var/lib/tftpboot ディレクトリ配下にブートローダ関連のファイルが配置されます。
[root@lab-pxe-01 ~]# rpm -ql syslinux-tftpboot /var/lib/tftpboot /var/lib/tftpboot/cat.c32 /var/lib/tftpboot/chain.c32 /var/lib/tftpboot/cmd.c32 /var/lib/tftpboot/config.c32 /var/lib/tftpboot/cpuid.c32 /var/lib/tftpboot/cpuidtest.c32 /var/lib/tftpboot/disk.c32 /var/lib/tftpboot/dmitest.c32 /var/lib/tftpboot/elf.c32 /var/lib/tftpboot/ethersel.c32 /var/lib/tftpboot/gfxboot.c32 /var/lib/tftpboot/gpxecmd.c32 /var/lib/tftpboot/gpxelinux.0 /var/lib/tftpboot/hdt.c32 /var/lib/tftpboot/host.c32 /var/lib/tftpboot/ifcpu.c32 /var/lib/tftpboot/ifcpu64.c32 /var/lib/tftpboot/ifplop.c32 /var/lib/tftpboot/int18.com /var/lib/tftpboot/kbdmap.c32 /var/lib/tftpboot/linux.c32 /var/lib/tftpboot/ls.c32 /var/lib/tftpboot/lua.c32 /var/lib/tftpboot/mboot.c32 /var/lib/tftpboot/memdisk /var/lib/tftpboot/memdump.com /var/lib/tftpboot/meminfo.c32 /var/lib/tftpboot/menu.c32 /var/lib/tftpboot/pcitest.c32 /var/lib/tftpboot/pmload.c32 /var/lib/tftpboot/poweroff.com /var/lib/tftpboot/pwd.c32 /var/lib/tftpboot/pxechain.com /var/lib/tftpboot/pxelinux.0 /var/lib/tftpboot/reboot.c32 /var/lib/tftpboot/rosh.c32 /var/lib/tftpboot/sanboot.c32 /var/lib/tftpboot/sdi.c32 /var/lib/tftpboot/sysdump.c32 /var/lib/tftpboot/ver.com /var/lib/tftpboot/vesainfo.c32 /var/lib/tftpboot/vesamenu.c32 /var/lib/tftpboot/vpdtest.c32 /var/lib/tftpboot/whichsys.c32 /var/lib/tftpboot/zzjson.c32
dnsmasq に DHCP / TFTP サービス関連の設定をします。vi エディタなどで、/etc/dnsmasq.d/pxe.conf ファイルを作成します。ファイルを管理しやすいように、あえて /etc/dnsmasq.conf とは別ファイルにしています。
[root@lab-pxe-01 ~]# vi /etc/dnsmasq.d/pxe.conf
/etc/dnsmasq.d/pxe.conf ファイルの例です。
- interface には ens192 としていますが、環境によって別の名前(eth0 など)になります。
- dhcp-range には、ESXi をインストールするマシンが PXE サーバにアクセスする際に利用する IP アドレス レンジを指定します。
[root@lab-pxe-01 ~]# cat /etc/dnsmasq.d/pxe.conf interface=ens192 dhcp-range=192.168.1.60,192.168.1.69,6h dhcp-boot=pxelinux.0 enable-tftp tftp-root=/var/lib/tftpboot
dnsmasq のサービスを起動しておきます。
[root@lab-pxe-01 ~]# systemctl start dnsmasq [root@lab-pxe-01 ~]# systemctl enable dnsmasq
syslinux での PXE 設定ファイルの用意
pxelinux.cfg ディレクトリを作成します。
[root@lab-pxe-01 ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
/var/lib/tftpboot/pxelinux.cfg/default ファイルを、下記のような内容で作成します。
「LABEL ESXi70u1c」以降には、今回インストールで利用する ESXi 7.0 U1c のメニューを追加しています。必須ではありませんが、メニュー画面の見栄えをよくするために設定を追加(MENU INCLUDE pxelinux.cfg/pxe.conf)しています。
[root@lab-pxe-01 ~]# vi /var/lib/tftpboot/pxelinux.cfg/default [root@lab-pxe-01 ~]# cat /var/lib/tftpboot/pxelinux.cfg/default DEFAULT vesamenu.c32 TIMEOUT 800 ONTIMEOUT 1 PROMPT 0 MENU INCLUDE pxelinux.cfg/pxe.conf NOESCAPE 1 LABEL 1 MENU LABEL Local Boot localboot 0 TEXT HELP Boot to local hard disk ENDTEXT LABEL ESXi70u1c KERNEL /ESXi70u1c/mboot.c32 APPEND -c /ESXi70u1c/boot.cfg MENU LABEL ESXi 7.0 Update 1c ^Installer
MENU INCLUDE で指定している pxe.conf ファイルは、下記の内容で作成しています。
[root@lab-pxe-01 ~]# vi /var/lib/tftpboot/pxelinux.cfg/pxe.conf [root@lab-pxe-01 ~]# cat /var/lib/tftpboot/pxelinux.cfg/pxe.conf MENU TITLE PXE Server lab-pxe-01 NOESCAPE 1 ALLOWOPTIONS 1 PROMPT 0 menu width 80 menu rows 14 MENU TABMSGROW 24 MENU MARGIN 10 menu color title 1;36;44 #ff008080 #00000000 std
PXE サーバへの ESXi インストーラの配置
今回は、ESXi 7.0 U1c のインストーラを利用します。
My VMware サイトから、下記のファイルを入手しておきます。
- VMware-VMvisor-Installer-7.0U1c-17325551.x86_64.iso
PXE サーバに ISO ファイルを転送ずみです。
[root@lab-pxe-01 ~]# ls VMware-VMvisor-Installer-7.0U1c-17325551.x86_64.iso
インストーラを /mnt ディレクトリにマウントします。
[root@lab-pxe-01 ~]# mount -o loop ./VMware-VMvisor-Installer-7.0U1c-17325551.x86_64.iso /mnt mount: /dev/loop0 is write-protected, mounting read-only
TFTP サーバが公開しているディレクトリの配下にディレクトリを作成して、
ISOファイルからファイルをコピーします。
[root@lab-pxe-01 ~]# mkdir /var/lib/tftpboot/ESXi70u1c [root@lab-pxe-01 ~]# cp -pr /mnt/* /var/lib/tftpboot/ESXi70u1c/
通常の CD ブートから PXE ブートに変更するため、boot.cfg ファイルを編集します。
- boot.cfg で指定されているファイル名から、先頭の「/」を削除。
- それらのファイル名の先頭に、TFTP のディレクトリ名をつける。(prefix=ESXi70u1c)
編集箇所が多いため、sed コマンドで置換します。
[root@lab-pxe-01 ~]# sed -i 's|/||g' /var/lib/tftpboot/ESXi70u1c/boot.cfg [root@lab-pxe-01 ~]# sed -i 's|prefix=|prefix=ESXi70u1c|' /var/lib/tftpboot/ESXi70u1c/boot.cfg
インストール対象マシンのパワーオン
インストール対象となるマシン(VM でも可)が PXE ブートできるか確認してみます。
今回は、ESXi 上の VM でブートのテストをしてみます。この VM では「設定の編集」→「仮想マシン オプション」→「起動オプション」で、ファームウェアを「BIOS」にしてあります。
パワーオンすると、ネットワーク ブートされ、さきほど設定したメニューが表示されます。
メニューを選択してブートすると、通常の ISO ファイルのブートとは異なり、読み込むファイルのパスが変更されていることがわかります。
これで、PXE ブートで ESXi のインストールが開始できるようになり、このあとは通常どおりインストールを進めることになります。
UEFI の場合
最近のマシンでは BIOS(Legacy Boot)ではなく、UEFI が使用されていると思います。最近自宅に増設する Intel NUC も UEFI なので、UEFI(EFI)でのパターンも紹介しておきます。
DHCP / TFTP サーバの構築は同様なので、BIOS パターンからの設定変更部分を説明します。
DHCP サーバ 設定の変更
/etc/dnsmasq.d/pxe.conf の dhcp-boot を、BOOTX64.EFI に編集します。
[root@lab-pxe-01 ~]# cat /etc/dnsmasq.d/pxe.conf interface=ens192 dhcp-range=192.168.1.60,192.168.1.69,6h dhcp-boot=efi/BOOTX64.EFI enable-tftp tftp-root=/var/lib/tftpboot
dnsmasq を再起動します。
[root@lab-pxe-01 ~]# systemctl restart dnsmasq
ブート用ファイルの配置(UEFI 用)
TFTP サーバに配置ずみの ESXi インストール イメージから、ブートに必要なファイルをコピーします。
[root@lab-pxe-01 ~]# cp /var/lib/tftpboot/ESXi70u1c/efi/boot/bootx64.efi /var/lib/tftpboot/ [root@lab-pxe-01 ~]# ls -l /var/lib/tftpboot/bootx64.efi -r-xr-xr-x. 1 root root 167360 1月 18 22:21 /var/lib/tftpboot/bootx64.efi
boot.cfg も改めて作成しておきます。こちらでは mboot でメニューを表示しないので、わかりやすくなるように ESXi ブート画面のタイトルを「ESXi 7.0 U1c Installer」にしておきます。
[root@lab-pxe-01 ~]# cp /var/lib/tftpboot/ESXi70u1c/efi/boot/boot.cfg /var/lib/tftpboot/ [root@lab-pxe-01 ~]# sed -i 's|^title=.*|title=ESXi 7.0 U1c Installer|g' /var/lib/tftpboot/boot.cfg [root@lab-pxe-01 ~]# sed -i 's|/||g' /var/lib/tftpboot/boot.cfg [root@lab-pxe-01 ~]# sed -i 's|prefix=|prefix=ESXi70u1c|' /var/lib/tftpboot/boot.cfg
インストール対象マシンの起動
UEFI のマシンを起動すると、PXE ブートできるはずです。
さきほどと同様、ESXi 上の VM でブートのテストをしてみます。今回は VM のファームウェアを「EFI (推奨)」に設定してあります。
ESXi のインストーラが起動できました。さきほどの設定どおり、ESXi ブート画面のタイトルが「ESXi 7.0 U1c Installer」になっています。
以上、ESXi インストーラを PXE ブートしてみる話でした。