Red Hat Linux V9.3移行後のKVMゲストOS再構築

## はじめに
先日、個人のRHEL検証環境をV8.9からV9.3へアップグレードを実施しました。その時の内容については下記の記事にまとめていますので、ご参照ください。

https://qiita.com/duelist2020jp/items/929561d1541bcf3672a9

当環境では、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)というものがありました。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/configuring_and_managing_virtualization/index#types-of-virtual-devices_managing-virtual-devices

RHEL V9のドキュメントを確認してみたところ、V9からこの準仮想化グラフィックカード(qxl)の記載がなくなっていることに気づきました。記載がないことから、確かにサポートされなくなったものと思います。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html-single/configuring_and_managing_virtualization/index#types-of-virtual-devices_managing-virtual-devices

RHEL V9のリリースノートもチェックしてみましたが、仮想化関連で全くそのような情報の記載はありませんでした。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/9.0_release_notes/enhancement_virtualization

これも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
```
```xml: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環境に影響がありましたので、今後アップグレードを検討ないしは予定されている方への参考になれば幸いです。