web-dev-qa-db-ja.com

ブート時にVMを起動し、VM停止時にシャットダウンする方法は?

長い話...

この会社のPCのVMで実行されている小さなサーバーアプリをインストールする必要がありました。両方のコンピューターでWindows XP(レガシーソフトウェアを使用しているため、アップグレードはできません)を実行しており、現時点では追加のPCの購入は制限されています。そこで、ホストのWindowsの1つをVMに変換し、Lubuntuをインストールしました。次に、サーバーアプリをインポートすると、すべてが正常に機能します。起動プロセスとショットダウンプロセスを除き、すべてはユーザーに対してほとんど透過的です。

問題

ホストの起動時に両方のVMを起動し、Windows XPのVMがダウンしたときにPCをシャットダウンする方法を考えていましたか?現在、労働者はこれを手動で行っていますが、このプロセスを自動化したいと思います。

必要条件

  1. Lubuntuでは、起動時にログインするようにユーザーを設定する必要があります-> done!
  2. サーバーアプリVMはログオン時に起動する必要があります-> 不明
  3. Windows XP VMはログオン時に開始する必要があります-> 不明
  4. サーバーアプリVMは状態を保存し、Windows XPマシンが終了すると自動的に閉じます-> わからない
  5. Lubuntuは、すべてのVMが一時停止/閉じるとシャットダウンします。 -> わからない

システムは、VirtualBox 4.3.xを搭載したLubuntu 14.04で実行されています。

4
Yanick Rochon

次のような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ジョブ用のいくつかの手順があります(参考までに)。これを行う最新の方法を知っている人は、この投稿を編集するか、別の回答を投稿してください。

3
Geary Shull

cron jobと、bashスクリプトを介したvboxmanageの使用を組み合わせて行きます。

仮想マシンを起動し、マシンのステータスを確認するためにcronジョブを起動するbashスクリプトが必要です。

スクリプトは次のようになります。

#!/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

このファイルには、行の最後に新しい行が必要です(保存する前にEnterキーを押してください;))。このファイルは、5分ごとに実行され、bashスクリプトを実行するcronジョブを記述します。

では、この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を忘れないでください。ここでは、ユーザーのホームフォルダーにもファイルを配置しました。

便利で使いやすくするために、virtualboxes headless を実行し、リモートディスプレイで使用することもできます。

start_vms_and_cronjob.shをスタートアップアプリケーションに追加したら、設定する必要があります。

ここにあるのは:

  • システムが起動すると、仮想マシンはシェルスクリプトによって起動され、新しいcronジョブ(シェルスクリプトを実行)がcronジョブルールのtxtファイルから作成されます。
  • 5分ごとに、cronジョブはXP仮想マシンがまだ実行されているかどうかを確認するスクリプトを実行し、そうでない場合は他の仮想マシンを保存し、cronジョブを削除してシステムをシャットダウンします。

これが必要なものだけを構成するのに役立つことを願っています。

3
Ahti Komu

これらは、概説されたタスクを達成するための手順です。サーバーアプリケーションを使用するVMゲストは、以下のWindowsマシン「WindowsXP」である「ServerApp」と呼ばれます。これらを実際の名前に置き換えます。

以下の方法では、ホストマシンでカスタムXsessionを作成します。これには、このセッションを取り除いて、仮想マシンの実行に必要なアプリケーションのみをロードできるという利点があります(これには、本格的なデスクトップはおそらく必要ありません)。さらに、VirtualBoxに組み込まれた待機メソッドを使用すると、VM状態を監視するために追加のループを呼び出す必要がありません。

  1. 仮想マシンを実行するためのユーザーを作成します。
  2. ゲストへのゲスト追加 をインストールします
  3. でフルスクリーンに切り替える Host + F VMの実行中。
  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という名前の実行可能セッション起動スクリプトを作成します。

    #! /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アプリケーションの起動 がこのアプリケーションの終了を待つことです。次に、スクリプト内の2つのset guestpropertyコマンドを次のような行に置き換えます。

VBoxManage --nologo guestcontrol "WindowsXP" execute --image "C:\\full\\path\\to\\program.exe" --username <windowsuser> --password <password> --wait-exit --wait-stdout

VirtualBox Manual を参照してください。制限、およびWindowsでパスワードなしアカウント用にこれを設定する方法の詳細については。


手順5のスクリプトのコマンドの説明:

  • /usr/bin/lxsession -s Lubuntu LXDE
    Lubuntuセッションを開始します(該当する場合、他のカスタマイズされたXsessionに置き換えます)

  • VBoxManage startvm "ServerApp --type headless"
    サーバーアプリを実行する仮想マシンをヘッドレスモードで起動します(つまり、表示なし)

  • VBoxManage startvm "WindowsXP"
    Windowsを実行している仮想マシンを起動します(フルスクリーンまたは前回の実行時に定義されたその他の解像度)

  • VBoxManage guestproperty set "WindowsXP" RUNNING 1 --flags TRANSIENT
    ゲストOSから制御できるWindowsマシンのプロパティRUNNINGを設定します

  • VBoxManage guestproperty wait "WindowsXP" RUNNING
    プロパティRUNNINGがゲストWindowsから削除されるのを待ちます

  • VBoxManage controlvm "SeverApp" savestate
    savestateでサーバーアプリVMを終了します

  • dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
    /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
    ユーザーの操作なしでLubuntuホスト(電源オフ状態)を終了します。

3
Takkat