如何以像虚拟盒一样可预测的方式使用 QEMU 快照/savevm?

如何以像虚拟盒一样可预测的方式使用 QEMU 快照/savevm?

问:有没有办法让 QEMU 虚拟机运行,让我可以选择(在线或离线)保存还原点?

长文,包含调查、已经研究过的替代方案和小吐槽:

我很难理解 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 快照支持而不是不同的文件。

最后,还有另外一个选择这是最后一个离线用例,但在线完成。即在运行虚拟机时,通过 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 需要写锁在文件上,这意味着它只适用于离线虚拟机。


要创建一个快照在线虚拟机,您需要在正在运行的qemu-system进程中使用“HMP”命令:

(qemu) savevm my_snapshot

(qemu) loadvm my_snapshot

分别用于保存和加载快照。要在终端启动的 VM 中获取此类控制台,您可以使用以下参数启动它monitor

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

这将创建一个 unix 套接字来与您的 VM 进行通信:

#!/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           

相关内容