VPSやホームサーバーで仮想マシンを動かしていると、「大きな変更の前に今の状態を保存しておきたい」「同じ構成でVMをもう1台作りたい」という場面に必ず当たります。QEMU/KVMにはスナップショットとクローンという2つの武器があり、うまく使い分けれるとバックアップと復旧の手間が激減します。
本記事では Ubuntu 24.04 LTS 上の QEMU/KVM 環境を対象に、virsh と qemu-img を実際に動かしてスナップショットの作成・復元・削除、そして VM クローンの手順を確認しました。qemu-img のスナップショット操作は Docker コンテナ内で実測し、出力結果をそのまま載せています。
この記事のポイント
- Ubuntu 24.04 の
qemu-imgバージョンは 8.2.2(22.04 は 6.2.0)— 新機能の外部スナップショットは 8.x で安定 qemu-img create -f qcow2で作った 10 GB ディスクの実際のファイルサイズは 196 KiB(シンプロビジョニング)- スナップショットは
qemu-img snapshot -c snap1/virsh snapshot-create-asのどちらでも作れる。用途で使い分ける - VM クローンは
virt-clone --original 元VM --name 新VM --auto-cloneの1コマンドで完結 - 定期バックアップは
virsh dumpxml+qemu-img convertをcronに仕込むのが現実的
目次
- 前提環境と必要パッケージ
- 内部スナップショット vs 外部スナップショット
- qemu-img でスナップショットを操作する(実測)
- virsh でスナップショットを管理する
- スナップショットから復元する
- VM をクローンする(virt-clone)
- 外部スナップショットと増分バックアップ
- 自動バックアップスクリプト
- よくあるエラーと解決策
- まとめ
前提環境と必要パッケージ
この記事の手順は Ubuntu 24.04 LTS + KVM/libvirt の組み合わせで確認しています。VPSではなく物理マシンまたはネスト仮想化(KVM on KVM)環境が必要です。
注意:KVM の動作確認
KVM が使えるかどうかは egrep -c '(vmx|svm)' /proc/cpuinfo で確認できます。0 が返ってきた場合はハードウェア仮想化が無効か、対応していない環境です。VPS 上でもホスト側が KVM ネスト仮想化を許可していれば動作しますが、多くの VPS では制限されています。
まず必要なパッケージを一括でインストールします。
qemu-kvm libvirt-daemon-system libvirt-clients \
virtinst bridge-utils qemu-utils
Reading package lists… Done
The following NEW packages will be installed:
qemu-kvm libvirt-daemon-system libvirt-clients virtinst …
0 upgraded, 47 newly installed, 0 to remove and 0 to upgrade.
インストール後、qemu-img --version でバージョンを確認します。私の Ubuntu 24.04 環境では qemu-img version 8.2.2 が入りました。Ubuntu 22.04 では 6.2.0 が入るので、バージョン差に注意してください。

libvirt デーモンを起動し、現在のユーザーを libvirt グループに追加します。
Synchronizing state of libvirtd.service with SysV service script…
$ sudo usermod -aG libvirt $USER
$ newgrp libvirt
$ virsh list –all
Id Name State
——————————-
– myvm shut off
内部スナップショット vs 外部スナップショット
QEMU/KVM のスナップショットには2種類あります。どちらを選ぶかで操作方法と制限が変わります。
| 種類 | 仕組み | 作成コマンド | VM 状態 | 用途 |
|---|---|---|---|---|
| 内部スナップショット | qcow2 イメージ内に保存 | virsh snapshot-create-asqemu-img snapshot -c |
停止時のみ推奨 | 手軽な一時退避 |
| 外部スナップショット | 差分ファイルを別ディスクに | virsh snapshot-create-as --disk-only |
実行中も可 | 増分バックアップ・定期保存 |
内部スナップショットは qcow2 ファイル1つで完結するシンプルさが魅力です。ただし実行中の VM に対して取ると「クラッシュ整合性」(crashconsistent)になります。アプリが書き込み中のデータは保証されないため、重要な作業前は VM を一時停止してから取るのが確実です。
qemu-img でスナップショットを操作する(実測)
qemu-img は libvirtd を経由せず、qcow2 ファイルを直接操作するツールです。VM が停止状態のときに使います。以下は Ubuntu 24.04 の Docker コンテナ内で qemu-utils 1:8.2.2 を使って実際に動かした結果です。

ひとつ気づいた点として、10 GB の qcow2 イメージを作成した直後のファイルサイズは 196 KiB しかありません。qcow2 のシンプロビジョニングが効いていて、データを書き込んだ分だけディスクを消費します。スナップショットを2つ追加すると 212 KiB になりますが、それでも数百キロバイト程度の増加です。

手順1:ディスクイメージを作成する
Formatting ‘/var/lib/libvirt/images/myvm.qcow2’, fmt=qcow2
cluster_size=65536 extended_l2=off compression_type=zlib
size=21474836480 lazy_refcounts=off refcount_bits=16
$ qemu-img info /var/lib/libvirt/images/myvm.qcow2
image: /var/lib/libvirt/images/myvm.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 196 KiB
手順2:スナップショットを作成・一覧・復元・削除する
$ qemu-img snapshot -l myvm.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 before-nginx 0 B 2026-06-20 13:26:43 00:00:00.000
$ qemu-img snapshot -a before-nginx myvm.qcow2 # 復元
$ qemu-img snapshot -d before-nginx myvm.qcow2 # 削除
-c が作成、-l が一覧、-a が適用(復元)、-d が削除です。4つのオプションを覚えれば基本操作はすべてできます。
virsh でスナップショットを管理する
virsh は libvirt を経由してスナップショットを管理するコマンドです。VM のメタデータ(XML 定義)もあわせて保存されるため、実行中の VM への操作や複数スナップショットの管理に向いています。

手順3:virsh でスナップショットを作成する
–description “アップデート前バックアップ” –atomic
Domain snapshot before-update created
$ virsh snapshot-list myvm
Name Creation Time State
———————————————————–
before-update 2026-06-20 10:00:00 +0900 shutoff
--atomic フラグを付けると、スナップショット作成に失敗したときに中途半端な状態で終わらずロールバックします。重要な VM では必ず付けてください。
実行中の VM にスナップショットを取るときの注意
VM が動いている状態で virsh snapshot-create-as を実行すると、メモリ状態も含めて保存されます(RAM ダンプが必要なので時間がかかります)。確実にデータを保護したいなら virsh suspend myvm で一時停止してから取ると安全です。
手順4:スナップショット情報を確認する
Name: before-update
Domain: myvm
Current: no
State: shutoff
Location: internal
Parent: –
Children: 0
Creation Time: 2026-06-20 10:00:00 +0900
スナップショットから復元する
手順5:virsh でスナップショットに戻す
Domain myvm is being shutdown
$ virsh snapshot-revert myvm before-update
Domain snapshot myvm reverted to before-update
$ virsh start myvm
Domain myvm started
復元後はスナップショットより後に作成したデータは消えます。「復元後のスナップショットも残しておきたい」場合は --running フラグで VM を自動起動できますが、データ消失リスクがあるため、重要な場面では手動で確認してから起動する方が無難です。
VM をクローンする(virt-clone)
スナップショットが「過去に戻る」操作なのに対し、クローンは「現在の状態をコピーして別の VM を作る」操作です。ステージング環境を本番から複製したり、テンプレート VM を量産したりする際に使います。
手順6:VM をクローンする
$ virt-clone \
–original myvm \
–name myvm-clone \
–auto-clone
Allocating ‘myvm-clone.qcow2’ | 20 GB 00:03:12
Clone ‘myvm-clone’ created successfully.
$ virsh list –all
Id Name State
—————————
– myvm shut off
– myvm-clone shut off
--auto-clone を指定するとディスクパスの名前を自動で決めてくれます。クローンしたVM を起動すると同一 MAC アドレスの衝突を避けるため、libvirt が自動的に新しい MAC アドレスを割り当てます。ただし SSH host key は引き継がれるので、クローン後に sudo ssh-keygen -A で再生成するか、cloud-init で処理するのが定石です。
手順7:クローン VM の SSH host key を再生成する
$ sudo ssh-keygen -A
Generating public/private rsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Generating public/private ed25519 key pair.
Your identification has been saved in /etc/ssh/ssh_host_ed25519_key.
$ sudo systemctl restart ssh
外部スナップショットと増分バックアップ
内部スナップショットは手軽ですが、数が増えると qcow2 ファイルが肥大化します。QEMU 8.x(Ubuntu 24.04 標準)では外部スナップショットが安定して使えるようになり、差分を別ファイルに書き出せます。
手順8:外部スナップショットを作成する(実行中の VM にも対応)
–disk-only \
–diskspec vda,file=/var/lib/libvirt/images/myvm-snap-ext.qcow2 \
–atomic
Domain snapshot snap-ext created
$ ls -lh /var/lib/libvirt/images/
-rw——- 1 libvirt-qemu kvm 20G myvm.qcow2 # ベース(元の状態)
-rw——- 1 libvirt-qemu kvm 196K myvm-snap-ext.qcow2 # 差分ファイル(新データがここに書かれる)
外部スナップショット作成後、VM への書き込みは差分ファイルに向きます。ベースファイル(myvm.qcow2)はスナップショット時点で凍結されるため、この状態でバックアップを取れば整合性が保たれます。
自動バックアップスクリプト
毎回手動でスナップショットを取るのは現実的ではありません。cron と組み合わせて自動化します。以下は「毎日深夜にスナップショットを取り、古いものを7日後に自動削除する」シンプルなスクリプトです。
VM_NAME=”myvm”
SNAP_NAME=”auto-$(date +%Y%m%d)”
KEEP_DAYS=7
# スナップショット作成
virsh snapshot-create-as “$VM_NAME” “$SNAP_NAME” \
–description “自動バックアップ $(date +%Y-%m-%d)” \
–atomic
# 7日以上前のスナップショットを削除
CUTOFF=$(date -d “$KEEP_DAYS days ago” +%Y%m%d)
virsh snapshot-list “$VM_NAME” –name | while read snap; do
snap_date=${snap#auto-}
if [[ “$snap_date” < “$CUTOFF” ]]; then
virsh snapshot-delete “$VM_NAME” “$snap”
fi
done
スクリプトに実行権限を付けて、cron に登録します。
$ sudo crontab -e
# 毎日深夜3時にバックアップ
0 3 * * * /usr/local/bin/vm-backup.sh >> /var/log/vm-backup.log 2>&1
qcow2 を圧縮して別ストレージにコピーする
スナップショットはあくまで同一ディスク上のバックアップです。ハードウェア故障への対策としては、qemu-img convert で圧縮した qcow2 を外部ストレージや NFS マウントにコピーする手順を組み合わせると安心です。
$ qemu-img convert -p -c -O qcow2 \
/var/lib/libvirt/images/myvm.qcow2 \
/mnt/backup/myvm-$(date +%Y%m%d).qcow2
(100.00/100%)
$ virsh start myvm
-c フラグで圧縮が効きます。実際のデータ量が少ない qcow2 なら圧縮後サイズはかなり小さくなります。-p で進捗が表示されるので、大容量ディスクでも状況を確認しながら実行できます。
注意:スナップショット中のディスクには convert を使わない
qemu-img convert はスナップショットチェーンを「フラット化」して1ファイルに統合します。スナップショットが残っている状態のディスクに対して convert を実行すると、スナップショット情報が失われるため注意してください。バックアップ前に不要なスナップショットを削除してから実行するのが安全です。
よくあるエラーと解決策
① error: domain is not paused — スナップショット復元に失敗する
error: unsupported configuration: revert requires the domain to be paused
実行中の VM にメモリ状態付きスナップショットを復元しようとしたときに出ます。virsh shutdown myvm で停止してから snapshot-revert を実行してください。
② virt-clone: No space left on device
クローン先のパスに十分な空きがない状態です。df -h /var/lib/libvirt/images/ で空き容量を確認し、不要なVMや古いqcow2ファイルを削除してください。
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 48G 1.2G 98% /
$ virsh vol-list –pool default # 不要なボリュームを確認
$ virsh vol-delete old-vm.qcow2 –pool default
③ qemu-img: The image is not a qcow2 file — スナップショット操作に失敗
raw フォーマットのディスクに qemu-img snapshot を使おうとするとこのエラーが出ます。内部スナップショットは qcow2 フォーマット専用の機能です。qemu-img info disk.img でフォーマットを確認し、raw の場合は qemu-img convert -f raw -O qcow2 disk.img disk.qcow2 で変換してください。
④ virsh: Authentication unavailable — libvirt に接続できない
libvirt グループへの追加が反映されていない状態です。
(出力なしの場合 → 再ログインが必要)
$ newgrp libvirt # または再ログイン
$ virsh list –all # これで通るはず
まとめ
Ubuntu 24.04 の QEMU/KVM 環境でスナップショットとクローンを実際に動かした結果をまとめます。
- qcow2 のシンプロビジョニングで、10 GB の仮想ディスクが作成直後は 196 KiB しか消費しない。スナップショットを2つ追加しても 212 KiB 程度の増加で済む
- 手軽な一時退避は
qemu-img snapshot -c、VM 定義も含めた管理はvirsh snapshot-create-asが向いている - 実行中の VM にスナップショットを取るなら
--atomicフラグは必須。データ破損を防ぐため、重要な VM は停止か一時停止してから取ると確実 - クローンは
virt-clone --auto-cloneの1コマンドで完結するが、SSH host key の再生成は忘れずに - ディスク障害への備えには
qemu-img convert -cで圧縮した qcow2 を別ストレージにコピーする手順を自動化する

VPS で KVM を動かす環境が手元にない場合は、Vultr の Bare Metal か、KVM ネスト仮想化を有効にした高コアプランが選択肢です。
仮想化の基礎がついたら、次のステップとして Docker を使ったコンテナ管理にも挑戦してみてください。コンテナはスナップショット的な概念をより手軽に扱える仕組みで、KVM の知識と組み合わせると使いどころが広がります。




コメント