在使用 qemu-system 启动客户机时,是否可以以某种方式同时使用 -snapshot 和 -loadvm snap_id?
目前,如果我同时使用这些选项,则无法启动访客。
我需要防止将数据保存到客户磁盘以避免其增长。-snapshot 允许动态实现它,但我还需要 -loadvm snap_id 来获取已启动的 VM,而不是等待它启动。
答案1
不幸的是 QEMU 不允许这样做,因为您可能会savevm
在使用标志运行时保存内部快照(即命令)-snapshot
。这是因为边缘情况:当您使用-snapshot
QEMU 时,会创建一个临时映像,所有写时复制都保存在其中。现在,如果您savevm
在此模式下运行,QEMU 会将内部快照写入临时映像,一旦您关闭机器,快照就会丢失。
为了克服这种极端情况,我们必须手动执行所谓的外部快照。请执行以下步骤来实现此目的(https://bugs.launchpad.net/qemu/+bug/1184089/comments/2)
-snapshot
使用和运行 QEMU-monitor stdio
- 点击
Enter
获取(qemu)
监控提示 migrate "exec: gzip -c > memsnapshot.gz"
或migrate "exec: cat > memsnapshot"
(即时加载时间)- 现在
-snapshot
与上面的 memsnapshot 一起使用:qemu-* <whatever flags> -incoming "exec: gzip -c -d snapshot.gz" -snapshot
或者qemu-* <whatever flags> -incoming "exec: cat memsnapshot" -snapshot
答案2
作为解决方法,我使用了外部快照类型。因此,一般算法如下:
- 从基本 qcow2 映像运行客户机
- 在客人内部做一些事情
- 关闭访客电源
- 借助 qemu-img 创建外部快照
- 从创建的快照运行客户机
- 通过socket连接qemu monitor,运行savevm命令保存当前guest的运行状态
- 再次关闭访客电源
- 使用外部快照和 -loadvm 参数在任何地方启动客户机
关于提到的问题,四年前提出了一个功能请求:https://bugs.launchpad.net/qemu/+bug/1184089