长话短说...
我必须在该公司的一台 PC 上安装一个在 VM 中运行的小型服务器应用程序。两台计算机都运行 Windows XP(使用旧版软件,因此无法升级),目前购买额外 PC 的机会有限。因此,我将其中一台计算机上的主机 Windows 转换为 VM,并安装了 Lubuntu。然后导入服务器应用程序,一切运行正常;除了启动和关闭过程外,一切对用户来说几乎都是透明的。
问题
我想知道如何在主机启动时启动两个虚拟机,然后在 Windows XP 虚拟机关闭时关闭 PC?目前,工作人员正在手动执行此操作,但我想使此过程自动化。
要求
- Lubuntu 应该配置一个用户在启动时登录 ->完毕!
- 服务器应用程序虚拟机应在登录时启动 ->不确定
- Windows XP VM 应在登录时启动 ->不确定
- 当 Windows XP 计算机终止时,服务器应用程序虚拟机应保存状态并自动关闭 ->不知道
- 当所有 VM 暂停/关闭时,Lubuntu 应该关闭。->不知道
该系统在 Lubuntu 14.04 和 VirtualBox 4.3.x 上运行。
答案1
您可以设置如下 Init.d/Systemd 脚本:
#! /bin/sh
# /etc/init.d/vbox
#Edit these variables! VMUSER=VMAdmin VMNAME="cdb62186-7c30-4c25-a0b0-e4a32cfb0504" BASEFOLDER=/home/VMAdmin/path/to/backups/
case "$1" in
start)
echo "Starting VirtualBox VM..."
sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
;;
reset)
echo "Resetting VirtualBox VM..."
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset
;;
stop)
echo "Saving state of Virtualbox VM..."
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate
;;
shutdown)
echo "Shutting down Virtualbox VM..."
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
;;
status)
sudo -H -u $VMUSER VBoxManage list vms -l | grep -e ^"$VMNAME": -e ^State | sed s/\ \ //g | cut -d: -f2-
;;
backup)
echo ""
sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton
echo "Waiting for VM "$VMNAME" to poweroff..."
until $(sudo -H -u $VMUSER VBoxManage showvminfo --machinereadable "$VMNAME" | grep -q ^VMState=.poweroff.)
do
sleep 1
done
FILENAME=$(date +"%Y_%m_%d-%T")
echo "Backing up Virtualbox VM to '$BASEFOLDER$FILENAME'..."
sudo -H -u $VMUSER VBoxManage clonevm "$VMNAME" --options keepallmacs --name $FILENAME --basefolder $BASEFOLDER
echo "Restarting VirtualBox VM..."
sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless
echo ""
;;
*)
echo "Usage: sudo service vbox {start|stop|status|shutdown|reset|backup}"
exit 1
;; esac
exit 0
请注意,我从这里获得该脚本:https://superuser.com/questions/789653/init-d-control-script-for-virtualbox-vm
请在安装脚本之前验证其中的命令,然后测试每个功能。您需要将其放在 /etc/init.d 目录中,并chmod +x
在其上运行以使其运行。然后检查并测试其功能。一旦满意,请运行:
sudo update-rc.d vbox defaults 99 01
这会将其设置为随系统启动。原始帖子包含一些 cron 作业步骤,仅供参考。如果有人知道执行此操作的更新方法,请随时编辑此帖子,或发布其他答案。
答案2
我会选择计划任务通过 bash 脚本执行 vboxmanage 的工作和使用。
我有一个 bash 脚本,它可以启动虚拟机并启动 cron 作业来检查机器的状态。
该脚本看起来应该是这样的:
#!/bin/bash
vboxmanage startvm "Server App VM name"
vboxmanage startvm "Windows XP VM name"
crontab ~/check_vms_and_shutdown_job.txt
假设我们将其另存为start_vms_and_cronjob.sh
。记住chmod +x
它,这样它才能真正执行。
您可能对该check_vms_and_shutdown_job.txt
文件感到好奇。它是一个文本文件,包含有关应以特定间隔运行的作业的信息。在此示例中,我们将其放在用户的主文件夹中,它应显示为:
*/5 * * * * ~/check_vms_and_shutdown.sh
此文件的行尾应有一个新行(保存前按回车键;))此文件的作用是描述每 5 分钟运行一次的 cron 作业并执行 bash 脚本。
现在check_vms_and_shutdown.sh
你可能会问这个脚本是什么?好吧,重点是这样的。它应该说:
#!/bin/bash
if vboxmanage list runningvms | grep "Windows XP VM name"
then
echo "Windows XP still running."
else
echo "Windows XP shut down. Shutting down the rest."
vboxmanage controlvm "Server App VM name" savestate
crontab -r
shutdown -h now
fi
现在它要做的事情是,检查 XP 虚拟机是否正在运行。如果没有,它将命令服务器应用虚拟机保存其状态。之后,cronjob 将被删除,系统将关闭。请记住,chmod +x
这里我们还将文件放在了用户的主文件夹中。
为了方便和更好地使用,你可能还需要运行虚拟机无头的并通过远程显示来实现它们的使用。
现在将其添加start_vms_and_cronjob.sh
到您的启动应用程序中,您就可以设置了。
因此我们得到的是:
- 当系统启动时,虚拟机由shell脚本启动,并根据cron作业规则txt文件创建一个新的cron作业(运行shell脚本)。
- 每 5 分钟,cron 作业运行一次脚本,检查 XP 虚拟机是否仍在运行,如果没有,它将保存其他虚拟机,删除 cron 作业并关闭系统。
希望这可以帮助您配置您所需要的内容。
答案3
这些是完成所述任务的步骤。带有服务器应用程序的 VM 客户机将被称为“ServerApp”,Windows 计算机将被称为“WindowsXP”。将这些替换为其真实名称。
下面的方法涉及创建一个自定义Xsession在主机上。这样做的好处是,我们可以精简此会话,只加载运行虚拟机所需的应用程序(我们可能不需要完整的桌面)。此外,使用VirtualBox 内置的等待方法不需要调用任何额外的循环来监控VM状态。
- 创建一个用户来运行虚拟机。
- 安装客人增加
- 运行虚拟机时使用Host+切换到全屏。F
在主机上定义自定义 Lubuntu 会话:
创建一个文件
/usr/share/xsessions
并命名,例如WindowsVM.desktop
包含以下内容:[Desktop Entry] Name=WindowsXP # or any other sensible name Comment=Custom Xsession running a VM Exec=/etc/X11/Xsession
使此文件可执行。此会话将
~/.xsession
在登录时调用。
~/.xsession
创建在上述用户的 HOME 中命名的可执行会话启动脚本:#! /bin/bash /usr/bin/lxsession -s Lubuntu LXDE & VBoxManage startvm "ServerApp" --type headless VBoxManage startvm "WindowsXP" VBoxManage guestproperty set RUNNING 1 --flags TRANSIENT VBoxManage guestproperty wait "WindowsXP" RUNNING VBoxManage controlvm "SeverApp" savestate dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
4.登录时选择自定义会话。
棘手的是要从虚拟机中删除客户属性 RUNNING(或我们选择的任何其他名称),因为它并不像规范建议的那样短暂。不幸的是,它会在虚拟机关闭/断电后继续存在。
因此,我们必须使用 VBoxcontrol.exe(随客户机添加程序一起安装)在客户机 Windows 的关机例程结束时(或从我们在那里放置的关机脚本)添加以下命令:
VBoxControl.exe guestproperty set RUNNING
这将终止wait
状态以继续保存“ServerAPP”,然后关闭主机。
另一种方法是启动 Windows 应用程序在客户机上等待此应用程序终止,然后我们关闭机器并关闭主机。然后我们将set guestproperty
脚本中的两个命令替换为类似以下的一行:
VBoxManage --nologo guestcontrol "WindowsXP" execute --image "C:\\full\\path\\to\\program.exe" --username <windowsuser> --password <password> --wait-exit --wait-stdout
看VirtualBox 使用手册了解限制以及如何在 Windows 中为无密码帐户进行设置的更多详细信息。
步骤5中的脚本命令解释:
/usr/bin/lxsession -s Lubuntu LXDE
启动 Lubuntu 会话(如果适用,可以用任何其他定制的 Xsession 替换)VBoxManage startvm "ServerApp --type headless"
以无头模式(即无显示)启动运行服务器App的虚拟机VBoxManage startvm "WindowsXP"
启动运行 Windows 的虚拟机(全屏或上次运行时定义的任何其他分辨率)VBoxManage guestproperty set "WindowsXP" RUNNING 1 --flags TRANSIENT
为 Windows 计算机设置一个属性“RUNNING”,该属性可从客户操作系统进行控制VBoxManage guestproperty wait "WindowsXP" RUNNING
等待从客户机 Windows 中删除属性 RUNNINGVBoxManage controlvm "SeverApp" savestate
在 savestate 中终止服务器 App VMdbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
/org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
无需用户交互即可终止 Lubuntu 主机(关机状态)。