我的家庭服务器通过虚拟机中的 VirtualBox 运行其他几台服务器。
具体来说,我有一个 Web 服务器,由于某种原因,如果它没有正确关闭,它就不会在 grub 菜单上自动选择,这意味着它会挂起,直到我在服务器上手动重置它。
如何确保我的虚拟机在服务器关闭时也能正常关闭?
附加信息:“服务器”实际上是一台旧笔记本电脑,它运行的是 Ubuntu Desktop 11.04,并且不是无头的(还运行媒体中心)。
答案1
您可以使用该VBoxManage
命令从命令行控制虚拟机。这允许您创建一个可以在关机前关闭虚拟机的脚本。
您可以运行一个非常基本的脚本来关闭虚拟机和主机......
#!/bin/bash
# poff.sh - poweroff the vm, then the host...
VBoxManage controlvm VMNAME acpipowerbutton && sudo shutdown -P 1
或者,您可以使用相同的命令作为添加到 .bashrc 文件的别名......
alias poff='VBoxManage controlvm VMNAME acpipowerbutton && sudo shutdown -P 1' # poweroff the vm, then the host...
这些是非常基本的示例,可以根据您的具体要求进行构建。它们可能还需要进行修改才能与您的操作系统配置正确配合使用。
答案2
我使用在托管 Windows Server 2003 VM 的 Debian 上运行的 qemu 完成了此操作。我在 Win2k3 VM 上启用了“紧急管理服务”。这为您提供了串行端口上的“特殊管理控制台”。qemu 允许您将虚拟串行端口连接到“telnet”端口,因此我为其提供了一个本地主机地址。SAC 允许您通过串行端口发出命令来彻底关闭系统,并且由于它类似于“紧急后门”,因此无论 VM 中可能发生什么情况,它往往都非常可靠。
然后,我创建了一个简短的expect
脚本来“登录”基于串行的 SAC 并发出关机命令。该脚本被包装在另一个脚本中,该脚本将调用此expect
脚本并等待 2 分钟,直到 qemu 进程终止。如果进程没有终止,则将强制终止它。将 Linux 设置为在关机时调用此脚本可确保 VM 始终干净地关闭(如果可能)。
因此您可能能够根据您的情况调整此方法。
如果您有 Linux VM,那么您实际上可以在 Ubuntu 系统上创建一个小脚本,通过 ssh 登录到 VM 并调用正确关闭系统的脚本。