当前位置: 首页>>技术教程>>正文


在一个易于使用的bash命令中关闭所有VirtualBox(vagrant)VM(可以放入bash文件)

, , ,

问题描述

我使用vagrant进行开发。我忘了关闭一些虚拟机。当我退出主机时,Ubuntu关机过程似乎挂起。

可能有一种方法用一点commandline-fu来编写所有流浪盒的关闭?像下面这样的东西,但有些东西是有效的。

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;

最佳解决方案

对于Virtual Box机器的可编写脚本的控件,我们可以使用VBoxManage命令:

  • 列出正在运行的机器(返回名称和UUID):

    VBoxManage list runningvms
    
  • 停止通过”hibernating”运行VM(重新推荐以避免数据丢失)

    VBoxManage controlvm <name|uuid> savestate
    
  • Poweroff运行VM(不推荐,因为我们可能会丢失guest虚拟机中的数据)

    VBoxManage controlvm <name|uuid> poweroff
    
  • 在支持ACPI的guest虚拟机操作系统中使用ACPI(优先于poweroff以便正常关闭guest虚拟机)

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

另见:How to safely shutdown Guest OS in VirtualBox using command line

从OP更新

根据下面选择的正确答案,我添加了这个bash脚本“$HOME/bin/stop-vagrant.sh”。所以现在我有一些东西可以安全地开始停止我可能在会话中忘记的所有流浪的VM。

vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} savestate

命令解释:

vboxmanage list runningvms | – 获取VirtualBox下所有正在运行的vms的列表

sed -r 's/.*\{(.*)\}/\1/' | – 将字符串剥离为id号

xargs -L1 -I {} VBoxManage controlvm {} savestate – 在打开的每个框上运行save state命令。

xargs

  • -L1 – 一次取一行

  • -I {} – 使用{}作为下一个命令的占位符

次佳解决方案

另一个答案非常适合处理Virtualbox,但Vagrant有自己的处理虚拟机的机制,正如其中一条评论中所提到的,它支持的不仅仅是VirtualBox,目前仅支持VMWare,但谁知道以后呢!

这似乎对我有用:

vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend

注意:

这适用于1.6之后的Vagrant版本,对于旧版本,你应该升级,但如果你不能,那么关注Virtualbox的其他选项之一可能会更好。

第三种解决方案

我的机制:

vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;

  • global-status列出所有框

  • 筛选包含virtualbox的行(筛选出帮助文本,如果您正在使用其他提供程序,则会中断)

  • 过滤即只显示前9个字符(全局唯一ID)

  • 虽然我们仍然可以从该输入中读取一行,但请将其作为变量$ line读取:

    • 打印出$ line

    • 运行vagrant halt $line暂停该全局唯一ID的流浪者

这比上面的Virtualbox方法更好,因为它也会运行任何vagrant-configured关闭机制。

第四种方案

如果其他人遇到这个问题:对于那些使用VirtualBox的人来说,它已经可以解决这个问题,只涉及编辑文件:

# Contents of /etc/default/virtualbox
# ...
# ...
# SHUTDOWN_USERS="foo bar"  
#   check for running VMs of user 'foo' and user 'bar'
#   'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
#   select one of these shutdown methods for running VMs
#   acpibutton and savestate causes the init script to wait
#   30 seconds for the VMs to shutdown

## My original values
# SHUTDOWN_USERS=""
# SHUTDOWN=poweroff

## My current values
SHUTDOWN_USERS="all"
SHUTDOWN=savestate

好处是没有必要编辑/创建任何注销或init.d stript来运行在其他答案中发布的命令。缺点是这个解决方案特定于VirtualBox。

使用VirtualBox 4.3.18在Ubuntu 14.10上测试。

所有功劳都归功于this post

第五种方案

结合其他一些答案,这将关闭所有正在运行的virtualbox vagrant box:

vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt

第六种方案

我只使用vagrant halt。如果在没有进一步参数的情况下运行它,它将停止在Vagrantfile中定义的所有计算机。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1099.html,未经允许,请勿转载。