在 qemu-system 中结合 -snapshot 和 -loadvm snap_id

在 qemu-system 中结合 -snapshot 和 -loadvm snap_id

在使用 qemu-system 启动客户机时,是否可以以某种方式同时使用 -snapshot 和 -loadvm snap_id?

目前,如果我同时使用这些选项,则无法启动访客。

我需要防止将数据保存到客户磁盘以避免其增长。-snapshot 允许动态实现它,但我还需要 -loadvm snap_id 来获取已启动的 VM,而不是等待它启动。

答案1

不幸的是 QEMU 不允许这样做,因为您可能会savevm在使用标志运行时保存内部快照(即命令)-snapshot。这是因为边缘情况:当您使用-snapshotQEMU 时,会创建一个临时映像,所有写时复制都保存在其中。现在,如果您savevm在此模式下运行,QEMU 会将内部快照写入临时映像,一旦您关闭机器,快照就会丢失。

为了克服这种极端情况,我们必须手动执行所谓的外部快照。请执行以下步骤来实现此目的(https://bugs.launchpad.net/qemu/+bug/1184089/comments/2

  1. -snapshot使用和运行 QEMU-monitor stdio
  2. 点击Enter获取(qemu)监控提示
  3. migrate "exec: gzip -c > memsnapshot.gz"migrate "exec: cat > memsnapshot"(即时加载时间)
  4. 现在-snapshot与上面的 memsnapshot 一起使用:qemu-* <whatever flags> -incoming "exec: gzip -c -d snapshot.gz" -snapshot或者qemu-* <whatever flags> -incoming "exec: cat memsnapshot" -snapshot

答案2

作为解决方法,我使用了外部快照类型。因此,一般算法如下:

  1. 从基本 qcow2 映像运行客户机
  2. 在客人内部做一些事情
  3. 关闭访客电源
  4. 借助 qemu-img 创建外部快照
  5. 从创建的快照运行客户机
  6. 通过socket连接qemu monitor,运行savevm命令保存当前guest的运行状态
  7. 再次关闭访客电源
  8. 使用外部快照和 -loadvm 参数在任何地方启动客户机

关于提到的问题,四年前提出了一个功能请求:https://bugs.launchpad.net/qemu/+bug/1184089

相关内容