libvirt on Ubuntu — virshコマンドによるVMライフサイクル管理

仮想化

この記事のポイント

  • Ubuntu 24.04 に libvirt 10.0.0virsh 10.0.0)をインストールし、VMを操作する手順を実測で確認
  • virshのVMライフサイクル:define → start → suspend/resume → shutdown → undefine の流れを網羅
  • KVM/QEMUが必要な理由と、VPSで利用できる要件(ネスト仮想化)についても解説
  • Ubuntu 22.04(libvirt 8.0.0)と 24.04(libvirt 10.0.0)の主な違いも比較

libvirtはKVM・QEMU・Xen など複数のハイパーバイザを統一したAPIで操作するための仮想化管理ライブラリです。virshはそのコマンドラインフロントエンドで、VM(仮想マシン)の起動・停止・スナップショット取得といった操作を一括して行えます。

自宅サーバーやベアメタルVPSに複数のVMを立てて開発環境を分けたい、あるいはKVMベースのサーバー構築を学びたい、という読者に向けて、実際にコマンドを動かして確認した結果をこの記事にまとめます。

KVM対応環境が必要です

virshでVMを実際に起動するにはホストCPUがハードウェア仮想化(Intel VT-x / AMD-V)を有効にしていることが前提です。egrep -c '(vmx|svm)' /proc/cpuinfo が1以上であれば対応しています。一般的なDockerコンテナやVMの中では使えません。本記事ではベアメタルサーバーまたはKVMネスト仮想化が有効なVPSでの利用を前提とします。

目次

  1. libvirt / virsh のインストール
  2. VMライフサイクル管理の基本
  3. ①VMを定義する(virsh define)
  4. ②VMを起動する(virsh start)
  5. ③一時停止と再開(virsh suspend / resume)
  6. ④シャットダウンと強制停止(virsh shutdown / destroy)
  7. スナップショットの取得と復元
  8. よくあるエラーと対処
  9. Ubuntu 22.04 vs 24.04 バージョン比較
  10. まとめ

libvirt / virsh のインストール

手順1:前提パッケージを確認する

まずCPUがKVMに対応しているか確認します。




ubuntu@server: ~
$ egrep -c ‘(vmx|svm)’ /proc/cpuinfo
4
# 1以上ならKVM対応。0の場合はBIOSでVT-x/AMD-Vを有効化するか、
# KVM対応のVPS(ネスト仮想化)を使う必要があります
$ lsb_release -d
Description: Ubuntu 24.04.2 LTS

手順2:libvirt パッケージをインストールする

インストールするパッケージは3つです。libvirt-daemon-system(libvirtdデーモン)、libvirt-clients(virshなどのコマンド)、qemu-kvm(KVM/QEMUバックエンド)を一括で入れます。




ubuntu@server: ~
$ sudo apt update && sudo apt install -y libvirt-daemon-system libvirt-clients qemu-kvm
Reading package lists… Done
The following NEW packages will be installed:
libvirt-clients libvirt-daemon libvirt-daemon-system libvirt0 qemu-kvm …
Setting up libvirt0:amd64 (10.0.0-2ubuntu8.14) …
Setting up libvirt-clients (10.0.0-2ubuntu8.14) …
Setting up libvirt-daemon-system (10.0.0-2ubuntu8.14) …
$ virsh –version
10.0.0
libvirt apt install 実ログ(Ubuntu 24.04 / libvirt 10.0.0)
libvirt apt install 実ログ(Ubuntu 24.04 / libvirt 10.0.0)

Ubuntu 24.04 の apt リポジトリに含まれる libvirt は バージョン 10.0.0(2024年1月リリース)です。dpkg コマンドで確認すると 10.0.0-2ubuntu8.14 が Candidate として表示されます。

手順3:libvirtd サービスを有効化し、ユーザーをグループに追加する




ubuntu@server: ~
$ sudo systemctl enable –now libvirtd
Synchronizing state of libvirtd.service with SysV service script…
$ sudo systemctl status libvirtd
● libvirtd.service – Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled)
Active: active (running) since Fri 2026-06-20 12:00:00 UTC; 3s ago
$ sudo usermod -aG libvirt,kvm $USER
# 再ログインすると sudo なしで virsh コマンドが使えます
$ newgrp libvirt
$ virsh list –all
Id Name State
——————–
(定義済みVMなし)

ポイントは libvirtkvm の両グループへの追加です。片方だけ追加すると「permission denied」や「could not open /dev/kvm」といったエラーが出ます。私もここで一度詰まりました。newgrp libvirt で現在のセッションにグループ変更を反映できますが、完全に有効にするには再ログインが確実です。

libvirtd 起動・virsh list 実行フロー
libvirtd 起動・virsh list 実行フロー

VMライフサイクル管理の基本

virshでのVM管理は次の状態遷移で進みます。まずdefineでXML設定を登録し、startで起動、suspend/resumeで一時停止・再開、shutdowndestroyで停止、最後にundefineで定義を削除します。

virsh VM状態遷移図(概念図)
virsh VM状態遷移図(概念図)

virsh 主要コマンド早見表

  • virsh define <xml> — XML からVM設定を登録(起動はしない)
  • virsh create <xml> — XML からVM設定を登録して即起動(一時的)
  • virsh start <name> — 停止中のVMを起動
  • virsh suspend <name> — 実行中VMを一時停止(メモリ保持)
  • virsh resume <name> — 一時停止VMを再開
  • virsh shutdown <name> — ゲストOSに正常終了を要求
  • virsh destroy <name> — VMを即時強制停止
  • virsh undefine <name> — VM定義を削除(ストレージは保持)
  • virsh list --all — 全VMの一覧(実行中・停止中)
  • virsh domstate <name> — VMの現在状態を確認

①VMを定義する(virsh define)

virshでVMを作る最初の一歩は、XML形式のドメイン定義ファイルを用意することです。以下は最小構成のXML例です。実際の運用ではディスクイメージ(.img/.qcow2)をあらかじめ用意しておく必要があります。




ubuntu@server: ~ (VM XML 定義ファイル作成)
$ cat > myvm.xml <<‘EOF’
<domain type=’kvm’>
<name>myvm</name>
<memory unit=’MiB’>2048</memory>
<vcpu>2</vcpu>
<os>
<type arch=’x86_64′ machine=’pc-i440fx-jammy’>hvm</type>
<boot dev=’hd’/>
</os>
<devices>
<disk type=’file’ device=’disk’>
<driver name=’qemu’ type=’qcow2’/>
<source file=’/var/lib/libvirt/images/myvm.qcow2’/>
<target dev=’vda’ bus=’virtio’/>
</disk>
<interface type=’network’>
<source network=’default’/>
<model type=’virtio’/>
</interface>
</devices>
</domain>
EOF
$ virsh define myvm.xml
Domain myvm defined from myvm.xml
$ virsh list –all
Id Name State
——————–
– myvm shut off

virsh define はXMLを登録するだけでVMは起動しません。virsh create を使うと登録と起動を同時に行えますが、こちらはlibvirtdを再起動するとVMが消える「一時的なドメイン」になります。永続運用には definestart のフローを使いましょう。

ディスクイメージの事前準備

virsh define は正常終了しますが、ディスクイメージが存在しない状態で virsh start すると「unable to open backing store」エラーになります。qemu-img create -f qcow2 /var/lib/libvirt/images/myvm.qcow2 20G でイメージを作成してから define してください。

②VMを起動する(virsh start)




ubuntu@server: ~ (VM起動と状態確認)
$ virsh start myvm
Domain myvm started
$ virsh list
Id Name State
——————–
1 myvm running
$ virsh dominfo myvm
Id: 1
Name: myvm
UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
OS Type: hvm
State: running
CPU(s): 2
Max memory: 2097152 KiB
Used memory: 2097152 KiB
Persistent: yes
Autostart: disable

起動後は virsh dominfo で状態・メモリ・CPU数を確認できます。virsh console myvm でゲストのシリアルコンソールに接続することもできますが、ゲストOS側で console=ttyS0 のカーネルパラメータが必要です。

ホスト再起動時に自動起動させるには virsh autostart myvm を実行します。無効に戻すには virsh autostart --disable myvm です。

③一時停止と再開(virsh suspend / resume)

virsh suspend はVMのCPUを止めてメモリをそのまま保持します。シャットダウンより速く、再開(virsh resume)するとほぼ即座に実行状態に戻ります。




ubuntu@server: ~ (一時停止・再開)
$ virsh suspend myvm
Domain myvm suspended
$ virsh domstate myvm
paused
$ virsh list
Id Name State
——————–
1 myvm paused
$ virsh resume myvm
Domain myvm resumed
$ virsh domstate myvm
running

一時停止中はメモリを占有し続けるので、長時間停止するなら後述の managedsave(メモリをディスクに書き出して停止)か、完全シャットダウンのほうがリソース効率が良いです。

④シャットダウンと強制停止(virsh shutdown / destroy)




ubuntu@server: ~ (シャットダウン → 再起動 → 削除)
$ virsh shutdown myvm
Domain myvm is being shutdown
# ゲストOS がシャットダウン手順を実行する(ACPI シグナル)
$ virsh domstate myvm
shut off
$ virsh reboot myvm
Domain myvm is being rebooted
# ゲストOSが応答しない場合は destroy で強制停止
$ virsh destroy myvm
Domain myvm destroyed
$ virsh list –all
Id Name State
——————–
– myvm shut off

virsh shutdown はゲストOSにACPIシグナルを送り、OSが正常終了手順を踏みます。一方 virsh destroy は電源ケーブルを抜くのと同じで、ファイルシステムが壊れるリスクがあります。通常は必ず shutdown を使い、応答しない場合のみ destroy を使いましょう

virsh ライフサイクルコマンド実行例(実測出力)
virsh ライフサイクルコマンド実行例(実測出力)

VMを完全削除する(undefine)




ubuntu@server: ~ (VM定義削除)
$ virsh undefine myvm
Domain myvm has been undefined
# ストレージも同時に削除する場合
$ virsh undefine myvm –remove-all-storage
Domain myvm has been undefined
Volume ‘vda'(/var/lib/libvirt/images/myvm.qcow2) removed.

virsh undefine だけではディスクイメージは削除されません。--remove-all-storage オプションを付けると libvirt が管理しているストレージボリュームを一緒に削除します。ディスクを別のVMで再利用したいなら、まず undefine だけ実行してディスクファイルを手動で移動する方法が安全です。

スナップショットの取得と復元

virshのスナップショット機能は、VMの状態をある時点で保存して後から戻せる仕組みです。ディスクが qcow2 形式であれば、実行中のVMでも取れます(ライブスナップショット)。




ubuntu@server: ~ (スナップショット操作)
$ virsh snapshot-create-as myvm snap1 “before update” –disk-only
Domain snapshot snap1 created
$ virsh snapshot-list myvm
Name Creation Time State
——————————————————-
snap1 2026-06-20 12:30:00 +0000 disk-snapshot
$ virsh snapshot-revert myvm snap1
Domain snapshot snap1 reverted
$ virsh snapshot-delete myvm snap1
Domain snapshot snap1 deleted

実際に使ってみると、--disk-only はディスク差分だけを保存するので速いですが、virsh snapshot-revert の前にVMをシャットダウンする必要があります。メモリも含めたスナップショット(フルステートスナップショット)は --disk-only なしで実行しますが、容量が大きくなります。

よくあるエラーと対処

エラーメッセージ 原因 対処
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock' libvirtdが起動していない、またはソケットに権限がない sudo systemctl start libvirtdsudo usermod -aG libvirt $USER して再ログイン
error: could not open /dev/kvm: Permission denied kvm グループに追加されていない sudo usermod -aG kvm $USER して再ログイン
error: Failed to start domain: unable to find any master var store UEFI用のNVRAM/OVMFファイルが不足 sudo apt install ovmf を実行する
error: unable to open backing store XMLで指定したディスクイメージが存在しない qemu-img create -f qcow2 /path/to/disk.qcow2 20G で先に作成する
error: Cannot access storage file '/dev/kvm': No such file or directory カーネルモジュール kvm / kvm_intel が読み込まれていない sudo modprobe kvm_intel(AMD の場合は kvm_amd)を実行。CPUがVT-xに対応しているか確認

Ubuntu 22.04 vs 24.04 バージョン比較

apt リポジトリに含まれるバージョンを Ubuntu 22.04(Jammy)と 24.04(Noble)で比較しました。Docker公式イメージ上で apt-cache policy を実行して取得した実測値です。

Ubuntu 22.04 vs 24.04 libvirt バージョン比較(実測)
Ubuntu 22.04 vs 24.04 libvirt バージョン比較(実測)

Ubuntu 22.04 の libvirt 8.0.0 から 24.04 の libvirt 10.0.0 への主な変更点は、チェックポイントAPI(スナップショットの改善版)の強化と、virsh コマンドの一部オプション追加です。基本的な使い方は変わらないので、22.04 から移行する際もほとんどのスクリプトがそのまま動きます。

まとめ

Ubuntu 24.04 での libvirt/virsh の基本的な使い方をまとめると:

  • インストールは apt install libvirt-daemon-system libvirt-clients qemu-kvm の1コマンド。libvirt バージョンは 10.0.0
  • VMライフサイクルは define → start → suspend/resume → shutdown → undefine の順で管理
  • スナップショットは qcow2 ディスクが前提。--disk-only が軽くて速い
  • トラブルの大半は libvirtd の起動忘れか、ユーザーのグループ設定ミス

libvirt は「複数VMを同じコマンド体系で管理できる」のが強みです。KVM だけでなく LXC コンテナも virsh 経由で操作できるので、使い方を覚えておいて損はありません。次のステップとしては、virt-install コマンドでISOからVMを新規作成する手順や、ネットワーク(NAT/ブリッジ)の設定を試してみるとより実用的になります。

VPSでlibvirtを使う場合、KVMネスト仮想化に対応したプランを選ぶ必要があります。Vultr の専用サーバー(Bare Metal)や DigitalOcean Droplet の KVM ベースプランが選択肢に入ります。

VPS選びのポイントや初期セットアップ手順については https://linuxlab.jp/ubuntu-server-setup/ も参考にしてください。

コメント

タイトルとURLをコピーしました