我需要运行一个软件系统,该系统旨在作为设备安装在专用计算机上。为了节省能源,我打算在 VirtualBox VM 上运行系统。
主机是带有 SysV-Init 系统的标准 Linux 机器,来宾是经过大量修改的 Linux,我不希望对其进行进一步更改。 OSE版本中使用VirtualBox。
我已经弄清楚如何在主机启动时启动虚拟机(编辑:正如下面 Nikhil 提到的,这是通过命令VBoxManager startvm
) 完成的,但是我怎样才能优雅地关闭虚拟机呢?在主机上运行的任何脚本都需要等待来宾完全关闭。
任何人都可以建议,例如,执行此操作的服务文件应该是什么样子?
答案1
答案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