KVMホストOSを新規導入した際のKVMゲストOS構築躓きポイント～RHEL編

## はじめに
昨年12月中旬に自宅PCの買い替えをしました。以前は、富士通社のノートPC(SSD：256GB、メモリ：8GB)を使用していましたが、ここ2,3か月の間に長時間大きなファンの回転音が続くようになり、さすがに耐えられなくなったので、HP社のノートPC(SSD:512GB、メモリ：16GB)のAIパソコンに替えることにしました。
私は、旧PC時代から、VMWare Workstaion Proをインストールし、その上にRHELを導入してKVM環境を構築していました。
* 当時の構成
  * KVMホストOS：RHEL9.5 (メモリ:4GB) ※メモリはKVMゲストOS利用分含む
  * KVMゲストOS：CentOS7.0 (メモリ：1GB)

 今回、PCの買い替えに伴い、PCの性能も向上したので、せっかくならばとKVMゲストOSにもRHEL9.5を入れた下記の構成に変更しました。
 * 今回の構成
   * KVMホストOS：RHEL9.5 (メモリ：4GB) ※メモリはKVMゲストOS利用分含む
   * KVMゲストOS：RHEL9.5 (メモリ：2GB) 

最終的には構築成功できましたが、今回KVMホストOSも新規インストールしたこともあり、すんなりとはいかない部分がありましたので、その点について今後のために備忘録としてまとめました。

## 環境構築時の躓きポイント
### virt-installコマンド実行時にqemu(Quick Emulator)の処理で、Permission Deniedでエラーとなる。

KVMホストOS上で、下記のコマンドを実行します。
```
# virt-install --name vm-guest1 --memory 2048 --vcpus 2 --disk size=19 --os-variant rhel9.5 --cdrom /home/testuser/temp/rhel-9.5-x86_64-boot.iso
```
すると、下記のようなエラーが出力されました。
```
WARNING  /home/testuser/temp/rhel-9.5-x86_64-boot.iso は、ハイパーバイザーからアクセスできない可能性があります。'qemu' ユーザーに、次のディレクトリーの検索パーミッションを付与する必要があります: ['/home/testuser']
WARNING  /home/testuser/temp/rhel-9.5-x86_64-boot.iso は、ハイパーバイザーからアクセスできない可能性があります。'qemu' ユーザーに、次のディレクトリーの検索パーミッションを付与する必要があります: ['/home/testuser']

インストールの開始中...
'vm-guest1.qcow2' を割り当てています                                                                                |  19 GB  00:00:00     
ディスク 'vm-guest1.qcow2' を削除中                                                                                |         00:00:00     
ERROR    内部エラー: モニターへの接続中にプロセスが終了しました: 2025-01-13T02:05:39.330248Z qemu-kvm: -blockdev {"driver":"file","filename":"/home/testuser/temp/rhel-9.5-x86_64-boot.iso","node-name":"libvirt-1-storage","read-only":true}: Could not open '/home/testuser/temp/rhel-9.5-x86_64-boot.iso': Permission denied
仮想マシンのインストールが成功したように見えません。
成功していれば、次を実行すると、仮想マシンを再起動できます:
  virsh --connect qemu:///system start vm-guest1
そうでなければ、インストールをやり直してください。
```
原因は、qemuユーザーが/home/testuserディレクトリに対するアクセス権がなかったことでした。PCの買い替えにより、KVMホストOSも新規インストールしていたので、このあたりの設定が外れてしまっていたものと思います。
```
$ id qemu
uid=107(qemu) gid=107(qemu) groups=107(qemu),36(kvm)
$ ls -l /home
合計 4
drwx------. 19 testuser testuser 4096  1月 11 19:15 testuser
```
そこで、/homeディレクトリで以下の処理を行うことで、Permission Deniedのエラーは解決することができました。
```
$ sudo usermod -aG testuser qemu
$ id qemu
uid=107(qemu) gid=107(qemu) groups=107(qemu),36(kvm),1000(testuser)
$ chmod 750 testuser
$ ls -l
合計 4
drwxr-x---. 19 testuser testuser 4096  1月 11 19:15 testuser
```
対応後のコマンド実行結果は下記のとおりです。
```
# virt-install --name vm-guest1 --memory 2048 --vcpus 2 --disk size=19 --os-variant rhel9.5 --cdrom /home/testuser/temp/rhel-9.5-x86_64-boot.iso

WARNING  /home/testuser/temp/rhel-9.5-x86_64-boot.iso は、ハイパーバイザーからアクセスできない可能性があります。'qemu' ユーザーに、次のディレクトリーの検索パーミッションを付与する必要があります: ['/home/testuser']
WARNING  /home/testuser/temp/rhel-9.5-x86_64-boot.iso は、ハイパーバイザーからアクセスできない可能性があります。'qemu' ユーザーに、次のディレクトリーの検索パーミッションを付与する必要があります: ['/home/testuser']

インストールの開始中...
'vm-guest1.qcow2' を割り当てています                                                                               |  19 GB  00:00:00     
ドメインを作成中...                                                                                               |         00:00:00     
グラフィカルコンソールコマンドを実行しています: virt-viewer --connect qemu:///system --wait vm-guest1

(virt-viewer:5961): virt-viewer-WARNING **: 11:44:23.415: vnc-session: got vnc error Server closed the connection
仮想マシンの作成が完了しました。
ゲストを再起動しています。
グラフィカルコンソールコマンドを実行しています: virt-viewer --connect qemu:///system --wait vm-guest1

(virt-viewer:6258): virt-viewer-WARNING **: 11:52:05.648: vnc-session: got vnc error Server closed the connection
```
コマンド実行後にWarningが消えない点が釈然としないものの、KVMゲストOSのインストール作業には問題なく進むことができたので、とりあえず良しとします。

### RHELでは各バージョンでシリアルコンソールの設定方法が異なる
KVMホストOS上で、KVMゲストを起動した後は、KVMゲストOSに一時的にログオンして作業したい場合などに備え、KVMゲスト上でシリアルコンソールの定義をしておくと便利です。
以前、CentOS7.0をKVMゲストOSとして使用していた際に設定した方法でシリアルコンソールの指定をするも、KVMゲストOS再起動後にシリアルコンソールが表示されなかったので、調べたところ、RHELでは各々バージョンでシリアルコンソールの設定方法が異なっていることがわかりました。詳細は下記のサイトに記述があります。(ちなみに、CentOS7.0のシリアルコンソールの設定方法は、RHEL7の場合と同様です。)

https://access.redhat.com/ja/articles/4259721#config9

上記リンク先の「Red Hat Enterprise Linux 9」の箇所に、RHEL9におけるシリアルコンソールの設定方法が書いてありますので、これを参考に以下のコマンドをKVMゲストOS上で実行した後、再度KVMゲストOSを起動することで無事シリアルコンソールを表示させることができました。grubbyというコマンドも初めて目にしました。

```
# grubby --update-kernel=ALL --args="console=ttyS0"
```
KVMゲストOSの再起動結果です。
```
# virsh start vm-guest1 --console
ドメイン 'vm-guest1' が開始しました
ドメイン 'vm-guest1' に接続しました
エスケープ文字は ^] です (Ctrl + ])
[  OK  ] Started Show Plymouth Boot Screen.
[  OK  ] Started Forward Password Requests to Plymouth Directory Watch.
[  OK  ] Reached target Path Units.
[  OK  ] Found device /dev/mapper/rhel-root.
：
：
Red Hat Enterprise Linux 9.5 (Plow)
Kernel 5.14.0-503.21.1.el9_5.x86_64 on an x86_64

Activate the web console with: systemctl enable --now cockpit.socket

localhost login:
```
## さいごに
今回はKVMホストOSを新規インストールした場合に、KVMゲストOSを構築する際に遭遇する可能性のある躓きポイントをRHELの場合を実例としてまとめました。特にRHELの場合はシリアルコンソールの設定方法が、RHELのバージョンごとに異なるため、シリアルコンソールを設定している場合、KVMゲストOSのRHELのバージョンを変更する際には注意が必要です。

## (参考)KVMホストメモリ使用量確認
KVMゲストOS起動停止前後のKVMホストOSのメモリ使用量は下記のようになりました。
* KVMゲストOS起動中
```
# free
               total        used        free      shared  buff/cache   available
Mem:         3712588     2261584      808044        4944      879972     1451004
Swap:        2097148      645120     1452028
```
* KVMゲストOS停止中
```
# free
               total        used        free      shared  buff/cache   available
Mem:         3712588     1004976     2060724        4940      883888     2707612
Swap:        2097148      645120     1452028
```
KVMゲストOS起動中も、KVMホストOSのパフォーマンスは割と良好でした。