【vSphere】仮想マシンのカスタマイズスクリプトをUbuntu22.04で使ってみた

どうも、Tです。

以前、「【vSphere】仮想マシンクローンのカスタマイズがうまく動かないときに確認した方がよいこと」という記事を書いていました。

【vSphere】仮想マシンクローンのカスタマイズがうまく動かないときに確認した方がよいこと
どうも、Tです。 仮想マシンのクローンしていますか?仮想マシンのカスタマイズ仕様使っていますか? vSphere...

今回、Ubuntu22.04でこのカスタマイズを実現する「仮想マシンのカスタマイズ仕様」の中にある「カスタマイズスクリプト」を使おうとして少しはまったので次は忘れぬように備忘録です。

やりたいこと

カスタマイズスクリプトを使うために必要な設定やカスタマイズスクリプトの仕様について確認した部分をまとめます。VMware社の下記ドキュメントをベースにして適時補足していきます。本記事では、これから引用元を明記していない場合は、下記のドキュメントから引用しています。

Windows および Linux でのカスタマイズ仕様の作成と管理
Windows と Linux ゲスト OS のカスタマイズ仕様を作成および管理できます。カスタマイズ仕様は、仮想マシンのゲスト OS の設定が含まれている XML ファイルです。

vSphere Clientの画面だと下記のカスタマイズスクリプトの部分になります。

カスタマイズ仕様の細かい使い方や手順は割愛しています。

環境

下記の環境での確認を説明していきます。

vSphere環境

  • VMware vCenter Server:8.0.1.00000(21560480)
  • VMware vSphere ESXi:8.0.1, 21495797

RHEL環境(テンプレート仮想マシン)

  • Ubuntu Desktop 22.04.2 LTS
  • open-vm-tools:12.1.5.39265 (build-20735119)

Ubuntuはほぼデフォルトでインストールしており、SSH許可を行っています。

カスタマイズスクリプトを使うために必要なこと

VMware Toolsのバージョン

ドキュメントは「VMware Tools バージョン 10.1.0 以降がインストールされていること」と説明されています。

Linuxの場合は、open-vm-toolsがほとんどだと思うので調べたところKB74880がありました。ここから少し情報をたどりましたが、カスタマイズスクリプトに必要なopen-vm-toolsの明確なバージョンにはたどり着けませんでした・・・・。

Setting the customization script for virtual machines in vSphere 7.x and 8.x

Ensure that VMware Tools version 10.1.0 or later is installed.
Please note that the Linux version of VMware Tools is “open-vm-tools”, which is separate from the Windows version. Please see https://docs.vmware.com/en/VMware-Tools/12.2.0/com.vmware.vsphere.vmwaretools.doc/GUID-8B6EA5B7-453B-48AA-92E5-DB7F061341D1.html

ここからは検証していないため憶測になりますが、KB2075048がありopen-vm-tools version 9.10.0以降であれば動きそうにも読み取れます。また、open-vm-tools 9.4.x でも下記プラグインを追加することで動きそうに見受けられます。

Installing the deployPkg plug-in in a Linux virtual machine with open- vm-tools version lower than 9.10

ここまで古いバージョンも過去の遺産以外ではないでしょうかご参考までに。

perlのインストール

そもそもの「仮想マシンのカスタマイズ仕様」を使用したカスタマイズのためにperlが必要です。下記のコマンドなどでperlをインストールしておきましょう。

$sudo apt install perl

UbuntuではOSインストール時でperlがインストールされていました。

enable-custom-scriptsの有効化

カスタマイズスクリプトを使用するためのenable-custom-scriptsオプションが無効になっています。有効にしておきましょう。

有効にして設定値がtrueになっていることを確認します。

$ sudo vmware-toolbox-cmd config set deployPkg enable-custom-scripts true
$ sudo vmware-toolbox-cmd config get deployPkg enable-custom-scripts
[deployPkg] enable-custom-scripts = true

上記のコマンドを実行することにより、下記のディレクトリにtools.confファイルを作成して設定値を書き込んでくれています。

$ cd /etc/vmware-tools/
$ cat tools.conf
[logging]
# Turns on logging globally. It can still be disabled for each domain.
# log = true

# Disables core dumps on fatal errors; they're enabled by default.
# enableCoreDump = false

# Defines the "vmsvc" domain, logging to file
# vmsvc.level = message
vmsvc.handler=file
# Setup file rotation - keep 3 files
vmsvc.maxOldLogFiles=3
# Max log file size kept: 1 MB
vmsvc.maxLogSize=1

# Defines the "vmtoolsd" domain, and disable logging for it.
# vmtoolsd.level = none

[deployPkg]
enable-custom-scripts=true

カスタマイズスクリプトの作成

カスタマイズスクリプトを作成しカスタマイズ仕様の設定に貼り付けます。

#!/bin/bash
if [ x$1 == x"precustomization" ]; then
# ここからがカスタマイズ前に実行されるスクリプト
echo Do Precustomization tasks
touch /root/Pre-test.txt
elif [ x$1 == x"postcustomization" ]; then
# ここからがカスタマイズ後に実行されるスクリプト
echo Do Postcustomization tasks
touch /root/Post-test.txt
fi

テストのために、プリスクリプトとポストスクリプトそれぞれに標準出力するechoコマンドとファイルを作成するtouchコマンドを記載しています。

echoコマンドは入れておいたほうがいいかと思います。後述する部分にも関与しますが、何も処理が入っていないとカスタマイズスクリプトがエラーになりますので、echoのように動作影響のないものは有用かと考えています。

VMware社のサンプルコードでは、シェルの指定が「#!/bin/sh」になっていますが、Ubuntuの場合は、「#!/bin/bash」を必ず指定してあげましょう。

Ubuntuの/bin/shはdashへのシンボリックリンクになっており、「#!/bin/sh」ではスクリプト実行時にエラーになり動作しません。

$ ls -lh /bin/sh
lrwxrwxrwx 1 root root 4 7月 10 15:34 /bin/sh -> dash

実行したときの結果

先ほどのカスタマイズスクリプトの結果を見てみます。

echoコマンドは、/tmp/stdout.logに出力されていきます。スクリプトで書いておいたほうがいいといったのは、このechoによりプリスクリプト・ポストスクリプトどちらまで実行されているのか判別しやすいこともあります。

$ sudo cat /tmp/stdout.log
Do Postcustomization tasks

touchコマンドも指定の場所にファイルが作成されていました。ファイルタイムスタンプからもPreが実行されたあとにPostが実行されたことがわかります。

$ sudo ls -lh /root/
[sudo] kadmin のパスワード:
合計 4.0K
-rw-r--r-- 1 root root 0 7月 11 10:15 Post-test.txt
-rw-r--r-- 1 root root 0 7月 11 10:14 Pre-test.txt
drwx------ 5 root root 4.0K 7月 10 15:53 snap

覚えておくべき仕様

実行タイミング

プリスクリプトは、カスタマイズ仕様のカスタマイズが始まる前にに実行されます。プリスクリプト実行中はネットワークに繋がっていないことに注意が必要です。

“precustomization” コマンドライン パラメータを含むカスタマイズ スクリプトを追加すると、ゲストのカスタマイズが開始される前にスクリプトが呼び出されます。その結果、仮想 NIC が切断され、ネットワークにアクセスできなくなります。

ポストスクリプトはカスタマイズ仕様によるカスタマイズが終了した後に実行されます。そのため、ネットワークにもつながている状態です。

“postcustomization” コマンドライン パラメータを含むカスタマイズ スクリプトを追加すると、ゲストのカスタマイズが終了した後にスクリプトが呼び出されます。その結果、仮想マシンがパワーオンし、NIC が接続され、ネットワークにアクセスできるようになった後の初期化プロセス内でスクリプトがスケジューリングされます。スクリプトの実行時間はデフォルトのタイムアウト期間に含まれず、ゲストのカスタマイズに失敗することはありません。

タイムアウト値

カスタマイズのタイムアウト期間は100秒です。この期間は、プリスクリプト+カスタマイズ仕様のカスタマイズの合計であり、ポストスクリプトの時間は含まれていません。

デフォルトとあるので変更できるのかと探してみましたが、変更のパラメーターは見つかりませんでした。

ゲストのカスタマイズが完了するまでのデフォルトのタイムアウト期間は 100 秒に設定されています。このタイムアウト期間には、precustomization” コマンドライン パラメータを使用するときのスクリプトの実行時間が含まれます。スクリプトの実行時間がタイムアウトを超える場合は、ゲストのカスタマイズが失敗します。

文字数制限

カスタマイズスクリプトは1500文字となっています。

カスタマイズ スクリプトは 1,500 文字以下にしてください。

しかし、KB74880では、下記のように記載されているためvSphere8.x以降であれば65536文字まで可能なようです。

Setting the customization script for virtual machines in vSphere 7.x and 8.x

1. The length of customization script cannot be greater than 1500 characters in vSphere 7.x, this length
limitation has been increased to 65536 characters in vSphere 8.x.

カスタマイズスクリプトが動かないときの確認点

カスタマイズスクリプトが動かないときに確認したほうが良いログなどです。

カスタマイズのログの確認

$ sudo ls -lh /var/log/vmware-imc/
合計 44K
-rw-r--r-- 1 root root 599 7月 11 10:15 customization.log
-rw------- 1 root root 37K 7月 11 10:14 toolsDeployPkg.log

カスタマイズ仕様の処理のログは、「/var/log/vmware-imc/」に出力されます。

ドキュメントなどに明記はされていませんが、問題がある場合toolsDeployPkg.logにエラーログ記載されます。また正常時のログも出力されるので、大まかな流れを掴むのに役立ちます。

toolsDeployPkg.logの最後のほうに下記のログが出力されます。

[2023-07-11T01:14:50.136Z] [ info] Telinit command failed with exitcode: 1, stderr: 'Failed to connect to bus: 接続を拒否されました
Failed to open initctl fifo: そのようなデバイスやアドレスはありません
Failed to talk to init daemon.

古いVMwareToolsバージョンでは、Errorレベルで出力されていましたが、現在はinfoレベルの出力になっています。放置していても問題はなさそうですので無視することにしました。

類似したKB59754がありましたが、この内容を行ってもメッセージは出力され続けました。

Guest OS Customization fails for ubuntu18.10 Desktop,Server and Live-Server

カスタマイズスクリプトの確認

#!/bin/bash
if [ x$1 == x"precustomization" ]; then
# ここからがカスタマイズ前に実行されるスクリプト
echo Do Precustomization tasks
touch /root/Pre-test.txt
elif [ x$1 == x"postcustomization" ]; then
# ここからがカスタマイズ後に実行されるスクリプト
echo Do Postcustomization tasks
touch /root/Post-test.txt

実行に使われたカスタマイズスクリプトは、「/root/.customization/customize.sh」ファイルとなっています。

エラーが発生した場合は、ここを見たり部分的に実行したりで再現性を確認できます。

まとめ

自動化を考えたら、クローン後のAnsibleなどのほかツールから実行するのがいいのでしょうが、簡単な変更であればカスタマイズスクリプトも便利そうです。