KVMで仮想環境を構築する

KVM機能のインストール

CentOS9のインストール時に、ソフトウェアの選択画面になるが、Server with GUI もしくは、Server(GUIなし)のどちらかを選ぶが
今回は、自宅オンプレサーバーのため、GUIで仮想環境を管理する。(CUIでも管理可能)

CentOS 9でKVM(Kernel-based Virtual Machine)機能を利用する際の主な留意点

 

Server with GUIには、KVM関連は自動でインストールされないため、その他のソフトウェアで以下の項目にチェックを入れる。
① Virtualization Client
② Virtualization Hyperviser
③ Virtualization Tools


あとから気づいたんですが、ソフトウェア選択画面でVirtualization Hostとしてホスト専用のモードもあるみたいでした。(構築後気づいた!)
まずは、上記3つのチェックを入れれば、問題ないです。


Virtualization Clientでは、KVM (Kernel-based Virtual Machine)とその関連ツールがインストールされる。これには以下のようなパッケージが含まれる。
qemu-kvm: 仮想化環境を提供するソフトウェア。
libvirt: 仮想化環境を管理するためのライブラリとAPI。
virt-install: 仮想マシンを作成するためのコマンドラインツール。
virt-manager: 仮想マシンを管理するためのグラフィカルユーザーインターフェース

ソフトウエア  説明 
 qemu-kvm  仮想化環境を提供するソフトウェア。
1 仮想マシンの実行: QEMUが仮想マシンを作成・管理し、KVMがホストのCPU、メモリ、I/Oリソースを直接利用して
  高速化します。
2 ハードウェア支援: KVMはハードウェア仮想化技術(Intel VT-xやAMD-V)を活用するため、エミュレーションに比べて
  仮想マシンのパフォーマンスが大幅に向上します。
3 汎用性: QEMUがエミュレーションを提供することで、KVM非対応の環境や異なるアーキテクチャでも動作可能です。
 libvirt  仮想化環境を管理するためのライブラリとAPI。
Libvirtは、仮想化プラットフォームを管理するためのオープンソースのツールキットおよびAPIです。主に仮想マシンやコンテナの作成、制御、監視を簡易化するために使用されます。
主な機能
1 仮想マシンの作成と削除   
  仮想マシンの作成、設定、起動、停止、削除などを簡単に実行できます。
2 リソース管理
  CPUやメモリ、ストレージ、ネットワークの割り当てを制御できます。
3 スナップショットの操作   
  仮想マシンのスナップショット(状態保存)を作成・復元できます。
4 監視とレポート   
  仮想マシンの状態やリソース利用率を監視し、統計情報を取得できます。
5 ネットワーク管理   
  仮想ネットワークやブリッジを設定し、仮想マシンの通信をサポートします。
 virt-install  仮想マシンを作成するためのコマンドラインツール。
virt-installは、仮想マシンをコマンドラインから作成するためのツールです。これは、KVMやXen、その他の仮想化ハイパーバイザー上で仮想マシンをセットアップし、構成を自動化するために使用されます。virt-installは、libvirtを利用して仮想マシンを管理する。
virt-installの特徴
1 コマンドラインで操作可能   
  仮想マシンの作成、ディスクやネットワークの設定を全てCLIで行える。
2 様々なインストール方法をサポート
  ISOイメージ、ネットワーク(PXE)、あるいはクラウドイメージを利用したインストールに対応。
3 カスタマイズ性
  CPUコア数、メモリサイズ、ストレージ、ネットワーク、グラフィック設定などを細かく設定可能。
4 スクリプト可能
  複数の仮想マシンをスクリプトで一括作成・管理することができる。
 virt-manager  仮想マシンを管理するためのグラフィカルユーザーインターフェース。
Virt-Manager(Virtual Machine Manager)は、Linux仮想化環境で仮想マシンを簡単に管理するためのGUIツールとなる。仮想化のバックエンドとしてlibvirtを利用し、主要な仮想化技術(KVM/QEMU、Xen、LXC、その他)をサポートします。Virt-Managerは、仮想マシンの作成、制御、モニタリングなどを視覚的かつ直感的に操作できるため、コマンドライン操作に慣れていない場合でも仮想化環境を簡単に構築することができる。
virt-managerの特徴
1 GUIでの仮想マシン管理
  仮想マシンの作成、削除、起動、停止などをGUI操作で簡単に行えます。
  各仮想マシンのCPUやメモリ使用状況をリアルタイムでモニタリングできます。
2 幅広い仮想化技術に対応
  Virt-Managerは以下のバックエンドをサポートしている。
  KVM/QEMU  高性能なハードウェア仮想化。
  Xen  軽量なハイパーバイザー。
  LXC(Linux Containers)  コンテナ仮想化  
3 ネットワーク構成   
  仮想マシン間の通信を容易に設定するためのネットワーク構成ツールが組み込まれています。
  (例: NATやブリッジネットワーク)。
4 ストレージ管理
  仮想マシンのディスクイメージを簡単に管理できます。
  ストレージプールやスナップショット機能を活用して柔軟なディスク管理が可能です。
5 リモート管理
  SSHを介してリモートホスト上の仮想マシンを操作できます。
  複数のホストにまたがる仮想マシンを一元管理できます。
6 シンプルなインターフェース
  コマンドラインツールに比べて直感的で使いやすいGUIを提供します。



Virtualization Hyperviserでは、以下のコンポーネントがインストールされる。
KVM (Kernel-based Virtual Machine): Linuxカーネルの一部であり、仮想化機能を提供します。
QEMU: KVMと連携して仮想マシンをエミュレートするためのハードウェア仮想化ツールです。
libvirt: 仮想化環境の管理をサポートするAPIとデーモンを提供します。これは、仮想マシンの作成、管理、およびモニタリングに使用されます。
virt-manager: 仮想マシンの管理を簡単に行うためのGUIツールです。
virt-install: コマンドラインベースの仮想マシンインストールツールです。

Virtualization Toolsでは、仮想化環境を構築および管理するための一連のツールとライブラリがインストールされる。
virt-manager: 仮想マシンを管理するためのグラフィカルユーザーインターフェース。
virt-viewer: 仮想マシンに接続してコンソールアクセスを提供するツール。
virt-install: コマンドラインを使用して新しい仮想マシンをインストールするツール。
virt-top: 仮想化ホストとゲストのリソース使用状況を監視するためのツール。
libvirt-client: virshなどのコマンドラインツールを使用してlibvirtを操作するためのクライアントライブラリ。
qemu-kvm: KVMを使用して仮想マシンをエミュレートおよび実行するためのツール。
libguestfs-tools: 仮想マシンのディスクイメージを操作するためのツールセット。

※重複しているが、上記3つのソフトウェアは必須です!

仮想ブリッジbr0の作成

CentOS9のインストール後に、nmcliで行うことが推奨されている模様
① 
[root@flask ~]# nmcli con add type bridge ifname br0
このコマンドを実行すると、NetworkManagerはbr0という名前のブリッジインターフェースを作成します。このブリッジを使用して、
複数のネットワークインターフェースを1つの仮想ネットワークとしてまとめることができます。例えば、仮想マシンがホストの
物理ネットワークと通信できるようになります。

② 
[root@flask ~]# nmcli con mod bridge-br0 bridge.stp no
スパニングツリープロトコル(STP)は、ループを防止するためのプロトコルで、ブリッジやスイッチを使用するネットワークにおいて重要。
ただし、単純なホームネットワークや小規模なネットワークでは、STPを無効にすることでブリッジのパフォーマンスを向上させることができる。
今回は、無効にしたが、有効にしておいても良いものと思われる。

③ 
[root@flask ~]# nmcli con mod bridge-br0 ipv4.method manual ipv4.address "192.168.0.204/24" ipv4.gateway "192.168.0.1" ipv4.dns 8.8.8.8
ここでは、物理インターフェイスのenp0sと同じ静的IP、デフォルトゲートウエイ、DNSを設定する。
物理インターフェイス enp0と同じIPアドレス設定をブリッジインターフェイス br0 に適用する理由は、ブリッジが
物理インターフェイスと仮想インターフェイス間のネットワークトラフィックを中継するためです。
ブリッジの役割として、物理ネットワークインターフェイスと仮想ネットワークインターフェイス(たとえば仮想マシンのネットワークアダプタ)を接続し、
これらのインターフェイス間でトラフィックを中継します。ブリッジインターフェイスがIPアドレスを持つことで、ネットワーク上で通信を行う際の
ゲートウェイとして機能します。 なぜ同じIP設定を使うのか疑問になるとおもう。ブリッジインターフェイス br0 に物理インターフェイス enp0と
同じIPアドレス設定を適用することで、ネットワークの構成が簡略化され、ネットワーク全体の通信が円滑に行われることが理由とのことだった。

④ 
[root@flask ~]# nmcli con add type bridge-slave ifname enp0 master bridge-br0

root@flask ~]# nmcli con del enp0 && reboot

ここでは、今まで設定してきたbr0を新しく接続する。enp0はスレーブとしマスタでbr0として再起動する。

⑤ 
[root@flask ~]# nmcli dev             #確認作業
DEVICE TYPE STATE CONNECTION
br0 bridge 接続済み br0
enp0s25 ethernet 接続済み bridge-slave-enp0-1
lo loopback 接続済み (外部) lo
virbr0 bridge 接続済み (外部) virbr0
vnet0 tun 接続済み (外部) vnet0
vnet1 tun 接続済み (外部) vnet1
vnet5 tun 接続済み (外部) vnet5
enp2s0 ethernet 切断済み --

上手くいった。

[root@flask ~]# ip a     #これで確認でも良い物理インターフェイスとbr0がUPされている事が確認できると思う。

所管として、作業自体は特に難解なことはなかったか、nmcli con add type bridge-slave ifname enp0 master bridge-br0して
mcli con del enp0 && rebootしたあと、ターミナルの接続が切れることは、理解していたが、rebootしてから何故か再接続出来なかったので、
自宅富士通PCサーバーの直接のコンソールでip aで確認したら上手く行っていた。再度ターミナルソフト(RLogin)で再接続したら普通に接続できた。
(ここが次回同じオペレーションをしたときにどうなるか若干心配ではある)しかし、やり方は、十分に調べたので間違っていないと思う。
今回AI(copilot)にも質問してみたが、原因はわからずだった。その後、数日以上仮想ゲストOS3つで運用しているが、
不具合はなく、安定稼働している状況。

ゲストOSのインストール

今回は、自宅サーバーということもあり、GUIでCentOSを設定しているので、GUIのソフトウェアを利用した。もちろんCUIでも設定可能であります。
Gnomeのソフトウェアのところに仮想マシンマネージャがあるので、起動すれば良い。操作は直感的に行えると思うので、割愛するが、
インストールするOSのISOイメージを用意しておくことと/var/lib/libvirt/images/ 配下に用意がいいです。(どこにあっても良いが一元管理できる。
ゲストOSのイメージファイルも/var/lib/libvirt/images/ 配下に用意される(マシン名.qcow2)仮想マシンのメモリの設定とCPUの数を設定し、
割り当てるディスクイメージ容量を決定する。あとはマシン名を設定する。
この時ネットワークの選択とあるのでNATではなく、ブリッジデバイスを選択し、デバイス名 br0 とすること。
ゲストOSは、LinuxであればMem1GiB CPU 1 Disk 20GiB~100GiBくらいで良いかと思う。
(用途によりますね)単なる開発環境であれば20GiBもあれば大丈夫!

最後に

今回は、WEB上に多く情報があるので、特に問題なく設定できた。KVMホストサーバーとして利用した場合は、
OSインストール時に自動パーティション設定にしないことが肝心ですね。
自動にするとほとんどの容量を/home に割り当てられるので、カスタムパーティションにすることを覚えておいたほうが良いと思った。
ちなみに今回のホストは以下のとおり。

割り当てディレクトリ  全体のディスク容量  2TiB 
 /  350GiB
 /var 1024GiB 
 /home 512GiB 
 swap 32GiB 
 boot 1.5GiB 
 その他 若干余りました