New-IsoImage: PowerCLI でのカスタム ISO ファイルの新しい作り方

はじめに

vSphere 7 から、vSphere 環境のライフサイクル管理を担う vLCM が登場し、ESXi のパッケージ構成が ベースイメージアドオンコンポーネント を追加する考え方に変わりました。

PowerCLI でも、2020 年 4 月にリリースされた 12.0 から、この考え方に基づいてカスタム ISO ファイルの作成が行えるよう、New-IsoImage など Image Builder 関連の新しいコマンドレットが追加されています。カーネルオプションも含められる ので、慣れるととても便利です。

使い方は vSphere 7.0 のドキュメントVCF のドキュメント に充分書いてありますし、リファレンスもあります が、本エントリでは、ドキュメントに書かれていないところを補足しつつ、改めて紹介します。

なお、実際に使う場合は、バグが修正されている PowerCLI 12.5 以降VMware.ImageBuilder 7.0.3 以降)を推奨します。また、現状、PowerShell Core(OSS 版の PowerShell、現 PowerShell 7)では動作しない ため、Windows にバンドルされている Windows PowerShell を使う必要 があります。

作業の大まかな流れ

最初に、イメージの構成を JSON ファイル(仮に spec.json)として定義します。ベースイメージ は必須で、アドオンコンポーネント は任意です。

JSON ファイルで 宣言的に記述 できるので、構成管理的な文脈でもうれしいですね。

{
    "base_image": {
        "version": "7.0.3-0.20.19193900"
    },
    "add_on": {
        "name": "DEL-ESXi-703",
        "version": "19193900-A02"
    },
    "components": {
        "Net-Community-Driver": "1.2.2.0-1vmw.700.1.0.15843807"
    }
}

あとはこれを New-IsoImage に渡すだけです。JSON ファイルに含めた諸々を取得できるよう、デポ(URL または ZIP ファイル)のパスも併せて渡します。カーネルオプションもここで指定できます。

New-IsoImage `
  -Depots `
    "https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml", `
    ".\DellEMC_Addon_7.0.3_A02.zip", `
    ".\Net-Community-Driver_1.2.2.0-1vmw.700.1.0.15843807_18835109.zip" `
  -SoftwareSpec `
    ".\spec.json" `
  -KernelOptions `
    "systemMediaSize=min" `
  -Destination `
    ".\VMware-VMvisor-Installer-7.0U3c-19193900.x86_64.customized.iso"

もうちょっと詳しく

作業の流れをもう少し詳しく紹介します。

PowerShell 環境の要件

Image Builder 関連のコマンドレットは、VMware.ImageBuilder モジュールで提供されています。PowerCLI をインストールするとこの VMware.ImageBuilder モジュールも一緒にインストールされますが、VMware.ImageBuilder モジュールのみを単体でインストールしても構いません。

ただし、特定条件下で ISO ファイルのビルドに失敗するバグがあるため、PowerCLI 12.5 以降VMware.ImageBuilder 7.0.3 以降)の利用がおすすめです。

なお、現状、VMware.ImageBuilder モジュールは PowerShell Core(OSS 版の PowerShell、現 PowerShell 7)では動作しない ため、利用には Windows にバンドルされている Windows PowerShell が必要 です。

# PowerShell Core では怒られる
> Import-Module VMware.ImageBuilder
Exception: The VMware.ImageBuilder module is not currently supported on the Core edition of PowerShell.

デポの用意

JSON ファイルをつくるにあたって、ベースイメージアドオンコンポーネント を決める必要があります。そして、これらは デポ に含まれています。

デポ とは、いわゆるいつもの オフラインバンドル(ZIP ファイル)です。VMware Customer Connect からダウンロードできます(ベースイメージは “VMware vSphere Hypervisor (ESXi)” で、アドオンは “OEM Customized Addons” です)。

あるいは、手元に ZIP ファイルを用意せずとも、次の オンラインデポ も利用できます。

  • https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml
  • https://hostupdate.vmware.com/software/VUM/PRODUCTION/addon-main/vmw-depot-index.xml
  • https://hostupdate.vmware.com/software/VUM/PRODUCTION/iovp-main/vmw-depot-index.xml
  • https://hostupdate.vmware.com/software/VUM/PRODUCTION/vmtools-main/vmw-depot-index.xml

具体的な値の確認

JSON ファイルに含めるベースイメージやアドオン、コンポーネントの具体的な名前やバージョンは、デポの中身を Get-DepotBaseImagesGet-DepotAddonsGet-DepotComponents で確認するとそれぞれ取得できます。

# ベースイメージの確認(オンラインデポを利用する例)
> Get-DepotBaseImages -Depot "https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml"

Version             Vendor       Release date
-------             ------       ------------
...
7.0.2-0.25.18538813 VMware, Inc. 09/13/2021 23:00:00
7.0.2-0.30.19290878 VMware, Inc. 02/14/2022 23:00:00
7.0.3-0.20.19193900 VMware, Inc. 01/17/2022 23:00:00

# アドオンの確認(オフラインデポを利用する例)
> Get-DepotAddons -Depot ".\DellEMC_Addon_7.0.3_A02.zip"

Name         Version      ID                        Vendor    Release date
----         -------      --                        ------    ------------
DEL-ESXi-703 19193900-A02 DEL-ESXi-703:19193900-A02 Dell Inc. 01/30/2022 23:10:23

# コンポーネントの確認(オフラインデポを利用する例)
> Get-DepotComponents -Depot ".\Net-Community-Driver_1.2.2.0-1vmw.700.1.0.15843807_18835109.zip"

Name                 Version                       ID                                                 Vendor Release date
----                 -------                       --                                                 ------ ------------
Net-Community-Driver 1.2.2.0-1vmw.700.1.0.15843807 Net-Community-Driver:1.2.2.0-1vmw.700.1.0.15843807 VMware 10/27/2021 06:02:52

JSON ファイルの作成

以下の書式で JSON ファイルを作成します。

{
    "base_image": {
        "version": "<ベースイメージのバージョン>"
    },
    "add_on": {
        "name": "<アドオンの名前>",
        "version": "<アドオンのバージョン>"
    },
    "components": {
        "<コンポーネントの名前>": "<コンポーネントのバージョン>",
        "<コンポーネントの名前>": "<コンポーネントのバージョン>",
        "<コンポーネントの名前>": "<コンポーネントのバージョン>"
    }
}

必須なのはベースイメージだけで、アドオンとコンポーネントは任意で省略できます。例えば、家の Intel NUC 8 用に、Community Networking Driver for ESXi を含めた ESXi 7.0u3 のイメージを作りたい場合は、次のような JSON ファイルを作ります。

{
    "base_image": {
        "version": "7.0.3-0.20.19193900"
    },
    "components": {
        "Net-Community-Driver": "1.2.2.0-1vmw.700.1.0.15843807"
    }
}

コマンドの組み立て

コマンドのオプションを組み立てます。

-Depots で JSON ファイルの中身に必要なデポをカンマ区切りで列挙(PowerShell 的な String[])し、-SoftwareSpec は JSON ファイルを指定します。保存する ISO ファイルは -Destination で指定します。

New-IsoImage `
  -Depots "<デポ>", "<デポ>", "<デポ>" `
  -SoftwareSpec "<JSON ファイル>" `
  -Destination "<保存する ISO ファイル>"

カーネルパラメータを埋め込みたい場合は、-KernelOptions<オプション>=<値> を指定します。これもカンマ区切りで複数指定できます。

先の Intel NUC 8 用の JSON ファイルであれば、コマンドは次のようになります。この例では、カーネルパラメータ systemMediaSize=min を追加しています。

New-IsoImage `
  -Depots `
    "https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml", `
    ".\Net-Community-Driver_1.2.2.0-1vmw.700.1.0.15843807_18835109.zip" `
  -SoftwareSpec `
    ".\spec.json" `
  -KernelOptions `
    "systemMediaSize=min" `
  -Destination `
    ".\VMware-VMvisor-Installer-7.0U3c-19193900.x86_64.customized.iso"

その他、詳しい説明は リファレンス にあります。

実行後、Could not download and package reserved VIBs など何らかのエラーが出る場合、PowerCLI を 12.5 以上にアップデートすると解消する場合 があります。JSON ファイルやオフラインデポが見つからないエラーで怒られた場合は、指定をフルパスにすると解消するかもしれません。

vLCM との相互運用性

New-IsoImage で利用する JSON ファイルは、vLCM のそれと互換性があります。手作りした JSON ファイルを vLCM にインポートできますし、逆に vLCM からエクスポートしたファイルをそのまま New-IsoImage で使うことも可能です。

インポートとエクスポートは、GUI では次の画面です。そもそも ISO ファイルをここで吐かせられもします。ただし、エクスポートが若干バグめいており、正常に動作しない場合は、vCenter Server の SSL 証明書を信頼 して、エクスポート時に :9084 にリダイレクトされたら :443 にする とうまくいくようです。謎です。

GUI ではなく、次のように PowerCLI でも操作できます。

# JSON ファイルのエクスポート
> Export-LcmClusterDesiredState -Cluster <ホストクラスタ>

# JSON ファイルのインポート
> Import-LcmClusterDesiredState -Cluster <ホストクラスタ> -LocalSpecLocation <JSON ファイル>

エクスポートのコマンドでは、-ExportIsoImage-ExportOfflineBundle を指定すれば、JSON ファイルの代わりに ISO ファイルやオフラインバンドルも取得できます。

まとめ

vSphere 7 時代の考え方に合わせた、カスタム ISO ファイルの新しい作り方を紹介しました。昔ながらのイメージプロファイルを使った手順(Add-EsxSoftwareDepot して New-EsxImageProfile して Export-EsxImageProfile するアレ)に比べて、宣言的なアプローチになってわかりやすくなっています。

PowerCLI 12.4 までは、この手法は使うアドオンやコンポーネントによって失敗しがちで動作が安定しない部分がありましたが、12.5 でばっちり安定した感があります。vLCM との親和性も高いので、一貫性のある運用ができてすっきりしますね。

@kurokobo

くろいです。ギターアンサンブルやら音響やらがフィールドの IT やさんなアルトギター弾き。たまこう 48 期ぎたさん、SFC '07 おんぞう、新日本ギターアンサンブル、Rubinetto。今は野良気味。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です