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

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

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

主机是带有 SysV-Init 系统的标准 Linux 机器,来宾是经过大量修改的 Linux,我不希望对其进行进一步更改。 OSE版本中使用VirtualBox。

我已经弄清楚如何在主机启动时启动虚拟机(编辑:正如下面 Nikhil 提到的,这是通过命令VBoxManager startvm) 完成的,但是我怎样才能优雅地关闭虚拟机呢?在主机上运行的任何脚本都需要等待来宾完全关闭。

任何人都可以建议,例如,执行此操作的服务文件应该是什么样子?

答案1

您尝试过acpipowerbutton这个命令集吗?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

阅读评论后编辑:

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

Plainshutdown不会等待未完成的作业,时间延迟可能太长。

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

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

答案2

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

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

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

答案3

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

您感兴趣的是无头模式

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

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

如何优雅地关闭虚拟机?

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

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

提示:您可能会发现有用:

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

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

PS如果您对已实施的全功能解决方案感兴趣,开放堆栈似乎很有趣的选择。

答案4

对于基于 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

步骤#2:启用服务文件

$ sudo systemctl enable vboxvmservice@vm_name.service

参考

相关内容