vm.gowatana.jp

NEOにほんごVMware(仮)

ESXi を PXE ブートでインストールしてみる。(dnsmasq 利用版)

ESXi は、PXE でネットワーク ブートしてインストールすることができます。そこで、PXE 環境を Linux と dnsmasq を利用して構築してみます。

PXE 環境を用意するには、DHCP や TFTP といったサービスが必要です。dnsmasq は簡易的な DNS サーバとして利用されることが多いですが、PXE に必要な DHCP サービスと TFTP サービスも提供できます。

ドキュメントでは下記のあたりです。

docs.vmware.com

今回の環境

使用するソフトウェアは下記です。まずは 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」にしてあります。

f:id:gowatana:20210119020855p:plain

パワーオンすると、ネットワーク ブートされ、さきほど設定したメニューが表示されます。

f:id:gowatana:20210118202544p:plain

メニューを選択してブートすると、通常の ISO ファイルのブートとは異なり、読み込むファイルのパスが変更されていることがわかります。

f:id:gowatana:20210118202604p:plain

これで、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 (推奨)」に設定してあります。

f:id:gowatana:20210119021610p:plain

ESXi のインストーラが起動できました。さきほどの設定どおり、ESXi ブート画面のタイトルが「ESXi 7.0 U1c Installer」になっています。

f:id:gowatana:20210119021908p:plain

以上、ESXi インストーラを PXE ブートしてみる話でした。