はじめに
仮想マシンの管理は、ドメインを作成して起動するだけではありません。運用現場では、既存の仮想マシンを引き継ぎ、その永続的なリソース定義を変更しなければならないことがよくあります。メモリを増設し、仮想 CPU を追加し、ストレージを接続し、自動起動を有効にしたうえで、実行中の状態が要求した設定と一致していることを確認する必要があります。
libvirt では、仮想マシンを ドメイン と呼びます。永続ドメインには、QEMU プロセスが実行されていない場合でも、ハードウェア構成図に相当する保存済みの定義があります。ドメインを起動すると、その定義から実行中のインスタンスが作成されます。停止すると実行中のインスタンスは終了しますが、構成図は保持されます。永続設定と実行時状態を分けて管理することが、この実験の中心的な考え方です。
この実験では、lfcs-config という停止中の libvirt ドメインがすでに定義されています。このドメインには、小容量の起動ディスク、64 MiB のメモリ、1 個の vCPU が設定されています。まず現在の状態を確認し、その後 virsh のリソース管理コマンドを使って再構成します。環境では /dev/kvm が公開されていないため、QEMU はソフトウェアエミュレーションを使用します。また、ディスクにはゲスト OS が含まれていません。それでも、管理操作の流れと libvirt の永続設定は実際のものです。
既存のドメイン設定を確認する
このステップでは、変更を加える前に、既存の lfcs-config ドメインの永続設定と実行時状態を確認します。
プロジェクトディレクトリへ移動します。
cd /home/labex/project
すべてのドメインを一覧表示します。--all オプションを指定すると停止中のドメインも含まれるため、lfcs-config は shut off 状態で表示されるはずです。
sudo virsh list --all
--all を指定しない場合、通常 virsh list にはアクティブなドメインだけが表示されます。展開された一覧に停止中のドメイン名が表示されることから、実行中のゲストとして CPU 時間を消費していなくても、libvirt がその永続定義を保持していることが分かります。
ドメインの概要を確認します。
sudo virsh dominfo lfcs-config
dominfo では、識別情報、ライフサイクル、CPU、メモリ、永続性、自動起動に関する情報をまとめて確認できます。この段階では、表示内容を目標値ではなく基準値として読み取ってください。後の出力では、意図的に再設定した項目だけが変化します。
安定した設定項目に注目します。
Name: lfcs-config
State: shut off
CPU(s): 1
Max memory: 65536 KiB
Used memory: 65536 KiB
Persistent: yes
Autostart: disable
ここで libvirt が表示するメモリ単位は KiB です。1 MiB は 1024 KiB なので、65536 KiB は 64 MiB に相当します。Persistent: yes は、停止後も定義が保持されることを示します。一方、Autostart: disable は、仮想化サービスの起動時に libvirt がこのドメインを自動起動しないことを意味します。
接続されているブロックデバイスを一覧表示します。vda は用意済みのルートディスクで、そのソースは既存の qcow2 イメージです。
sudo virsh domblklist lfcs-config --details
この表では、Target がゲストに公開されるデバイス名、Source がデータを保存するホスト上のパスを表します。vda という名前の virtio ディスクは、仮想マシンに接続された仮想ドライブに相当します。qcow2 のソースファイルは、ホスト上にあるそのドライブのバックアップイメージです。
この基準状態を確認することで、すでに存在する設定と、後のステップで変更するリソースを区別できます。
永続メモリと vCPU を設定する
このステップでは、ドメインが停止している状態で、永続的な最大メモリ、現在のメモリ割り当て、vCPU 数を増やします。
libvirt では、最大メモリの上限と、次回起動時に割り当てるメモリを区別します。まず、永続的な最大メモリを 128 MiB に設定します。--config フラグを指定すると、一時的な実行時の値ではなく、保存済みのドメイン定義が変更されます。
sudo virsh setmaxmem lfcs-config 128M --config
上限は、割り当てるメモリ量以上でなければなりません。max memory は仮想マシンが利用可能なメモリ容量、current memory は通常の使用のために要求されるメモリ量と考えると分かりやすいでしょう。ドメインは停止中なので、--config による変更は予測しやすく、次回起動時に反映されます。
次回起動時に割り当てるメモリを 96 MiB に設定します。
sudo virsh setmem lfcs-config 96M --config
M サフィックスを付けると、virsh は値を mebibyte 単位として解釈します。後で表示する dominfo の出力では、128 MiB は 131072 KiB、96 MiB は 98304 KiB に変換されます。これらは単位が異なるだけで、同じ量を表しています。
現在の永続割り当てで 2 個の CPU を使用できるようにするには、まず vCPU の最大数を増やす必要があります。
sudo virsh setvcpus lfcs-config 2 --config --maximum
この最初の CPU コマンドは、保存済み定義における上限を変更します。このコマンドだけでは、使用可能な vCPU が 2 個割り当てられるわけではありません。最大数と現在の割り当てを分けることで、将来の拡張に備えた容量をドメイン定義に確保できます。
次回起動時の vCPU 数を 2 個に設定します。
sudo virsh setvcpus lfcs-config 2 --config
2 つ目のコマンドは、新しく設定した上限の範囲内で永続的な割り当て数を設定します。最大数が 1 個のまま 2 個の vCPU を割り当てようとすると失敗するため、この順序が重要です。
更新後の永続定義を確認します。
sudo virsh dominfo lfcs-config
関連する項目は、次のように表示されるはずです。
CPU(s): 2
Max memory: 131072 KiB
Used memory: 98304 KiB
永続データディスクを作成して接続する
このステップでは、2 つ目の qcow2 イメージを作成し、vdb という名前の永続的な virtio ディスクとして接続します。
libvirt のイメージディレクトリに、64 MiB のスパース qcow2 イメージを作成します。
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/lfcs-config-data.qcow2 64M
このコマンドで作成されるのは仮想ディスクのコンテナであり、ファイルシステムやマウント済みディレクトリではありません。-f qcow2 は QEMU のコピーオンライト形式を選択し、64M は仮想容量を設定します。新しく作成されたスパースイメージは、初期状態では仮想サイズよりもはるかに少ないホストストレージしか使用せず、ゲストがデータを書き込むにつれて拡張します。
このトレーニング環境で QEMU プロセスが使い捨てイメージを開けるようにします。
sudo chmod 666 /var/lib/libvirt/images/lfcs-config-data.qcow2
モード 666 は、すべてのユーザークラスに読み取りおよび書き込み権限を付与します。この広い権限設定により、ホスト固有の QEMU ユーザーやグループ設定に依存せず、この使い捨て実験を実行できます。ただし、本番環境で推奨される設定ではありません。実際のホストでは、使用している libvirt サービスに必要な所有者、グループ、SELinux ラベル、または AppArmor ポリシーを設定してください。
このファイルを lfcs-config に接続します。--target vdb はゲスト側のブロックデバイス名を指定し、--subdriver qcow2 はイメージ形式を記録します。--config は次回起動時に使用される永続定義を変更します。
sudo virsh attach-disk lfcs-config \
/var/lib/libvirt/images/lfcs-config-data.qcow2 \
vdb --targetbus virtio --subdriver qcow2 --config
ソースパスはホスト上のパスであり、vdb はゲストから見える名前です。--targetbus virtio は、Linux ゲストで効率的に利用されることの多い準仮想化ディスクインターフェースを選択します。ドメインが停止中で、このコマンドに --config を指定しているため、libvirt はライブ接続を試みるのではなく、保存済みの構成図にデバイスを記録します。
永続的なブロックデバイス設定を一覧表示します。
sudo virsh domblklist lfcs-config --details
出力には vda と vdb の両方が含まれ、vdb は lfcs-config-data.qcow2 を指しているはずです。
この時点で、イメージファイルの存在とドメインへの接続は別々の事実です。qcow2 ファイルを作成しただけでは仮想マシンに接続されません。また、後でディスクを切り離しても、ソースファイルが自動的に削除されることはありません。
自動起動を有効にして実行時状態を検証する
このステップでは、ドメインの自動起動を有効にし、仮想マシンを起動して、実行時のリソースと永続設定を比較します。
仮想化サービスの起動時にこのドメインを起動するよう、libvirt に自動起動を設定します。
sudo virsh autostart lfcs-config
自動起動は保存されるポリシーフラグであり、ドメインを直ちに起動する要求ではありません。ホストや libvirt サービスの再起動後に自動的に復旧させたいインフラストラクチャサービスに便利です。
更新した永続定義を使ってドメインを起動します。
sudo virsh start lfcs-config
起動すると、編集した保存済み定義から QEMU プロセスが作成されます。そこには、2 個の vCPU、新しいメモリ制限、2 台のディスクが含まれます。コマンドはドメインが起動したことを報告しますが、設定どおりの状態になっていることは dominfo と domblklist で確認できます。
QEMU が実行状態に入るまで数秒待ちます。
sleep 3
ドメインを確認します。2 個の vCPU、最大メモリ 128 MiB、自動起動有効の状態で実行されているはずです。
sudo virsh dominfo lfcs-config
このソフトウェアエミュレーションのドメインでは、永続設定の currentMemory が 96 MiB であっても、実行中の Used memory は通常 128 MiB になります。ゲスト OS や、実行時の割り当てを減らすために libvirt と連携するバルーンドライバーが存在しないためです。非アクティブな XML を確認し、次回起動時の設定に 96 MiB が記録されていることを確認します。
sudo virsh dumpxml lfcs-config --inactive | grep -E '<memory|<currentMemory|<vcpu'
dumpxml --inactive は、実行中の QEMU の状態ではなく保存済みの定義を取得します。パイプによって XML が grep に渡され、メモリ要素と CPU 要素だけが表示されます。このように対象を絞って比較することで、想定される実行時の表示差異を、設定変更の失敗と誤認せずに済みます。
安定した値には、<memory unit='KiB'>131072</memory>、<currentMemory unit='KiB'>98304</currentMemory>、vCPU 数 2 が含まれます。この比較から、永続設定と実行時のリソース報告は分けて確認すべきであることが分かります。
アクティブなドメインのディスクを一覧表示します。
sudo virsh domblklist lfcs-config --details
vda と vdb の両方が表示されるはずです。これは、保存済みの設定が QEMU の起動時に適用されたことを示しています。
仮想マシンを停止して永続状態を確認する
このステップでは、設定済みのドメイン、ストレージ、自動起動設定を保持したまま、ゲストプロセスを停止します。
トレーニング用ディスクには OS が含まれていないため、ゲストを正常にシャットダウンすることはできません。destroy を使って QEMU プロセスを直ちに停止します。この操作で変わるのは実行時状態であり、永続的なドメイン定義が削除されることはありません。
sudo virsh destroy lfcs-config
名前に反して、virsh destroy は仮想マシンを削除する操作というより、電源を切る操作に近いものです。この実験にはゲスト OS や重要なデータがないため、ここでは使用できます。実際に稼働しているゲストでは、virsh shutdown を使用し、OS がデータをディスクに書き出して正常に停止できるようにしてください。
ドメインが停止したことを確認します。
sudo virsh domstate lfcs-config
出力は次のようになるはずです。
shut off
最後に、永続設定を確認します。
sudo virsh dominfo lfcs-config
期待される shut off 状態が示すのは、あくまで実行時の状態です。CPU、メモリ、ディスク接続、自動起動の設定は、永続定義に残ります。この定義を削除するには、virsh undefine などの別の操作が必要です。ただし、ドメインの定義を解除しても、ディスクイメージファイルが必ず削除されるとは限りません。
すべてのドメインと自動起動状態を一覧表示します。停止中の lfcs-config ドメインは定義されたまま残り、自動起動対象として表示されるはずです。
sudo virsh list --all --autostart
これで仮想マシンは停止していますが、作成したリソース設定を使って後から起動できる状態になっています。
まとめ
既存の libvirt ドメインを引き継ぎ、XML を書き換えることなく永続的なリソース設定を変更しました。最大メモリと割り当てメモリを増やし、2 個の vCPU を設定し、2 つ目の qcow2 ディスクを作成して接続しました。さらに、自動起動を有効にし、実行中の QEMU ドメインで設定を検証したうえで、管理対象の仮想マシンを保持したままプロセスを停止しました。これは、単に仮想マシンのライフサイクルを確認することと、要求された目標状態に合わせて仮想マシンを構成することの実践的な違いです。



