libvirt:启动所有启用自动启动的来宾虚拟机的命令

libvirt:启动所有启用自动启动的来宾虚拟机的命令

我使用 Debian Jessie 作为使用 libvirt/qemu/kvm 的虚拟机主机。

我已将一些来宾虚拟机设置为在主机操作系统启动时自动启动,这工作正常。

出于维护目的,我正在运行"service libvirt-guests stop"以关闭所有来宾(但不是主机)。

完成维护后,我想轻松地再次启动所有来宾(无需重新启动主机)。

是否有一个命令可以再次启动所有来宾虚拟机?我有兴趣了解两者:

  1. 再次启动所有自动启动标记的来宾的命令

  2. 一个命令,用于重新启动我运行之前正在运行的所有来宾"service libvirt-guests stop"

重新启动主机操作系统将实现#1,但我不想重新启动主机。

我尝试过,"service libvirt-guests start"但似乎没有成功。

答案1

就像@jason-harris 解决方案一样。但更简单,启动仅标记为自动启动。

for i in $(virsh list --name --autostart --inactive); do virsh start "$i"; done

更新:我在 libvirt 3.2.0(CentOS 7.4.1708)上进行了测试 更新:添加 --inactive 感谢 @lpaeen 评论

答案2

#! /bin/bash

xmlfiles=( $(find /etc/libvirt/qemu/autostart/ -name '*.xml') )

for f in "${xmlfiles[@]}" ; do
  domain=$(xml2 < $f | awk -F= '$1 == "/domain/name" {print $2}')

  # only start domain if it's not already running
  if ! virsh list | grep -q " ${domain} .*running" ; then
    virsh start "$domain"
  #else
    # optionally reboot domain otherwise
    #virsh reboot "$domain"
  fi

done

该脚本需要该xml2实用程序(xml2在 debian 中的包中,也可能在 ubuntu 中)。

它用于xml2从 libvirt 的 qemu 自动启动目录中的所有 XML 文件中提取域名,并virsh start在它们尚未运行时运行它们。

将其保存在您的路径中的某个位置,例如virsh-autostart.sh(或任何对您有意义的内容),并使其可以使用chmod.

答案3

我不相信有一个简单的命令可以做到这一点(但这会很棒!)。

我经常这样做,通常只是使用 for 循环和一些 awk 的快速脚本/一行命令。

请记住,如果您的虚拟机管理程序连接到其他虚拟机管理程序,您可能需要暂时断开该链接,以免无意中干扰其他虚拟机管理程序上的其他虚拟机。虽然我还没有看到很多人真正使用它,但我想指出这一点。

例如,假设您想重新打开所有内容,您可以键入以下内容来实现您想要的结果。这假设您是 root:

for i in `virsh list --all|awk '{print $2}'|grep -v Name`; do virsh start $i; done

该命令分解如下:

virsh list --all

显示所有虚拟机,无论它们是否打开。

awk '{print $2}'|grep -v Name

我们删除不需要的列,只打印带有虚拟机名称的列。然后我们用 grep 取出标题行,因为它实际上不是虚拟机。

virsh start $i

打开虚拟机。

这一切都围绕着一个通用的 for 循环。

答案4

Debian 伸展:

systemctl restart libvirtd

没有做这份工作。 Libvirt 实际上重新启动了其服务,但所有qemu进程和操作系统内部仍保持运行。

工作过:

systemctl stop libvirt-guests   # stops VMs
systemctl restart libvirtd      # starts VMs agains

相关内容