如何自动启动和关闭 VirtualBox 机器?

jst*_*rek 53 virtual-machine virtualbox services

我需要运行一个软件系统,该系统旨在作为设备安装在专用机器上。为了节省能源,我计划在 VirtualBox VM 上运行系统。

主机是一个带有 SysV-Init 系统的标准 Linux 机器,来宾是一个经过大量修改的 Linux,我不想进一步修改它。VirtualBox 用于 OSE 版本。

我已经想出了如何在主机启动时启动 VM(编辑:这是通过命令完成的,正如 Nikhil 在下面提到的,通过命令VBoxManager startvm),但是我怎样才能正常关闭 VM?在主机上运行的任何脚本都需要等到来宾完全关闭。

任何人都可以建议如何,例如,执行此操作的服务文件必须看起来如何?

小智 34

你有没有尝试过acpipowerbutton这个命令集?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|
Run Code Online (Sandbox Code Playgroud)

阅读评论后编辑:

您可以使用acpid或 其他 acpi 实用程序使其优雅。另外,您能否提供有关目前如何关闭机器的更多信息?

平原shutdown不会等待未完成的工作,时间延迟可能太长了。

我假设您没有使用窗口管理器,所以试试这个工具。

刚看到这个守护进程。你可能会发现它很有用。

  • 当然。因此,您必须编写一个循环来检查 VM 是否仍在运行。ACPI 与我在脚本中为此使用的方法完全相同。`vboxmanage list runningvms` 直到你的虚拟机消失。 (5认同)

Aar*_*own 16

与其自己编写代码,不如考虑使用Vagrant,它是为实例化和控制 virtualbox 实例而构建的。文档非常好,我建议您检查一下,而不是尝试自己动手。

总而言之,您创建一个简单的控制文件,然后运行vagrant up以启动任意数量的VirtualBox 实例。您可以使用vagrant ssh登录到主机和vagrant halt关闭主机(不终止)。 vagrant destroy将摆脱实例。

它支持使用 puppet、Ansible 或 Chef 进行配置,并允许您控制大部分公开的 VBox 配置设置。

  • 我是流浪汉的粉丝,但在这种情况下,你到底想要它做什么?OP 正在运行一个设备,而不是构建自己的系统,因此配置完全没有抓住重点。为什么要从设备中制作一个自定义的“盒子”,只是为了使用 vagrant,而你基本上是通过使用 virtualbox 构建系统的过程来做到这一点的? (2认同)

Grz*_*cki 12

我和你有类似的应用程序,有一个区别:我需要重新启动系统并从快照中恢复。

您感兴趣的是headless-mode

我有一些这样的服务,所以我使用以下脚本:

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background
Run Code Online (Sandbox Code Playgroud)

如何优雅地关闭虚拟机?

如果您想正常关闭 VM,您有两种选择,具体取决于您的应用程序:

  • 模拟“关机按钮”或“睡眠按钮”并准备 VM 对其做出反应(以正常关闭)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • 保存 VM 状态以便之后恢复
    • VBoxManage controlvm <uuid>|<VMname> savestate

提示:您可能会觉得有用:

  • VBoxManage list vms - 可用虚拟机列表
  • rdesktop IP-ADDR:3389rdesktop-vrdp IP-ADDR:3389- 当您在无头模式下运行时想要GUI(甚至远程)时:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - 从 GUI 开始进行本地调试

相关 VirtualBox 手册的章节:第 7 章远程虚拟机 - 分步:在无头服务器上创建虚拟机

PS 如果您对已实现的全功能解决方案感兴趣,OpenStack似乎是一个有趣的选择。


Nik*_*ley 10

http://www.virtualbox.org/manual/ch08.html查看 VirtualBox VM 管理文档

要列出 VM,请使用命令 VBoxManage list vms

要启动虚拟机,请使用命令 VBoxManage startvm

http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

要控制 VM,请使用 VBoxManage controlvm

controlvm子命令允许您更改当前正在运行的虚拟机的状态。可以指定以下内容:

VBoxManage controlvm <vm> pause暂时搁置虚拟机,不永久更改其状态。VM 窗口将被绘制为灰色以指示 VM 当前已暂停。(这相当于在 GUI 的“机器”菜单中选择“暂停”项。)

使用VBoxManage controlvm <vm> resume到撤销之前的暂停指令。(这相当于在 GUI 的“Machine”菜单中选择“Resume”项。)

VBoxManage controlvm <vm> reset在虚拟机上的效果与在真实计算机上按下“重置”按钮的效果相同:虚拟机的冷重启,这将立即重新启动并再次启动来宾操作系统。虚拟机的状态没有事先保存,可能会丢失数据。(这相当于在 GUI 的“Machine”菜单中选择“Reset”项。)

VBoxManage controlvm <vm> poweroff在虚拟机上的效果与在真实计算机上拔电源线的效果相同。同样,VM的状态没有事先保存,数据可能会丢失。(这相当于在GUI的“机器”菜单中选择“关闭”项或按窗口的关闭按钮,然后在对话框中选择“关闭机器”。)

在此之后,VM 的状态将是“Powered off”。

  • 感谢您的回复,但不幸的是,这并没有解决我的问题:我需要*优雅地*关闭来宾,即在来宾内部发出“shutdown -h now”并让主机*等待*直到来宾关闭完全下来。`VBoxManage controlvm` 子命令都没有这样做。 (2认同)

小智 5

对于基于 systemd 的系统,您可以试试这个。

第 1 步:创建服务文件

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

步骤#2:启用服务文件

$ sudo systemctl enable vboxvmservice@vm_name.service
Run Code Online (Sandbox Code Playgroud)

参考