仮想ボックスのように予測可能な方法で QEMU スナップショット/savevm を操作するにはどうすればよいでしょうか?

仮想ボックスのように予測可能な方法で QEMU スナップショット/savevm を操作するにはどうすればよいでしょうか?

Q: 実行中の QEMU VM で、実行中に復元ポイントを保存するオプション (オンラインまたはオフライン) を持つ方法はありますか?

調査、既に検討された代替案、および小さな不満を述べた長いテキスト:

私は、VM とディスクの状態/変更を保存および破棄する、完全に互換性のない複数の qemu の方法を理解するのに苦労しています。

そこには-snapshotフラグ。しかし、それは行われていないようです(ドキュメントからの引用

これは進行中の作業であり、作業が進むにつれて状況が変化する可能性があります。

)、そしてゲストエージェントこれもまだ実行されていないようで、開発者が QMP から QAPI に移行する際に方針を変更し、その後 libvirt の過剰な「ソリューション」に取り組むために途中でそれを中止したため、多少壊れています。

どちらのドキュメントにも QEMU バージョン 0.16 ~ 17 と記載されていますが、私のシステムはすべてバージョン 7.2 以上なので、それが内部ライブラリのバージョンなのか、非常に古いドキュメントなのかはわかりません。

それからファイルシステムのスナップショット -drive file=hda.qcow2,snapshot=onこれは私のシステムでは機能しないようです。つまり、そのオプションを使用すると常にすべてが破棄されるため機能します。QCOW2 イメージのスナップショットに実際にデータをコミットする方法はありません。

そして、savevmモニターコマンドただし、これは実際に QCOW2 スナップショット機能を使用している唯一のもののようですが、多くの望ましくない CPU/メモリ状態も保存されます (これらは、後で問題を引き起こす厄介なものであり、まれな QA ケースでのみ役立ちます。また、次回の実行時に簡単に破棄して QCOW2 の変更のみを保持する方法がわかりません)。

そして、これが私が求めていたものです。常に変更をコミットする方法ですが、マシンがオフラインその点を保存スナップショットとしての保存

しかし、最後の方法は、qemu とイメージから完全に切り離されています。保存状態を追加する代わりに、進行に合わせて新しいファイル名を作成する必要があります。

理想的な状態は、このオフライン状態のメソッドを持ちながら、別のファイルではなく内部 QCOW2 スナップショット サポートを使用することだと思います。

最後に、別のオプションこれは最後のオフライン使用例ですが、オンラインで実行されます。つまり、VM の実行中に、qemu エージェントを介して実行を一時停止し、外部ホストに新しいスナップショット ファイルを作成し、実行中のインスタンスにその新しいスナップショット オーバーレイに切り替えて実行を再開するように指示します。

答え1

予測可能の意味がわかりませんが、おそらく次のものを探しているのだと思います:

List, apply, create or delete snapshots in image FILENAME.

qemu-img snapshot \
    [--object OBJECTDEF] [--image-opts] [-U] [-q] \
    [-l | -a SNAPSHOT | -c SNAPSHOT | -d SNAPSHOT] FILENAME


    Parameters to snapshot subcommand:

    SNAPSHOT
           Is the name of the snapshot to create, apply or delete

    -a     Applies a snapshot (revert disk to saved state)
    -c     Creates a snapshot
    -d     Deletes a snapshot
    -l     Lists all snapshots in the given image

(qemu-imgのマニュアルページから&https://www.qemu.org/docs/master/tools/qemu-img.html#cmdoption-qemu-img-commands-arg-snapshot

このコマンドは、内部qcow2 vm イメージ内のスナップショット/チェックポイント (他のディスク形式でも動作するかどうかはわかりません)。

qemu-img snapshot create -f qcow2 -b <backing.file> -F qcow2 <image.file>(新しいディスク上のイメージ ファイルを作成し、既存のファイルをバックアップ ファイルとして使用する形式とは異なります。 - 不変のアーカイブに適しています。)

特定の qemu バージョンでサポートされている機能の完全なリストについては、qemu-img --help出力を確認してください。

例:

$ qemu-img snapshot -l myamazingqemuvm.qcow2
$ qemu-img snapshot -c testing myamazingqemuvm.qcow2
$ qemu-img snapshot -l myamazingqemuvm.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         testing               0 B 2023-05-21 00:57:50 00:00:00.000          0
$ qemu-img snapshot -d testing myamazingqemuvm.qcow2
$ qemu-img snapshot -l myamazingqemuvm.qcow2
$

スナップショットを作成するには、qemu-img 書き込みロックが必要ファイルに対して、オフラインの VM に対してのみ機能することを意味します。


作成するにはスナップショットオンラインVM実行中のプロセス内から「HMP」コマンドを使用する必要がありますqemu-system

(qemu) savevm my_snapshot

(qemu) loadvm my_snapshot

それぞれスナップショットを保存およびロードします。ターミナルで起動した VM でこのようなコンソールを取得するには、次のmonitor引数を指定して起動します。

qemu-system-x86_64 [...] -monitor unix:/tmp/qemu-mon_${VMNAME}.sock,server,nowait

これにより、VM と通信するための Unix ソケットが作成されます。

#!/bin/sh
#
# connect to qemu monitor socket
# disconnect from it with Ctrl-C

MACHINE="${1}"
SOCKET="/tmp/qemu-mon_${MACHINE}.sock"

echo "CONNECTING TO ${MACHINE} ..."
socat ${SOCKET} STDIN

そして、あなたがしなければならないのは

$ ./qemu-monitor.sh myamazingqemuvm
CONNECTING TO myamazingqemuvm ...
QEMU 5.2.0 monitor - type 'help' for more information
(qemu) savevm testsnap
savevm testsnap
(qemu) loadvm testsnap
loadvm testsnap

... オフラインに戻ったら、次の方法に切り替えることができますqemu-img snapshot:

$ qemu-img snapshot -l myamazingqemuvm.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         testing               0 B 2023-05-21 00:57:50 00:00:00.000          0
2         testsnap          14.3 MiB 2023-05-21 01:03:45 00:05:32.995           

関連情報