问:有没有办法让 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