我使用 Debian Jessie 作为使用 libvirt/qemu/kvm 的虚拟机主机。
我已将一些来宾虚拟机设置为在主机操作系统启动时自动启动,这工作正常。
出于维护目的,我正在运行"service libvirt-guests stop"
以关闭所有来宾(但不是主机)。
完成维护后,我想轻松地再次启动所有来宾(无需重新启动主机)。
是否有一个命令可以再次启动所有来宾虚拟机?我有兴趣了解两者:
再次启动所有自动启动标记的来宾的命令
一个命令,用于重新启动我运行之前正在运行的所有来宾
"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