はじめに
先日、個人のRHEL検証環境をV8.9からV9.3へアップグレードを実施しました。その時の内容については下記の記事にまとめていますので、ご参照ください。
当環境では、RHEL V8使用時からKVM環境を作成し、KVMのゲストOSにCentOS 7.0をインストールして使用してきました。先日、RHEL V9アップグレード後に無影響確認を兼ねて、このKVMゲストOSを起動しようとしたところ、予期せぬ起動エラーに見舞われることとなったため、KVMゲストOSの再導入を行いました。
本記事では、アップグレード後にKVMゲストOSの起動に失敗した原因と、KVMゲストOSの再導入記録をまとめました。
KVMゲストOS起動時のエラー事象
KVM環境
筆者のKVM環境は、下記のようにディスクをKVMホスト/KVMゲストそれぞれにおいて、LVMを構成しています。
- KVMホストのディスク
- VG(ボリューム・グループ)名:rhel
- LV(ロジカル・ボリューム)名:root
- LV Path:/dev/rhel/root
- KVMゲストのディスク
- VG(ボリューム・グループ)名: rhel-guest
- LV(ロジカル・ボリューム)名: guest
- LV Path:/dev/rhel-guest/guest
KVMゲストOSの起動は、libvirtユーティリティーが提供しているvirshコマンドで起動しますが、その際に指定するドメイン名を「test-vm1」としています。
KVMゲストOSの仮想ディスクイメージは、QCOW2と呼ばれるストレージ形式で、「/var/lib/libvirt/images/」ディレクトリ配下に「test-vm1.qcow2」というネーミングで作成されています。virshコマンドでKVMゲストOSを起動すると、この「test-vm1.qcow2」という仮想ディスクイメージを読み込んでゲストOSのブート処理が行われます。
筆者のKVM環境では、この仮想ディスクイメージを上記に記載しているKVMゲスト用のLVMに保管しています。その為、KVMゲストOSを起動する際には、事前に当該LVMを「/var/lib/libvirt/images」にマウントしておく必要があります。
# mount /dev/rhel-guest/guest /var/lib/libvirt/images
KVMゲストOS起動
起動前のステータスは下記の通りです。
# virsh list --all
Id 名前 状態
-------------------------------
- test-vm1 シャットオフ
この後、KVMゲストOSを起動しようとすると、下記のメッセージが出力されて、起動が失敗しました。
# virsh start test-vm1 --console
エラー: ドメイン 'test-vm1' の起動に失敗しました
エラー: サポートされない設定: ドメイン設定はビデオモデル 'qxl' をサポートしません
起動エラーの原因
KVMはLinuxをハイパーバイザーとして仮想化を提供しており、KVMゲストOSはKVMホストOSの仮想デバイスを擬似的なハードウェアとして利用しています。仮想デバイスのパフォーマンスを良くするために、準仮想化デバイスが使われますが、RHEL V8まではその準仮想化デバイスとしてサポートしている物の中に、準仮想化グラフィックカード(qxl)というものがありました。
RHEL V9のドキュメントを確認してみたところ、V9からこの準仮想化グラフィックカード(qxl)の記載がなくなっていることに気づきました。記載がないことから、確かにサポートされなくなったものと思います。
RHEL V9のリリースノートもチェックしてみましたが、仮想化関連で全くそのような情報の記載はありませんでした。
これもRHEL V9の新規インストールではなく、V8からV9へのアップグレードを行ったことによる新たな気づきとなりました。
KVMゲストOS再構築
KVMゲストOS環境を再構築するにあたり実施した作業内容は下記の通りです。
- 現行のKVMゲストOS環境のドメインを下記コマンドで削除
# virsh undefine test-vm1
ドメイン 'test-vm1' の定義が削除されました
# virsh list --all
Id 名前 状態
-------------------
- 現行の仮想ディスクイメージファイル「test-vm1.qcow2」を削除
- KVMゲストOSの再インストール
GUI形式でのインストールを行うためにvirt-viewerの起動が必要になります。これを行うために、RHELのデスクトップ環境にログオンした上で、下記のコマンドを実行します。
--cdromオプションに指定するISOファイルは事前にダウンロードの上、KVMホストOS上に保管しておきます。
# virt-install --name test-vm1 --memory 1024 --vcpus 2 --disk size=6 --os-variant centos7.0 --cdrom /home/testuser/data/CentOS-7-x86_64-Minimal-2207-02.iso
Starting install...
Allocating 'test-vm1.qcow2' | 6.0 GB 00:00:00
Creating domain... | 00:00:00
Running graphical console command: virt-viewer --connect qemu:///system --wait test-vm1
KVMゲストOSのインストールが完了すると、virt-viewer上にCentOS 7.0のログオン画面が表示されます。また、KVMホストOSの「/var/lib/libvirt/images」ディレクトリ配下に、KVMゲストOSの仮想ディスクイメージファイルが作成されたことがわかります。
# ls -l /var/lib/libvirt/images
合計 2096448
drwx------. 2 root root 16384 4月 23 2022 lost+found
-rw-------. 1 qemu qemu 6443696128 4月 23 21:52 test-vm1.qcow2
KVMゲストOSのシリアルコンソール定義
virt-viewr上で、KVMゲストOSにrootユーザーでログオンし、下記の設定を行います。
- /etc/default/grubのGRUB_CMDLINE_LINUXで始まる行に"console=tty0 console=ttyS0"を追加。
- 変更を反映させない可能性があるkernelオプションを下記のコマンドを実行して削除する。
# grub2-editenv - unset kernelopts
- 上記設定内容を反映させるために、下記のコマンドを実行。
# grub2-mkconfig -o /boot/grub2/grub.cfg
- KVMゲストOSをシャットダウン
後は、KVMホストOS(RHEL V9.3)側で再度KVMゲストOSを起動すれば、KVMホストOSにSSH接続しているターミナル上でKVMゲストOS(CentOS 7.0)のログオン画面を表示することができるようになります。
# virsh start test-vm1 --console
ドメイン 'test-vm1' が開始しました
ドメイン 'test-vm1' に接続しました
エスケープ文字は ^] です (Ctrl + ])
[ OK ] Started Show Plymouth Boot Screen.
[ OK ] Reached target Paths.
[ OK ] Started Forward Password Requests to Plymouth Directory Watch.
[ OK ] Reached target Basic System.
:
:
Welcome to CentOS Linux 7 (Core)!
:
:
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.114.2.el7.x86_64 on an x86_64
localhost login:
KVMゲストOSのホスト名変更
デフォルトでは、KVMゲストOSのホスト名は上記の通り「localhost」となっています。KVMホストOSもホスト名は「localhost」となっていて紛らわしいので、KVMゲストOSのホスト名を変更します。KVMゲストOSにrootユーザ-でログオンし、下記のコマンドを実行します。
# hostnamectl set-hostname test-vm1
# hostnamectl status
Static hostname: test-vm1
Icon name: computer-vm
Chassis: vm
Machine ID: 4e038f5efeda4a45ba8579234c81b457
Boot ID: 02371492e61a44969725566be72e3a35
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.114.2.el7.x86_64
Architecture: x86-64
この後、KVMゲストからログオフすると、以下のようにホスト名が「test-vm1」に変わります。
# exit
ログアウト
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.114.2.el7.x86_64 on an x86_64
test-vm1 login:
これで、KVMゲストOSの再構築作業は完了です。
さいごに、再作成後のKVMゲストOSのDumpXMLファイルを下記のコマンドで作成しておきます。今後のテンプレートとして活用することができるようになります。
# virsh dumpxml test-vm1 > /home/testuser/data/test-vm1.xml
<domain type='kvm'>
<name>test-vm1</name>
<uuid>4e038f5e-feda-4a45-ba85-79234c81b457</uuid>
<metadata>
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
<libosinfo:os id="http://centos.org/centos/7.0"/>
</libosinfo:libosinfo>
</metadata>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-q35-rhel9.2.0'>hvm</type>
<boot dev='hd'/>
</os>
:
:
(略)
:
:
</domain>
さいごに
本記事では先日実施したRHEL V8.9からV9.3へのアップグレード後にKVMゲストOSの起動に失敗した原因、それに伴うKVMゲストOSの再導入記録をご紹介しました。
RHELを新規インストールされる場合は、KVM環境も新規作成することになるので、特に気にすることはないと思います。
ただ、今回のようにRHELをアップグレードした場合ですと、一部の仮想デバイスがサポートされなくなったことで既存のKVM環境に影響がありましたので、今後アップグレードを検討ないしは予定されている方への参考になれば幸いです。