如何在启动时启动虚拟机,并在虚拟机停止时关闭虚拟机?

如何在启动时启动虚拟机,并在虚拟机停止时关闭虚拟机?

长话短说...

我必须在该公司的一台 PC 上安装一个在 VM 中运行的小型服务器应用程序。两台计算机都运行 Windows XP(使用旧版软件,因此无法升级),目前购买额外 PC 的机会有限。因此,我将其中一台计算机上的主机 Windows 转换为 VM,并安装了 Lubuntu。然后导入服务器应用程序,一切运行正常;除了启动和关闭过程外,一切对用户来说几乎都是透明的。

问题

我想知道如何在主机启动时启动两个虚拟机,然后在 Windows XP 虚拟机关闭时关闭 PC?目前,工作人员正在手动执行此操作,但我想使此过程自动化。

要求

  1. Lubuntu 应该配置一个用户在启动时登录 ->完毕!
  2. 服务器应用程序虚拟机应在登录时启动 ->不确定
  3. Windows XP VM 应在登录时启动 ->不确定
  4. 当 Windows XP 计算机终止时,服务器应用程序虚拟机应保存状态并自动关闭 ->不知道
  5. 当所有 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状态。

  1. 创建一个用户来运行虚拟机。
  2. 安装客人增加
  3. 运行虚拟机时使用Host+切换到全屏。F
  4. 在主机上定义自定义 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在登录时调用。

  5. ~/.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
    
  6. 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 中删除属性 RUNNING

  • VBoxManage controlvm "SeverApp" savestate
    在 savestate 中终止服务器 App VM

  • dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
    /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
    无需用户交互即可终止 Lubuntu 主机(关机状态)。

相关内容