我的主服务器通过VM中的VirtualBox运行其他几个服务器。
特别是,我有一个Web服务器,由于某种原因,如果它没有正确关闭,不会在grub菜单上自动选择,这意味着它会挂起,直到我在服务器上手动重置它。
每当我的服务器关闭时,如何确保我的VM正常关闭?
附加信息:“服务器”实际上是一台旧笔记本电脑,它运行的是Ubuntu Desktop 11.04并且不是无头(也运行媒体中心)。
我的主服务器通过VM中的VirtualBox运行其他几个服务器。
特别是,我有一个Web服务器,由于某种原因,如果它没有正确关闭,不会在grub菜单上自动选择,这意味着它会挂起,直到我在服务器上手动重置它。
每当我的服务器关闭时,如何确保我的VM正常关闭?
附加信息:“服务器”实际上是一台旧笔记本电脑,它运行的是Ubuntu Desktop 11.04并且不是无头(也运行媒体中心)。
Answers:
您可以使用该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...
这些是非常基本的示例,可以根据您的具体要求进行构建。它们可能还需要进行修改才能与您的操作系统配置一起正常工作。
man shutdown
查看这些选项,并VBoxManage --help
查看更多选项controlvm
。您还可以在调用shutdown之前添加条件逻辑以检查vm进程的状态。
VBoxManage showvminfo MyVM --machinereadable
并寻找属性VMState成为“poweroff”(或“跑步”以外的任何东西)
我使用在托管Windows Server 2003 VM的Debian上运行的qemu来做到这一点。我在Win2k3 VM上启用了“紧急管理服务”。这为您提供了串行端口上的“特殊管理控制台”。qemu允许您将虚拟串行端口连接到“telnet”端口,因此我给它一个本地主机地址。SAC允许您通过串行端口发出命令来干净地关闭系统,并且由于它类似于“紧急后门”,因此无论VM中可能发生什么,它都非常可靠。
然后,我创建了一个简短的expect
脚本来“登录”基于串行的SAC并发出shutdown命令。这包含在另一个脚本中,该expect
脚本将调用此脚本并等待2分钟以使qemu进程死亡。如果这个过程没有死亡,那么就会强行杀死它。设置Linux以在关闭时调用此脚本可确保VM始终干净地关闭(如果可能)。
因此,您可以根据自己的情况调整此方法。
如果您有Linux VM,那么您真的可以在Ubuntu系统上创建一个小脚本,通过ssh登录到VM并调用一个正确关闭系统的脚本。