vHoge

VMwareのアレコレ備忘録。CLIでがんばるネタ多め。

ESXi のカスタムイメージを作成する

ダウンロードしたイメージで ESXi 6.7 インストールをしていると…
No Network Adapters
あら…

使っているのメインから退役した SandyBridge マシン(Core i7 2600K)。
NICオンボードで、MotherBoard は P67A-GD65 V2。
MSI P67A-GD65
で肝心の NIC チップはおなじみ Realtek 8111E ...

というわけで、8111E ドライバを仕込んだ ESXi イメージを作成する。

準備する物

  • ESXi offline bundle
    • おそらく ISO と同様に配布されている offline bundle (zip ファイル)が必要。
  • Realtek 8111E driver offline bundle
  • PowerCLI
    • VMware.ImageBuilder で作る。
    • PowerShell Core 6.0- /PowerCLI 10- 未対応(2019/3現在)。なので Windows 環境が必須…

作成手順

1. Driver の offline bundle を登録

PowerCLI でダウンロードした Driver のファイルパスを指定し、Depot として登録する。

PS C:\Windows\system32> Add-EsxSoftwareDepot D:\vsphere\net55-r8168-8.045a-napi-offline_bundle.zip

Depot Url
---------
zip:D:\vsphere\net55-r8168-8.045a-napi-offline_bundle.zip?index.xml

2. パッケージを取得

登録した Driver の Depot 内にあるパッケージを取得する。
取得した情報は後で使うので適当な変数に保存しておく。

PS C:\Windows\system32> Get-EsxSoftwarePackage

Name                     Version                        Vendor     Creation Date
----                     -------                        ------     -------------
net55-r8168              8.045a-napi                    Realtek    2018/04/16 9:...


# 適当な変数に保存
PS C:\Windows\system32> $pkg = Get-EsxSoftwarePackage

3. ESXi イメージ offline bundle を Depot 登録

ESXi 本体の Depot 登録。 手順は1と同じ。

PS C:\Windows\system32> Add-EsxSoftwareDepot D:\vsphere\update-from-esxi6.7-6.7_update01.zip

Depot Url
---------
zip:D:\vsphere\update-from-esxi6.7-6.7_update01.zip?index.xml

4. イメージプロファイルを取得

ESXi イメージからイメージプロファイルを取得。
こちらも後で使うので適当な変数に保存。

PS C:\Windows\system32> Get-EsxImageProfile

Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-6.7.0-20181002001-stan... VMware, Inc.    2018/10/08 1... PartnerSupported
ESXi-6.7.0-20181001001s-no-... VMware, Inc.    2018/10/08 1... PartnerSupported
ESXi-6.7.0-20181002001-no-t... VMware, Inc.    2018/10/08 1... PartnerSupported
ESXi-6.7.0-20181001001s-sta... VMware, Inc.    2018/10/08 1... PartnerSupported


# 適当な変数に保存
PS C:\Windows\system32> $ip = Get-EsxImageProfile

5. イメージプロファイルを Clone し、新規のインストール用プロファイルを作成

4 で取得したイメージプロファイルを元に Driver 追加用のプロファイルを作成する。
ベースにするプロファイルは変数に配列形式で保存されているので、何番目のプロファイルを添字で指定。Name や Vendor は任意のもので可。
AcceptanceLevel は今回は Community Driver ということで "CommunitySupported"で指定。
業務用途とかであれば、デフォルト値(PartnerSupported) or higher でベンダ配布 Driver を使うようにしましょう…

PS C:\Windows\system32> New-EsxImageProfile -CloneProfile $ip[2] -Name ESXi-6.7.0-20181002001-realtek -Vendor "HomeLab" -AcceptanceLevel "CommunitySupported"

Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-6.7.0-20181002001-realtek HomeLab         2018/10/08 1... CommunitySupported

6. イメージプロファイルに Driver パッケージを追加

5 で作成したイメージプロファイルに 2 で取得した Driver のパッケージ情報を足す。

PS C:\Windows\system32> Add-EsxSoftwarePackage -ImageProfile ESXi-6.7.0-20181002001-realtek -SoftwarePackage $pkg


Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-6.7.0-20181002001-realtek HomeLab         2019/03/16 1... CommunitySupported

7. プロファイルを ISO 出力

パッケージを追加したイメージプロファイルは ISO イメージで出力できるので出力する。

PS C:\Windows\system32> Export-EsxImageProfile -ImageProfile ESXi-6.7.0-20181002001-realtek -ExportToIso D:\vsphere\ESXi-6.7.0-20181002001-realtek.iso

あとは出力された ISO イメージを焼けば良い。
ESXiインストール成功
インストールも成功し、IP も振られ、疎通が取れる。
shell をたたいてみる。

[root@hayabusa:~] esxcli software vib list | grep net55-r8168
net55-r8168                    8.045a-napi                           Realtek  CommunitySupported  2019-03-16
[root@hayabusa:~] esxcli network nic list
Name    PCI Device    Driver  Admin Status  Link Status  Speed  Duplex  MAC Address         MTU  Description
------  ------------  ------  ------------  -----------  -----  ------  -----------------  ----  -----------------------------------------------------------------------------------------
vmnic0  0000:08:00.0  r8168   Up            Up            1000  Full    6c:62:6d:e6:ca:ee  1500  Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
[root@hayabusa:~] esxcli network nic get -n vmnic0
   Advertised Auto Negotiation: true
   Advertised Link Modes: 10BaseT/Half, 10BaseT/Full, 100BaseT/Half, 100BaseT/Full, 1000BaseT/Full
   Auto Negotiation: true
   Cable Type: Twisted Pair
   Current Message Level: 51
   Driver Info: 
         Bus Info: 0000:08:00.0
         Driver: r8168
         Firmware Version: 
         Version: 8.045.08-NAPI
   Link Detected: true
   Link Status: Up 
   Name: vmnic0
   PHYAddress: 0
   Pause Autonegotiate: false
   Pause RX: false
   Pause TX: false
   Supported Ports: TP
   Supports Auto Negotiation: true
   Supports Pause: false
   Supports Wakeon: true
   Transceiver: internal
   Virtual Address: 00:50:56:56:9a:68
   Wakeon: MagicPacket(tm)

おまけ offline bundle 出力

今回は Driver の追加だったが、VAAI プラグイン追加とかパッチ当ても同じ方法でできる。
その際、ISO のみしか残っていないとまた0から作り直しになるので、
offline bundle 形式でも出力して残しておくと良さげ。

PS C:\Windows\system32> Export-EsxImageProfile -ImageProfile ESXi-6.7.0-20181002001-realtek -ExportToBundle D:\vsphere\ESXi-6.7.0-20181002001-realtek.zip

ESXiインストールメディアにUSBメモリを使う

VMware ESXi 6.7 のインストールイメージは iso で配布されています。
何も考えなければ光学メディアに焼いてインストールですが、
昨今だと CD/DVD ドライブがついてなかったりなので、代わりに USB メモリをインストールメディアとしてイメージ焼き込みを行います。

Linux(Ubuntu 18.04 LTS)の場合

公式 Doc に載ってたりします。
USB フラッシュ ドライブのフォーマットによる ESXi インストールまたはアップグレードの起動
とりあえず適当な Linux PC に USB メモリを挿し、/dev/sdb として認識したとして作業。

1. fdisk

% sudo fdisk /dev/sdb

fdisk (util-linux 2.31.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

とりあえずヘルプ見てみる。

コマンド (m でヘルプ): m

ヘルプ:

  DOS (MBR)
   a   起動可能フラグを切り替えます
   b   入れ子の BSD ディスクラベルを編集します
   c   DOS 互換フラグを切り替えます

  一般
   d   パーティションを削除します
   F   パーティションのない領域を一覧表示します
   l   既知のパーティションタイプを一覧表示します
   n   新しいパーティションを追加します
   p   パーティション情報を表示します
   t   パーティションタイプを変更します
   v   パーティション情報を検証します
   i   パーティションの情報を表示します

  その他
   m   このメニューを表示します
   u   表示項目の単位を変更します
   x   特殊機能に移動します (熟練者向け機能)

  スクリプト
   I   ディスクのレイアウトを sfdisk 互換のスクリプトから読み込みます
   O   ディスクのレイアウトを sfdisk 互換のスクリプトに書き出します

  保存と終了
   w   パーティション情報をディスクに書き込んで終了します
   q   変更点を保存せずに終了します

  新しいラベルを作成します
   g   新しい (何もない) GPT パーティションテーブルを作成します
   G   新しい (何もない) SGI (IRIX) パーティションテーブルを作成します
   o   新しい (何もない) DOS パーティションテーブルを作成します
   s   新しい (何もない) Sun パーティションテーブルを作成します

ほーん。
公式 Doc に沿ってパーティション初期化。

コマンド (m でヘルプ): d
パーティション 1 を選択
パーティション 1 を削除しました。

パーティション作成。
全部規定値でおけ。

コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p
パーティション番号 (1-4, 既定値 1): 
最初のセクタ (2048-60620799, 既定値 2048): 
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-60620799, 既定値 60620799): 

新しいパーティション 1 をタイプ Linux、サイズ 28.9 GiB で作成しました。

タイプ指定。

コマンド (m でヘルプ): t
パーティション 1 を選択
16 進数コード (L で利用可能なコードを一覧表示します): L

 0  空              24  NEC DOS         81  Minix / 古い Li bf  Solaris        
 1  FAT12           27  隠し NTFS WinRE 82  Linux スワップ  c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  隠し OS/2 また  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 拡張領域  c7  Syrinx         
 5  拡張領域        41  PPC PReP Boot   86  NTFS ボリューム da  非 FS データ   
 6  FAT16           42  SFS             87  NTFS ボリューム db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux プレーン  de  Dell ユーティリ
 8  AIX             4e  QNX4.x 第2パー  8e  Linux LVM       df  BootIt         
 9  AIX 起動可能    4f  QNX4.x 第3パー  93  Amoeba          e1  DOS access     
 a  OS/2 ブートマネ 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad ハ ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
 f  W95 拡張領域 (L 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  隠し FAT12      56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC  
12  Compaq 診断     5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  隠し FAT16 <32M 61  SpeedStor       ab  Darwin ブート   f4  SpeedStor      
16  隠し FAT16      63  GNU HURD または af  HFS / HFS+      f2  DOS セカンダリ 
17  隠し HPFS/NTFS  64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI スワップ   fc  VMware VMKCORE 
1b  隠し W95 FAT32  70  DiskSecure Mult bb  隠し Boot Wizar fd  Linux raid 自動
1c  隠し W95 FAT32  75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  隠し W95 FAT16  80  古い Minix      be  Solaris ブート  ff  BBT            
16 進数コード (L で利用可能なコードを一覧表示します): c
パーティションのタイプを 'Linux' から 'W95 FAT32 (LBA)' に変更しました。

フラグ立て。

コマンド (m でヘルプ): a
パーティション 1 を選択
パーティション 1 の起動フラグを有効にしました。

確認。

コマンド (m でヘルプ): a
パーティション 1 を選択
パーティション 1 の起動フラグを有効にしました。

コマンド (m でヘルプ): p
ディスク /dev/sdb: 28.9 GiB, 31037849600 バイト, 60620800 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x41150269

デバイス   起動 開始位置 最後から   セクタ サイズ Id タイプ
/dev/sdb1  *        2048 60620799 60618752  28.9G  c W95 FAT32 (LBA)

実際に書き込んで終了する。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

2. mkfs.vfat

FAT32 ファイルシステムを作成。

% sudo mkfs.vfat -F 32 -n USB /dev/sdb1
mkfs.fat 4.1 (2017-01-24)
%

Ubuntu 18.04 LTS だとデフォで入っていたが、入ってないディストリだと dosfstools をインストールすればよい。

3. syslinux

syslinux ブートローダーを設定。

% sudo syslinux /dev/sdb1
%

4. mbr

MBRを書き込む。
公式 Doc だとcatをリダイレクトしているが、何故か権限で怒られるのでddする。

% sudo dd if=/usr/lib/SYSLINUX/mbr.bin of=/dev/sdb
0+1 レコード入力
0+1 レコード出力
440 bytes copied, 0.00176266 s, 250 kB/s
%

5. isoの中身をコピー

iso をmountして中身を USB メモリへコピーする。

% sudo mount /dev/sdb1 /mnt/usb
% sudo mount -t iso9660 VMware-VMvisor-Installer-6.7.0.update01-10302608.x86_64.iso /mnt/cdrom
mount: /mnt/cdrom: WARNING: device write-protected, mounted read-only. 
% sudo cp -r /mnt/cdrom/* /mnt/usb/
% ls /mnt/usb/
ata_liba.v00*  k.b00*         nmlx4_co.v00*  scsi_mpt.v01*
ata_pata.v00*  ldlinux.c32*   nmlx4_en.v00*  scsi_mpt.v02*
ata_pata.v01*  ldlinux.sys*   nmlx4_rd.v00*  scsi_qla.v00*
ata_pata.v02*  lpfc.v00*      nmlx5_co.v00*  shim_isc.v00*
ata_pata.v03*  lpnic.v00*     nmlx5_rd.v00*  shim_isc.v01*
ata_pata.v04*  lsi_mr3.v00*   ntg3.v00*      shim_lib.v00*
ata_pata.v05*  lsi_msgp.v00*  nvme.v00*      shim_lib.v01*
ata_pata.v06*  lsi_msgp.v01*  nvmxnet3.v00*  shim_lib.v02*
ata_pata.v07*  lsi_msgp.v02*  nvmxnet3.v01*  shim_lib.v03*
b.b00*         lsu_hp_h.v00*  ohci_usb.v00*  shim_lib.v04*
block_cc.v00*  lsu_inte.v00*  procfs.b00*    shim_lib.v05*
bnxtnet.v00*   lsu_lsi_.v00*  pvscsi.v00*    shim_vmk.v00*
bnxtroce.v00*  lsu_lsi_.v01*  qcnic.v00*     shim_vmk.v01*
boot.cat*      lsu_lsi_.v02*  qedentv.v00*   shim_vmk.v02*
boot.cfg*      lsu_lsi_.v03*  qfle3.v00*     smartpqi.v00*
brcmfcoe.v00*  lsu_smar.v00*  qfle3f.v00*    tools.t00*
btldr.t00*     mboot.c32*     qfle3i.v00*    uc_amd.b00*
char_ran.v00*  menu.c32*      qflge.v00*     uc_hygon.b00*
chardevs.b00*  misc_cni.v00*  qlnative.v00*  uc_intel.b00*
efi/           misc_dri.v00*  rste.v00*      uhci_usb.v00*
efiboot.img*   mtip32xx.v00*  s.v00*         upgrade/
ehci_ehc.v00*  native_m.v00*  safeboot.c32*  usb_stor.v00*
elx_esx_.v00*  ne1000.v00*    sata_ahc.v00*  usbcore_.v00*
elxiscsi.v00*  nenic.v00*     sata_ata.v00*  user.b00*
elxnet.v00*    net_bnx2.v00*  sata_sat.v00*  useropts.gz*
esx_dvfi.v00*  net_bnx2.v01*  sata_sat.v01*  vim.v00*
esx_ui.v00*    net_cdc_.v00*  sata_sat.v02*  vmkata.v00*
esxupdt.v00*   net_cnic.v00*  sata_sat.v03*  vmkfcoe.v00*
features.gz*   net_e100.v00*  sata_sat.v04*  vmkplexe.v00*
hid_hid.v00*   net_e100.v01*  sb.v00*        vmkusb.v00*
i40en.v00*     net_enic.v00*  scsi_aac.v00*  vmw_ahci.v00*
iavmd.v00*     net_fcoe.v00*  scsi_adp.v00*  vmware-esx-base-osl.txt*
igbn.v00*      net_forc.v00*  scsi_aic.v00*  vmware-esx-base-readme*
ima_qla4.v00*  net_igb.v00*   scsi_bnx.v00*  vmware_e.v00*
imgdb.tgz*     net_ixgb.v00*  scsi_bnx.v01*  vmx.v00*
imgpayld.tgz*  net_libf.v00*  scsi_fni.v00*  vsan.v00*
ipmi_ipm.v00*  net_mlx4.v00*  scsi_hps.v00*  vsanheal.v00*
ipmi_ipm.v01*  net_mlx4.v01*  scsi_ips.v00*  vsanmgmt.v00*
ipmi_ipm.v02*  net_nx_n.v00*  scsi_isc.v00*  weaselin.t00*
iser.v00*      net_tg3.v00*   scsi_lib.v00*  xhci_xhc.v00*
isolinux.bin*  net_usbn.v00*  scsi_meg.v00*  xorg.v00*
isolinux.cfg*  net_vmxn.v00*  scsi_meg.v01*
ixgben.v00*    nfnic.v00*     scsi_meg.v02*
jumpstrt.gz*   nhpsa.v00*     scsi_mpt.v00*

6. syslinux.cfgを設定

isolinux.cfg をリネームし、中身を書き換え。

% sudo mv isolinux.cfg syslinux.cfg
% sudo vi syslinux.cfg 
# 変更前
DEFAULT menu.c32
MENU TITLE ESXi-6.7.0-20181002001-standard Boot Menu
NOHALT 1
PROMPT 0
TIMEOUT 80
LABEL install
  KERNEL mboot.c32
  APPEND -c boot.cfg
  MENU LABEL ESXi-6.7.0-20181002001-standard ^Installer
LABEL hddboot
  LOCALBOOT 0x80
  MENU LABEL ^Boot from local disk

# 変更後
DEFAULT menu.c32
MENU TITLE ESXi-6.7.0-20181002001-standard Boot Menu
NOHALT 1
PROMPT 0
TIMEOUT 80
LABEL install
  KERNEL mboot.c32
  APPEND -c boot.cfg -p 1 ※ この行
  MENU LABEL ESXi-6.7.0-20181002001-standard ^Installer
LABEL hddboot
  LOCALBOOT 0x80
  MENU LABEL ^Boot from local disk

7. usbメモリをアンマウント

最後に USB メモリをアンマウント。

% sudo umount /mnt/usb

これで終わり。
あとは USB メモリをブートデバイスに指定すれば ESXi のインストーラが起動するはず。

Windows の場合

一方 Windows 上では Rufus でイメージを焼いた。
Rufus

Rufus
該当 ISO 選んで、MBR/FAT32 でスタートすればおけ。

menu.c32置換確認
スタートすると menu.c32 の置換確認が出てくるが、そのままで動いたので"いいえ"で。

削除確認
GoGo!

USB メモリ次第ではあるが、おそらく1分もかからず書き込み完了し、インストールメディアとして使える。