我正在尝试找到一种解决方案,以便在主机关闭或重新启动时正常关闭在 VirtualBox Windows 下运行的任何客户虚拟机。
似乎最安全的选择是在主机开始关闭时触发“保存状态”命令,但不清楚主机是否会等待足够长的时间让虚拟机完成保存状态并关闭电源。
有人对这个(看似基本)问题有可靠的解决方案吗?
答案1
抱歉我迟到了。这个问题有一个确切的答案,尽管它需要一些命令行。有关更多信息,请参阅此主题帖子:https://forums.virtualbox.org/viewtopic.php?f=6&t=53684#p285540
您正在寻找的命令是:
“C:\Program Files\Oracle\VirtualBox\VBoxManage.exe” setextradata “VM 名称” GUI/DefaultCloseAction 关闭
这是我在多个虚拟机上使用的方法,关闭窗口后,它会自动启动安全关机。关闭 Windows,并在尝试关闭所有内容时,它会等待这些过程完成。
答案2
我遇到了类似的问题并通过运行 VirtualBox 作为服务解决了它:
https://github.com/onlyfang/VBoxVmService
使用 VBoxVMService,您可以选择机器的关机方式(保存状态、关闭电源)和启动方式。由于它作为服务运行,因此在系统关机过程中,Windows 会自动等待它关机。
答案3
不幸的是,对于通过 VirtualBox GUI 启动的虚拟机来说,这似乎是不可能的。即使 GUI 可能捕获主机关闭事件并做出反应,VirtualBox 服务也会终止:https://forums.virtualbox.org/viewtopic.php?p=278668#p278668
如果您不需要图形控制台,VBoxHeadlessTray 或 VBoxVMService 可能是您的最佳选择。两者都支持在 Windows 主机关闭和重启时自动保存和恢复。
VirtualBox 5.0 引入了“可拆卸用户界面”启动模式。此模式启动无头虚拟机,具有单独的 UI 进程。但是图形性能会受到影响,并且尚不支持 3D 加速。但也许将来可以将其与 VBoxHeadlessTray 结合使用(VBoxHeadlessTray 尚不支持 5.0。)链接至VBoxHeadlessTray GitHub 存储库以及相应的添加 VirtualBox 5 支持的 GitHub 拉取请求。
编辑:VBoxVmService 也不支持自 5.0 版起,新增了可拆卸模式。仅无头的到目前为止。我添加了功能要求为了那个原因。
答案4
我有一个类似的问题,并找到了这个页面。我不想将 VirtualBox 作为服务运行,因为我有很多虚拟机用于测试,并且通常会选择不同的虚拟机在 VirtualBox UI 中运行。当我关闭计算机时,手动保存每个虚拟机的状态很烦人。在这种情况下,使用脚本保存所有正在运行的虚拟机似乎是一个实用的解决方案。为了让 Daniel F 的回答更通用,我编写了这些脚本,它们会自动保存所有正在运行的虚拟机的状态,而无需明确命名它们。
保存正在运行的虚拟机.bat对于 Windows:
set VBoxManageEXE="%ProgramFiles%\Oracle\VirtualBox\VBoxManage.exe"
set ListRunningVMS=%VboxManageEXE% list runningvms
for /f tokens^=2^,4^ delims^=^" %%p in ('%ListRunningVMS%') do %VBoxManageEXE% controlvm %%p savestate
echo all vms saved, you can shutdown now.
rem shutdown /s /t 10
保存正在运行的虚拟机对于 Linux:
#!/bin/bash
vboxmanage list runningvms | while read line; do
#echo "VBoxManage controlvm $uuid savestate;"
echo $line
if [[ $line =~ \{(.*)\} ]]
then
vboxmanage controlvm ${BASH_REMATCH[1]} savestate
fi
done