ターミナル スクリプトの実行、ブート パラメータの更新、バイナリの転送、GPU ドライバのインストールなど、仮想マシン イメージをカスタマイズするには、カスタマイズ レシピ(imagebuilder.yaml)の spec.steps ブロック内に特定のヘルパー アクションを定義します。
概要
Image Builder ビルドの実行フェーズでは、オーケストレーターは、カスタマイズ レシピ(spec.steps)で宣言されたステップを一時的なワーカー VM で順番に実行します。
各ステップでは、そのアクション タイプに合わせて調整された name、action、inputs ブロックを指定する必要があります。Image Builder は、次のカスタマイズ アクションをサポートしています。
Shell: ワーカー ゲスト OS でインライン ターミナル スクリプトまたはコマンドを実行します。UpdateKernelCommandLine: ブート パラメータとカーネル コマンドライン フラグを変更します。FileCopy: 構成ファイル、スクリプト、アセットを Cloud Storage またはローカル ワークスペースから VM に転送します。InstallGPU: NVIDIA GPU ドライバをダウンロード、コンパイル、登録します。
シェル操作
Shell アクションを使用すると、一時的なワーカー VM のゲスト OS でインライン ターミナル スクリプトまたは単一のシェル コマンドを実行して、パッケージの更新、ユーザー アカウントの構成、ソフトウェアのコンパイルなどのカスタマイズを行うことができます。
steps.inputs で次のいずれかの入力を指定します。
inlineScript(文字列): 実行する未加工の複数行のシェルコマンド。command(文字列): 単一のシステム コマンド文字列、またはバイナリ ファイル実行可能ファイルへの相対パス。
構成例
次のタブは、インライン スクリプトを実行する場合と単一のコマンドを実行する場合のステップ構成の例を示しています。
インライン スクリプトを実行する
次の構成では、apt を使用してパッケージを更新する複数行のスクリプトを実行します。
- name: "Update guest packages and configure groups"
action: Shell
inputs:
inlineScript: |
#!/bin/bash
apt-get update -y
apt-get install -y fail2ban build-essential
groupadd -r adminusers
単一のコマンドを実行する
次の構成では、単一のシェル コマンドを実行して、アクティブなオペレーティング システムのカーネル バージョンを確認します。
- name: "Log kernel identifier"
action: Shell
inputs:
command: "uname -a"
特別な動作
Shell アクションを実行すると、次のセクションで説明するように、カスタマイズ プロビジョナーがセキュリティ監査と自動システム再起動を管理します。
セキュリティ監査
機密性の高いトークン、シークレット、または独自のコードが実行ログに漏洩するのを防ぐため、カスタマイズ プロビジョナーは、インタラクティブ デバッグ(debug: true)が有効になっていない限り、スクリプトの未加工の行を出力しません。代わりに、スクリプト ペイロードの SHA-256 整合性ハッシュをビルドログに記録します。このハッシュは、イメージで実行されたコードの正確な不変の監査トレースを提供します。
システムの再起動(終了コード 3010)
カーネル パッチの更新やストレージ パーティションの調整など、一部のシェル アクションでは、後続のステップを実行する前にシステムの再起動が必要です。
カスタマイズ中にシステムの再起動をリクエストするには、シェル スクリプトを exit 3010 コマンドで終了する必要があります。カスタマイズ プロビジョナーが終了コード 3010 を受け取ると、再起動ライフサイクルは次のように処理されます。
- プロビジョナーは終了コード
3010を検出し、実行を一時停止して、ステップの進行状況インデックスをマークします。 - プロビジョナーがワーカー VM を再起動します。
- VM が再起動すると、プロビジョナーはワークスペースをマウントし、キューの次のステップでパイプラインを自動的に再開します。
再起動の例:
次の例は、パッケージを更新して再起動をリクエストするステップ構成を示しています。
- name: "Install core updates and request reboot"
action: Shell
inputs:
inlineScript: |
#!/bin/bash
echo "Applying configuration package upgrades..."
apt-get dist-upgrade -y
# Terminate with return code 3010 to trigger a system reboot
exit 3010
- name: "Post-reboot verification"
action: Shell
inputs:
command: "uname -r"
UpdateKernelCommandLine アクション
UpdateKernelCommandLine アクションは、コンソール ログの設定やカーネル パラメータの調整など、システムの起動時にカーネルに渡されるコマンドライン フラグを検索、置換、挿入、削除します。
steps.inputs マップで次のプロパティを指定します。
oldArguments(文字列、必須): ブートローダー構成内で検索、削除、置換する正確なコマンドライン引数。newArguments(文字列、省略可): ターゲット フラグの代わりに書き込む置換引数。newArgumentsプロパティを省略すると、Image Builder はoldArgumentsプロパティで構成されたパラメータをブートラインから完全に削除します。
構成例
次のタブは、カーネル ブート引数の置換または削除を行う手順の構成例を示しています。
ブート引数を置き換える
次の構成では、カーネル ログレベルキー loglevel=4 を見つけて、より詳細なパラメータ loglevel=6 console=ttyS0 に置き換えます。
- name: "Configure detailed boot logging"
action: UpdateKernelCommandLine
inputs:
oldArguments: "loglevel=4"
newArguments: "loglevel=6 console=ttyS0"
ブート引数を削除
次の構成では、パラメータ quiet を検索し、起動チェック フェーズで詳細なロギングを有効にするために、ブート引数から削除します。
- name: "Enable verbose startup diagnostics"
action: UpdateKernelCommandLine
inputs:
oldArguments: "quiet"
OS 固有の実行の詳細
次のタブでは、ソース ゲスト オペレーティング システムに応じてカスタマイズ プロビジョナーがイメージの変更を処理する方法について説明します。
Container-Optimized OS(COS)
COS は読み取り専用のパーティション レイアウトを備えているため、標準の構成ツールは省略されています。カスタマイズ プロビジョナーは次の処理を行います。
- アクティブなブートデバイスのパスを決定します。
- ブートデバイスのパーティション 12(EFI パーティション)をマウントします。
/efi/boot/grub.cfg内のブートローダー パラメータを直接更新します。- パーティション 12 を安全にマウント解除します。
Ubuntu
Ubuntu イメージでは、カスタマイズ プロビジョナーは次の処理を行います。
/etc/default/grubと/etc/default/grub.d/*.cfgの下のファイルを開きます。GRUB_CMDLINE_LINUXブロックの下にあるターゲット引数を挿入、変更、削除します。- パッケージ コマンド
update-grubを実行して、ブートローダー構成を再生成します。
FileCopy アクション
FileCopy アクションは、リモート バケットまたはローカル リポジトリからカスタム イメージに構成ファイル、バイナリ、証明書をコピーします。カスタマイズ プロビジョナーは、ソースファイルをダウンロードまたは読み取り、ワーカー VM の指定されたゲストパスに書き込み、権限を構成します。
steps.inputs で次の入力を指定します。
destination(文字列、必須): ファイルが作成されるゲスト OS の絶対パス。permissions(文字列、必須): ターゲット構成の権限の 8 進数表現("0755"や"0644"など)。- 次のいずれかのソース プロパティを指定します。
gcsSourcePath(文字列): ソースファイルの Cloud Storage URI。gs://BUCKET_NAME/OBJECT_NAME形式に従う必要があります。localSourcePath(文字列): ローカル ワークスペース リポジトリ フォルダ内のファイルへの相対パス。セキュリティ上の理由から、../を使用したパス トラバーサルはブロックされます。
構成例
次のタブは、Cloud Storage からファイルをコピーする場合とローカル ワークスペースからコピーする場合のステップ構成のサンプルを示しています。
Cloud Storage
次の構成では、Cloud Storage バケットから構成テンプレートをゲスト VM イメージにコピーします。
- name: "Import licensing configuration"
action: FileCopy
inputs:
gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
destination: "/etc/app/license.key"
permissions: "0600"
ローカル ワークスペース
次の構成では、前の Cloud Build ステップでコンパイルされたアプリケーション スクリプトをコピーします。
- name: "Deploy setup automation daemon"
action: FileCopy
inputs:
localSourcePath: "bin/setup-daemon"
destination: "/usr/local/bin/setup-daemon"
permissions: "0755"
OS 固有のガイドライン
次のタブでは、ターゲットのゲスト オペレーティング システムに応じたファイルの場所のガイドラインについて説明します。
Container-Optimized OS(COS)
COS イメージには、セキュリティ上の理由から読み取り専用のパーティション レイアウトが含まれています。/usr/ や /bin/ などの標準システム ターゲットの一部は書き込み保護されています。
COS でファイル出力先を構成する場合:
/varや/homeなど、書き込み可能なステートフルな場所にあるファイルのみを指定します。- 適切なパスを特定するには、公式の Container-Optimized OS のディスクとファイル システムのリファレンスをご覧ください。
Ubuntu
Ubuntu イメージには、標準の Linux 読み取り / 書き込みルート パーティション レイアウト(/)が用意されています。ユーザー プロファイルまたは宛先フォルダにワーカー VM に対する適切な構成権限がある場合は、/etc、/usr/local/bin、/var、/home などの標準システムパス内のファイル宛先を指定できます。
InstallGPU アクション
InstallGPU アクションを使用して、ML、データ サイエンス、科学的ワークロード用に最適化された VM イメージを構築します。Image Builder は、カスタム イメージで NVIDIA GPU ドライバをダウンロード、コンパイル、登録します。ベースイメージのタイプとターゲット ハードウェアに応じて、事前コンパイル済みドライバをインストールするか、カスタム ドライバの .run ファイルをコンパイルするかを選択できます。
steps.inputs で次のいずれかの入力を指定します。
version(文字列): ターゲットの NVIDIA ドライバ バージョン番号("595.129.03"など)。versionのみを指定すると、オーケストレーターは公式の NVIDIA リポジトリ(https://us.download.nvidia.com/tesla/<version>)からドライバをダウンロードします。gcsRunfile(文字列): カスタム NVIDIA ドライバ インストーラ ファイルの Cloud Storage パス。gs://BUCKET_NAME/OBJECT_NAME.run形式を使用する必要があります。sourceRunfile(文字列): ローカル ワークスペース リポジトリ フォルダ内のインストーラ.runファイルへの相対パス。
構成例
次のタブは、特定の事前パッケージ化されたドライバ バージョンをインストールする場合と、カスタム実行ファイルをインストールする場合のステップ構成の例を示しています。
標準版のダウンロード
次の構成では、公式リポジトリから指定された NVIDIA ドライバ バージョンをダウンロードしてインストールします。
- name: "Configure default NVIDIA drivers"
action: InstallGPU
inputs:
version: "<var>DRIVER_VERSION</var>"
Cloud Storage ランファイル
次の構成では、カスタム NVIDIA ドライバ .run インストーラを Cloud Storage バケットから直接デプロイします。
- name: "Deploy custom GPU driver from Cloud Storage"
action: InstallGPU
inputs:
gcsRunfile: "gs://<var>BUCKET_NAME</var>/drivers/NVIDIA-Linux-aarch64-<var>DRIVER_VERSION</var>.run"
ローカル ワークスペースの実行ファイル
次の構成では、ローカル リポジトリ ワークスペースからカスタム NVIDIA ドライバ .run インストーラをデプロイします。
- name: "Deploy custom GPU driver from workspace"
action: InstallGPU
inputs:
sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"
構成メソッド
次のタブでは、カスタム イメージで NVIDIA GPU ドライバを構成するためにサポートされている方法について説明します。
プリコンパイルされたドライバ
ドライバをゼロからコンパイルする際のコンピューティング オーバーヘッドとビルド時間を回避するため、プリパッケージされたドライバ バージョンを使用することをおすすめします。
Container-Optimized OS(COS): Google が事前にパッケージ化したドライバ バージョンを指定すると、カスタマイズ プロビジョナーはゲストツール
cos-extensions install gpuを実行して有効にします。COS リリースでサポートされている事前コンパイル済みドライバのバージョンのリストを表示するには、実行中の COS インスタンスで
sudo cos-extensions listを実行するか、GPU ドライバのバージョンを特定するをご覧ください。Ubuntu: Ubuntu でビルド時間を短縮するには、NVIDIA ドライバがプリインストールされている公開
ubuntu-os-accelerator-imagesプロジェクトから、事前構成済みのベースイメージを選択することをおすすめします。使用可能なアクセラレータ イメージを一覧表示するには、
gcloudCLI で次のコマンドを実行します。gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
カスタム ランファイル
Google または Canonical によってプリコンパイルされていないカスタム ドライバ バージョンをインストールする必要がある場合は、次のようにコンパイル用のインストーラ実行ファイルを直接指定できます。
- Ubuntu: ゲスト内コンパイルを実行します。カスタマイズ プロビジョナーは、一致するカーネル ヘッダー(
linux-headers-$(uname -r))を自動的にインストールし、ワーカー VM で NVIDIA ドライバ.runファイルをコンパイルして、Dynamic Kernel Module Support(DKMS)に登録します。DKMS に登録すると、マイナー カーネルの更新後もドライバがアクティブな状態を維持できます。 - Container-Optimized OS(COS): コンパイルの動作は、ソースベースの VM イメージの CPU アーキテクチャによって異なります。
- ARM64 イメージ: ARM64 COS VM はゲスト内ヘッダー コンパイルをサポートしていないため、Image Builder はビルド コンテナ内でカスタム ドライバ
.runユーティリティを自動的にクロス コンパイルし、結果のバンドルをワーカー VM の/var/lib/nvidiaにインストールします。 - x86-64 イメージ: ゲスト内コンパイルをワーカー VM で直接実行します。
- ARM64 イメージ: ARM64 COS VM はゲスト内ヘッダー コンパイルをサポートしていないため、Image Builder はビルド コンテナ内でカスタム ドライバ
次のステップ
- 画像カスタマイズ ファイルのスキーマで最上位のスキーマ ブロックを確認します。
- Cloud Build 構成ファイル スキーマでパイプライン オーケストレーション パラメータを構成します。
- チュートリアルに沿って、Image Builder パイプラインを作成します。