この記事のポイント
- Ubuntu 24.04 に
libvirt 10.0.0(virsh 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での利用を前提とします。
目次
- libvirt / virsh のインストール
- VMライフサイクル管理の基本
- ①VMを定義する(virsh define)
- ②VMを起動する(virsh start)
- ③一時停止と再開(virsh suspend / resume)
- ④シャットダウンと強制停止(virsh shutdown / destroy)
- スナップショットの取得と復元
- よくあるエラーと対処
- Ubuntu 22.04 vs 24.04 バージョン比較
- まとめ
libvirt / virsh のインストール
手順1:前提パッケージを確認する
まずCPUがKVMに対応しているか確認します。
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バックエンド)を一括で入れます。
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

Ubuntu 24.04 の apt リポジトリに含まれる libvirt は バージョン 10.0.0(2024年1月リリース)です。dpkg コマンドで確認すると 10.0.0-2ubuntu8.14 が Candidate として表示されます。
手順3: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なし)
ポイントは libvirt と kvm の両グループへの追加です。片方だけ追加すると「permission denied」や「could not open /dev/kvm」といったエラーが出ます。私もここで一度詰まりました。newgrp libvirt で現在のセッションにグループ変更を反映できますが、完全に有効にするには再ログインが確実です。

VMライフサイクル管理の基本
virshでのVM管理は次の状態遷移で進みます。まずdefineでXML設定を登録し、startで起動、suspend/resumeで一時停止・再開、shutdownかdestroyで停止、最後にundefineで定義を削除します。

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)をあらかじめ用意しておく必要があります。
<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が消える「一時的なドメイン」になります。永続運用には define → start のフローを使いましょう。
ディスクイメージの事前準備
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)
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)するとほぼ即座に実行状態に戻ります。
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)
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 を使いましょう。

VMを完全削除する(undefine)
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でも取れます(ライブスナップショット)。
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 libvirtd → sudo 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 の 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/ も参考にしてください。


コメント