【vSphere】RHEL9のテンプレート仮想マシンを作成してみた(仮想マシンのカスタマイズ仕様使う前提)

どうも、Tです。

vSphere環境でRHEL9のテンプレート用仮想マシンを作っており、難儀したので忘れないように備忘録です。

これっ!という確実な設定はありませんので、本番環境作るときの参考情報程度にみてください。

本手順は、テンプレート仮想マシンからのクローン時にvSphereの仮想マシンのカスタマイズ仕様とカスタマイズスクリプトを使うことを前提にしています。
カスタマイズスクリプトについては、記事にしていますのでご参考ください。
【vSphere】仮想マシンのカスタマイズスクリプトをRHEL9で使ってみた
どうも、Tです。 以前、「【vSphere】仮想マシンクローンのカスタマイズがうまく動かないときに確認した方がよいこと」という記事を書...

環境

今回検証した環境です。

vSphere環境

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

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

  • Red Hat Enterprise Linux release 9.2 (Plow)
  • open-vm-tools:12.1.5.39265 (build-20735119)

テンプレート仮想マシンは、ISOメディアから手動でインストールしたものを利用しています。

やりたいこと

概要

本手順では、テンプレートとして用したRHEL9の仮想マシンを仮想マシンのカスタマイズ仕様を使って簡単にクローンを作成しようという思いからはじまりました。

カスタマイズ仕様の設定は後ほど記載します。

内容

実施内容 実施タイミング 実施方法
RHNの削除 テンプレート作成時 手動
hostsファイルの確認 テンプレート作成時 手動
MACアドレスエントリ削除 テンプレート作成時 手動
マシンID削除 クローン時 カスタマイズ仕様で自動的に処理
SSHキー削除 クローン時(Pre処理) カスタマイズ仕様のスクリプト
MAC・インターフェース関連削除 クローン時(Pre処理) カスタマイズ仕様のスクリプト
ifcfg-rh 形式ファイルの削除 クローン時(Pre処理) カスタマイズ仕様のスクリプト
keyfile形式ファイルの削除 クローン時(Pre処理) カスタマイズ仕様のスクリプト
ifcfg-rh 形式と keyfile 形式変換 クローン時(Post処理) カスタマイズ仕様のスクリプト

テンプレート仮想マシンを作成する(およびクローンするとき)に必要な項目をまとめました。

本記事では、上から順番に記載していきますが、RHEL9で重要となったkeyfileについて先に説明していきます。

ifcfg-rh 形式と keyfile 形式変換とは

RHEL9からネットワークファイル(接続プロファイル)の保存方法が大きく変わりました。

形式 ファイル場所 ファイル名 操作
【推奨】keyfile /etc/NetworkManager/system-connections <インターフェース名>.nmconnection ツールベース
【非推奨】ifcfg-rh /etc/sysconfig/network-scripts ifcfg-<インターフェース名> ファイルベース

RHEL9からは、ネットワークインターフェースの設定が従来のifcfg-rh形式が非推奨となり、NetworkManagerで管理し設定はnmcli・nmtuiなどのツールを使って管理をするkeyfileベースが推奨になりました。

どちらかしか使えないわけではなく、ISOから手動でインストールした場合は、keyfileになる設定ファイルが使用され、手動で追加・変更したなどでifcfgがあればifcfgが使われる(どちらを優先するかは優先度の設定による)という結構モヤモヤする状況になっています。

RHEL 9 ネットワーキング:ifcfg ファイルからキーファイルへ
デフォルトでは、NetworkManager はキーファイル形式を使用して新しい接続プロファイルを保存するようになりました。ただし、ifcfg 形式も引き続きサポートされます。

「/etc/sysconfig/network-scripts/readme-ifcfg-rh.txt」には下記のように記載されています。(一部抜粋)

Previously, NetworkManager stored network profiles in ifcfg format
in this directory (/etc/sysconfig/network-scripts/). However, the ifcfg
format is deprecated. By default, NetworkManager no longer creates
new profiles in this format.

Connection profiles in keyfile format have many benefits. For example,
this format is INI file-based and can easily be parsed and generated.

vSphereのカスタマイズ仕様で内部的に処理されるのは、ifcfgファイルです。カスタマイズ仕様のネットワーク設定値をデフォルト値としてもifcfgファイルが生成されて、keyfileは扱ってもらえません。2023年7月現在は、keyfileよりifcfgを優先する処理も行ってくれるようで、通常使う分には問題にならないのですが、ifcfgファイルが使われる状況は避けられない感じになっています。

個人的にカスタマイズ仕様は便利なので使いたけど、非推奨のifcfgファイルは使いたくないという思いから、テンプレート仮想マシンからクローンした後にカスタマイズ仕様の中のカスタムスクリプトでifcfg-rh形式からkeyfile形式に変換する方法にしました。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/configuring_and_managing_networking/proc_migrating-networkmanager-profiles-from-ifcfg-to-keyfile-format_assembly_manually-creating-networkmanager-profiles-in-keyfile-format

この前提のもと本記事を読み進めていただけると幸いです。

テンプレート仮想マシンの手動設定

RHNの削除

テンプレート仮想マシンがRHNに登録しているようであれば、下記のコマンドで登録を削除しておきます。

# subscription-manager unregister
# subscription-manager remove --all
# subscription-manager clean
  • unregister:RHNからシステムの登録を削除
  • remove –all:システムに登録しているサブスクリプションをすべて削除
  • clean:サーバーに影響を及ぼさずシステムとサブスクリプションデータをすべて削除

hostsファイルの確認

hostsファイルに不要な登録を削除しておきます。(下記参照)

# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
インストール直後は上記のように何も登録されていません。

MACアドレスエントリ削除

nmconnectionファイルにMACアドレスが登録されている場合は手動で削除しておきます。

# cat /etc/NetworkManager/system-connections/ens33.nmconnection
--割愛--
[ethernet]
mac-address=00:50:56:82:6C:25
--割愛--

RHEL9ではインストール直後のようなMACアドレスは登録されていませんでした。

また、MACアドレスを削除しておく必要はありますが、この後の手順で「ens33.nmconnection」ファイル自体を削除するため本記事に限っては本手順は不要です。

一般的な考慮点として記載しています。

仮想マシンのカスタマイズ仕様

カスタマイズ仕様の内容

検証に使用したカスタマイズ仕様設定を記載しておきます。

以後は、主にカスタマイズスクリプトについての説明になります。

#!/bin/sh
if [ x$1 == x"precustomization" ]; then
echo Do Precustomization tasks
rm -rf /etc/ssh/ssh_host_*
rm -rf /etc/udev/rules.d/70-persistent-*
rm -rf /etc/sysconfig/network-scripts/ifcfg*
rm -rf /etc/NetworkManager/system-connections/*nmconnection*
elif [ x$1 == x"postcustomization" ]; then
echo Do Postcustomization tasks
nmcli connection migrate
fi

マシンID削除

いきなりカスタマイズスクリプトではない説明になります。

RHELでは永続的に変更されてない、一意に識別するためのmachine-idが生成されています。※後半はxで置き換えています。

# cat /etc/machine-id
a8dbad134c0c45bxxxxxxxxxxxxx

テンプレート仮想マシンでは以下のようにIDが状態にしておくのですが、machine-idはない場合に起動時に自動生成されます。

# echo "uninitialized" > /etc/machine-id

いれるとしたらカスタマイズスクリプトのpre処理のタイミングですが、vSphereのカスタマイズ仕様を使用する場合、machine-idを自動生成してくれているので明示的な処理は不要です。考慮点として覚えておく必要があるため備忘録として記載しました。

【pre処理】SSHキー削除

カスタムスクリプトの下記の部分になります。

rm -rf /etc/ssh/ssh_host_*

SSHで使用される秘密鍵と公開鍵をすべて削除しています。

秘密鍵と公開鍵は存在しない場合は、自動的に作成されます(これはRHELの動作仕様でありvSphereのクローン処理とは関係ありません。)

【pre処理】MAC・インターフェース関連削除

カスタムスクリプトの下記の部分になります。

rm -rf /etc/udev/rules.d/70-persistent-*

実際この処理はなくとも大丈夫です。

RHEL6では「70-persistent-net.rules」ファイルでMACアドレスとインターフェース名を紐づける処理を行っていました。この方法はRHEL7以降非推奨となり、RHEL7以降は「Predictable Network Interface 命名」が使用されています。

RHEL7、RHEL8、RHEL9 で net.ifnames=0 を設定した場合の安全性 - Red Hat Customer Portal
RHEL7、RHEL8、RHEL9 のカーネルコマンドラインで net.ifnames=0 を設定して、Consistent Device Naming を無効にしても安全ですか? 以前のバージョンの Red Hat Enterprise Linux では 70-persistent-net.rules ファイルを使用...

ただ、RHEL9でもnet.ifnames=0を使うことによりRHEL6のような挙動を行うことが可能です。そのため、ファイルがもし存在した場合は削除する処理を念のため入れています。

【pre処理】ifcfg-rh 形式ファイルの削除

カスタムスクリプトの下記の部分になります。

rm -rf /etc/sysconfig/network-scripts/ifcfg*

ifcfgファイルが存在していた場合、なにか不穏な動きをしないか確定できなかっためカスタマイズが始まる前に削除する処理を念のためいれています。「*ifcfg*」のようにしていないのは、「readme-ifcfg-rh.txt」を削除しないようにするためです。

【pre処理】keyfile形式ファイルの削除

カスタムスクリプトの下記の部分になります。

rm -rf /etc/NetworkManager/system-connections/*nmconnection*

post処理でカスタマイズ仕様により生成されたifcfgファイルをkeyfileに変換をしますが、元のkeyfile(ens33.nmconnectionなど)が残っている状態で変換を行うと元のkeyfile名の後ろに長い英数字を付けて新たなファイルを生成する動作を確認できたため事前にkeyfileを削除しています。

【post処理】ifcfg-rh 形式と keyfile 形式変換

カスタムスクリプトの下記の部分になります。

nmcli connection migrate

上記コマンドで、存在するすべてのifcfgファイルをもとに、keyfileを生成します。

なお、変換が成功した場合は元のifcfgは自動的に削除されますので変換コマンド1つで問題ありません。

クローン後の確認

あとは、テンプレートからクローンする際に「ゲストOSのカスタマイズ」で作成した仕様を指定すればネットワーク回りを考慮したクローンが行えます。

クローン後は各所カスタマイズした部分などを確認すると思いますので割愛しますが、ネットワーク部分は「nmcli -f NAME,DEVICE,FILENAME connection show」の結果を確認しておきましょう。

出力結果を見ると各インターフェースがどの構成ファイルを使用しているのかわかります。

# nmcli -f NAME,DEVICE,FILENAME connection show
NAME DEVICE FILENAME
ens33 ens33 /etc/NetworkManager/system-connections/ens33.nmconnection
lo lo /run/NetworkManager/system-connections/lo.nmconnection

処理がうまくいっていない場合、同じ名前のインターフェースが異なる設定ファイルで読み込まれ不要なはずのごみインターフェースが表示されたりします。

RHEL9のクローン処理に関する問題

その他、本記事の検証をしている際に見つけたRHEL9のクローンに関する情報をまとめてきます。

※vSphere環境が関係ないものもあります。

vSphere7環境でkeyfile絡みの問題でした。本記事と同じように回避可能かと思います。

Create VM from template with RHEL9 use network-script instead of NetworkManager and keyfile format · Issue #1645 · ansible-collections/community.vmware
SUMMARY When creating virtual machine from template with community.vmware collection with Rocky Linux 9.1 template, network config are stored in /etc/sysconfig/...

vSphereでクローンしたときに、keyfile絡みでネットワークが正常に設定できない問題です。回避策もあり、新しいvSphereパッチでは解決になっていますが、どちらもifcfgを使うのが現在のvSphereのスタンダードな姿勢のようです。

Guest OS Customization may fail to set network configuration on virtual machine which NetworkManager keyfile is activated

virt-sysprepをRHELで使った場合のLVMのUUID絡みの問題です。vSphere環境では特に問題なさそうでした。

Why RHEL 9 virtual machine booting is stuck or is booting into emergency mode after cloning the virtual machine from a sealed image? - Red Hat Customer Portal
After sealing the virtual machine using sealing software, the virtual machine is stuck in booting or booting into an emergency shell. RHEL 9 virtual machine tem...

参考

How to seal a RHEL8/RHEL9 virtual machine - Red Hat Customer Portal
How to seal a RHEL 8/RHEL 9 virtual machine to use it as a template.
Why RHEL 9 virtual machine booting is stuck or is booting into emergency mode after cloning the virtual machine from a sealed image? - Red Hat Customer Portal
After sealing the virtual machine using sealing software, the virtual machine is stuck in booting or booting into an emergency shell. RHEL 9 virtual machine tem...
Chapter 11. Cloning virtual machines | Red Hat Product Documentation
Chapter 11. Cloning virtual machines | Red Hat Documentation

まとめ

RHEL9でいよいよnetwork-scriptsパッケージが削除されてNetworkManagerに統一されてしまったため、推奨でkeyfileに乗り換えてみました。

Why are scripts under /etc/sysconfig/network-scripts directory gone on rhel8/rhel9? - Red Hat Customer Portal
Why are scripts under /etc/sysconfig/network-scripts directory gone in rhel8/9? How to install scripts under /etc/sysconfig/network-scripts directory in rhel8/9...

カスタマイズ仕様自体は便利なので、VMware社さんも対応してくれると嬉しいなぁ。