重新启动时关闭 ("destroy") libvirt VM

shut down ("destroy") libvirt VM when it reboots

有一段时间,我使用 virt-install 在 libvirt 虚拟机上安装 OS。我了解到 OS 具有自动安装程序功能,需要使用第二张 CD-ROM(将有关所需配置的信息提供给安装程序),但我发现 virt-install 不幸地忽略了除一个之外的所有配置--cdrom 参数。我想出的替代方案是使用 --print-xml 参数将 VM 配置 virt-install would use with just one CD-ROM 输出到一个文件,编辑它文件添加第二个CD-ROM,然后使用virsh create <xml config file>.

我之前使用 virt-install 时,VM 在安装结束时自行重启,virt-install 会注意到并关闭 ("destroy") VM,而不是允许它运行重新启动,给我留下一个干净的安装磁盘映像。但是,现在当 VM 在完成安装后重新启动时,它实际上会再次启动而不是干净地关闭,所以我无法以编程方式判断安装何时完成。重新启动后,似乎正在使用相同的 qemu-system-x86_64 进程,所以我也无法使用它来判断安装何时完成。

如何强制 libvirt 关闭 ("destroy") VM,而不是像 virt-install 那样重新启动?或者,我可以使用其他一些指示器来判断是否发生了 VM 重启?

虽然似乎没有办法通过 virsh create 的特殊咒语或通过更改域 XML 文件中的选项在重新启动时自动销毁 libvirt VM,但我偶然发现了非常有用的 virsh event 命令:

$ virsh help event
  NAME
    event - (null)

  SYNOPSIS
    event [<domain>] [<event>] [--all] [--loop] [--timeout <number>] [--list]

  DESCRIPTION
    List event types, or wait for domain events to occur

  OPTIONS
    [--domain] <string>  filter by domain name, id, or uuid
    [--event] <string>   which event type to wait for
    --all                wait for all events instead of just one type
    --loop               loop until timeout or interrupt, rather than one-shot
    --timeout <number>   timeout seconds
    --list               list valid event types

命令阻塞,直到指定域发生指定类型的事件。这使我能够通过以下方式实现模拟 virt-install 中的行为的目标:

$ virsh event domain1 --event restart
event 'reboot' for domain -
events received: 1
$ virsh destroy domain1

它甚至给了我一个内置的超时机制!