ホストコンピューターがシャットダウンまたは再起動されたときに、VirtualBox Windowsで実行されているゲストVMを適切にシャットダウンするソリューションを見つけようとしています。
最も安全なオプションは、ホストがシャットダウンを開始したときに「状態の保存」コマンドをトリガーすることですが、ホストがVMが状態の保存を完了して電源をオフにするのに十分な時間待機するかどうかは明確ではありません。
誰かがこの(一見基本的な)問題の堅牢な解決策を持っていますか?
同様の問題があり、VirtualBoxをサービスとして実行することで解決しました。
http://vboxvmservice.sourceforge.net/
VBoxVMServiceを使用すると、マシンのシャットダウン方法(状態の保存、電源オフ)と起動方法を選択できます。サービスとして実行されているため、Windowsはシステムのシャットダウンプロセス中に、シャットダウンするまで自動的に待機します。
パーティーに遅れてすみません。これには正確な答えがありますが、コマンドラインfooが必要です。詳細については、このスレッドの投稿を参照してください: https://forums.virtualbox.org/viewtopic.php?f=6&t=53684#p28554
あなたが探しているコマンドは:
"C:\ Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata "VM NAME" GUI/DefaultCloseAction Shutdown
これは私が複数のVMで使用するもので、ウィンドウを閉じると、自動的に安全なシャットダウンが開始されます。 Windowsをシャットダウンし、すべてを閉じようとすると、これらのプロセスが完了するのを待ちます。
残念ながら、これはVirtualBox GUIを介して起動されたVMでは可能ではないようです。 GUIがホストのシャットダウンイベントをキャッチして反応する場合でも、VirtualBoxサービスは終了します。 https://forums.virtualbox.org/viewtopic.php?p=278668#p278668
グラフィカルコンソールが必要ない場合は、VBoxHeadlessTrayまたはVBoxVMServiceが適しています。どちらもWindowsホストのシャットダウンと再起動時に自動保存と再開をサポートします。
VirtualBox 5.0は "detachable UI" 開始モードを導入します。このモードは、ヘッドレスVMを別のUIプロセスで開始します。グラフィックパフォーマンスは低下しますが、3Dアクセラレーションはまだサポートされていません。ただし、将来的にはこれをVBoxHeadlessTrayと組み合わせることができます(VBoxHeadlessTrayは5.0はまだサポートされています。) VBoxHeadlessTray GitHubリポジトリ および対応する VirtualBox 5サポートを追加するためのGitHubプルリクエスト へのリンク。
編集:VBoxVmServiceも サポートしていません バージョン5.0の新しい取り外し可能モード。これまでのところheadlessのみです。そのために 機能リクエスト を追加しました。
Startmenuの電源ボタンの代わりに使用する3つのバッチスクリプトがあります。
do_shutdown.bat(10秒の待機期間でpcをシャットダウンします。これは、vmのsavestateに10秒の時間を与えるのではなく、10秒以内にシャットダウンをキャンセルできるようにするためです。カウントダウンは、vmの終了後に開始します。シャットダウンされました)
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Server" savestate
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Minimal" savestate
shutdown /s /t 10
do_reboot.bat(VMがシャットダウンした直後に再起動します)
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Server" savestate
"C:\VirtualBox\VBoxManage.exe" controlvm "Ubuntu Minimal" savestate
shutdown /r /t 0
do_cancel.bat(10秒の待機期間内にpc-shutdownをキャンセルできます。do_shutdown.batでシャットダウンされたため、VMを再起動します)
shutdown /a
C:\VirtualBox\VBoxManage.exe startvm "Ubuntu Minimal" --type headless
C:\VirtualBox\VBoxManage.exe startvm "Ubuntu Server" --type headless
savestate
の代わりに、次のいずれかを使用することもできます
poweroff - pulls the plug
(probably not a good idea...)
acpipowerbutton - presses the power off button for a clean shutdown
("The system is going down for power off NOW!" to all consoles)
acpisleepbutton - tells the os to go to sleep
(probably just as bad as poweroff)
同様の質問があり、このページを見つけました。 VirtualBoxをサービスとして実行したくないのは、テスト用のVMがたくさんあるためです。通常、VirtualBox UIで実行するVMを複数選択します。コンピューターをシャットダウンすると、各VMの状態を手動で保存するのは面倒です。スクリプトを使用して実行中のすべてのVMを保存することは、この場合の実用的な解決策のようです。ダニエルFの回答をより一般的にするために、明示的に名前を付けることなく、実行中のすべてのVMの状態を自動的に保存するこれらのスクリプトを作成しました。
saveRunningVMs.bat Windowsの場合:
set VBoxManageEXE="%ProgramFiles%\Oracle\VirtualBox\VBoxManage.exe"
set ListRunningVMS=%VboxManageEXE% list runningvms
for /f tokens^=2^,4^ delims^=^" %%p in ('%ListRunningVMS%') do %VBoxManageEXE% controlvm %%p savestate
echo all vms saved, you can shutdown now.
rem shutdown /s /t 10
saveRunningVMs.sh Linuxの場合:
#!/bin/bash
vboxmanage list runningvms | while read line; do
#echo "VBoxManage controlvm $uuid savestate;"
echo $line
if [[ $line =~ \{(.*)\} ]]
then
vboxmanage controlvm ${BASH_REMATCH[1]} savestate
fi
done
実行中のすべてのVirtualBox VMを一時停止するpythonスクリプトを作成し、ログアウト時にスケジュールされたタスクとしてスクリプトを実行するようにシステムを設定しました。
この方法がどれほど信頼できるかはわかりません。 他の人が指摘したように Winlogon 7002タスクが完了するまでシステムが待機する時間には制限があります。しかし、個人的には、4 GB以上のVM全体で複数の実行中のVMを使用しても、使用可能な保存状態が得られるという問題はありませんでしたVM RAM。
設定手順は次のとおりです。
python.exe
、 例えば c:\Python27\python.exe
C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
VirtualBox VMはログアウト/再起動/シャットダウンで一時停止する必要があります。
シャットダウンを実行するpythonスクリプトは以下のとおりです。
# A script to suspend all running VirtualBox VMs
import os
import subprocess
import sys
class VM(object):
def __init__(self, name, uuid):
self.name = name
self.uuid = uuid
def __repr__(self):
return "VM(%r,%r)" % (self.name, self.uuid)
class VBoxRunner(object):
def __init__(self):
program_files = os.environ["ProgramW6432"]
vbox_dir = os.path.join(program_files, "Oracle", "VirtualBox")
self.vboxmanage_filename = os.path.join(vbox_dir, "VBoxManage.exe")
def vbox_run(self, *args):
subprocess.check_call([self.vboxmanage_filename] + list(args))
def vbox_run_output(self, *args):
return subprocess.check_output([self.vboxmanage_filename] + list(args))
def list(self, running=True):
if running:
list_cmd = "runningvms"
else:
list_cmd = "vms"
return [self.parse_vm_list_entry(x) for x in self.vbox_run_output("list", list_cmd).strip().split("\n")]
def suspend_all(self):
success = True
stopped_some_vms = False
vms = self.list(running=True)
for vm in vms:
if vm is None:
continue
# noinspection PyBroadException
try:
self.suspend_vm(vm)
except:
success = False
else:
stopped_some_vms = True
if not stopped_some_vms:
self.message("No running vms")
return success
@staticmethod
def parse_vm_list_entry(x):
""":type x: str"""
if not x.startswith('"'):
return None
end_pos = x.find('"', 1)
if end_pos == -1:
return None
name = x[1:end_pos]
assert x[end_pos + 1: end_pos + 3] == " {"
assert x.endswith("}")
uuid = x[end_pos + 2:]
return VM(name, uuid)
@staticmethod
def message(msg):
print >>sys.stderr, msg
def suspend_vm(self, vm):
assert isinstance(vm, VM)
self.vbox_run("controlvm", vm.uuid, "savestate")
def main():
vr = VBoxRunner()
success = vr.suspend_all()
if not success:
sys.exit(1)
if __name__ == "__main__":
main()