この会社のPCのVMで実行されている小さなサーバーアプリをインストールする必要がありました。両方のコンピューターでWindows XP(レガシーソフトウェアを使用しているため、アップグレードはできません)を実行しており、現時点では追加のPCの購入は制限されています。そこで、ホストのWindowsの1つをVMに変換し、Lubuntuをインストールしました。次に、サーバーアプリをインポートすると、すべてが正常に機能します。起動プロセスとショットダウンプロセスを除き、すべてはユーザーに対してほとんど透過的です。
ホストの起動時に両方のVMを起動し、Windows XPのVMがダウンしたときにPCをシャットダウンする方法を考えていましたか?現在、労働者はこれを手動で行っていますが、このプロセスを自動化したいと思います。
システムは、VirtualBox 4.3.xを搭載したLubuntu 14.04で実行されています。
次のような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ジョブ用のいくつかの手順があります(参考までに)。これを行う最新の方法を知っている人は、この投稿を編集するか、別の回答を投稿してください。
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
をスタートアップアプリケーションに追加したら、設定する必要があります。
ここにあるのは:
これが必要なものだけを構成するのに役立つことを願っています。
これらは、概説されたタスクを達成するための手順です。サーバーアプリケーションを使用するVMゲストは、以下のWindowsマシン「WindowsXP」である「ServerApp」と呼ばれます。これらを実際の名前に置き換えます。
以下の方法では、ホストマシンでカスタムXsessionを作成します。これには、このセッションを取り除いて、仮想マシンの実行に必要なアプリケーションのみをロードできるという利点があります(これには、本格的なデスクトップはおそらく必要ありません)。さらに、VirtualBoxに組み込まれた待機メソッドを使用すると、VM状態を監視するために追加のループを呼び出す必要がありません。
ホストでカスタム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
という名前の実行可能セッション起動スクリプトを作成します。
#! /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アプリケーションの起動 がこのアプリケーションの終了を待つことです。次に、スクリプト内の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ホスト(電源オフ状態)を終了します。