VirtualBoxマシンを自動的に起動およびシャットダウンする方法は?


52

専用マシンにアプライアンスとしてインストールすることを目的としたソフトウェアシステムを実行する必要があります。エネルギーを節約するために、代わりにVirtualBox VMでシステムを実行する予定です。

ホストはSysV-Initシステムを備えた標準のLinuxボックスであり、ゲストは大幅に変更されたLinuxであり、これ以上変更する必要はありません。VirtualBoxは、OSEバージョンで使用されます。

ホストの起動時にVMを起動する方法はすでにわかっています(編集:これは、Nikhilが後述するようにコマンドを使用して行われますVBoxManager startvm)が、VMを正常にシャットダウンするにはどうすればよいですか?ホストで実行されているスクリプトは、ゲストが完全にシャットダウンするまで待つ必要があります。

たとえば、これを行うサービスファイルがどのように見える必要があるのか​​、誰でも提案できますか?


起動中に仮想マシンを起動する起動スクリプトを指定できますか?
初心者14

回答:


34

acpipowerbuttonこのコマンドセットから試してみましたか?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

コメントを読んだ後に編集します。

acpidまたは他のacpiユーティリティを使用して、優雅にすることができます。また、現時点でマシンをどのようにシャットダウンするかについての詳細情報を提供できますか?

プレーンshutdownは未完了のジョブを待たず、時間遅延が長すぎる可能性があります。

ウィンドウマネージャーを使用していないと思われるので、このツールを試してください。

このデーモンを見たばかりです。役に立つかもしれません。


返信いただきありがとうございます。unix.stackexchange.comへようこそ!しかし、あなたの答えも私の問題に対処していないのではないかと思います:acpipowerbuttonは実際のマシンの電源ボタンを押すことをシミュレートしますが、ホストでこのコマンドを発行した後、VMは再びシャットダウンするのに少し時間がかかります。
jstarek

4
承知しました。そのため、VMがまだ実行されているかどうかをチェックするループを作成する必要があります。ACPIは、このためにスクリプトで使用する方法とまったく同じです。vboxmanage list runningvmsVMがなくなるまで。
ニルス

OK、実際には管理ラッパーに落ち着くと思いますが、initscriptを指すと+50になります!
jstarek

16

これを自分でコーディングするのではなく、virtualboxインスタンスをインスタンス化して制御するために構築されたVagrantの使用を検討してください。ドキュメントは優れているので、自分でロールバックするのではなく、チェックアウトすることをお勧めします。

その長所と短所は、単純な制御ファイルを作成し、実行vagrant upして必要な数のVirtualBoxインスタンスを起動することです。を使用vagrant sshして、ホストにログインし、ホストvagrant haltをシャットダウンできます(終了することなく)。 vagrant destroyインスタンスを取り除きます。

Puppet、Ansible、またはChefによるプロビジョニングをサポートし、公開されているほとんどのVBox構成設定を制御できます。


2
私は浮浪者のファンですが、この場合、一体何を望みますか?OPは、独自のシステムを構築するのではなく、アプライアンスを実行しているため、プロビジョニングではポイントが完全に失われます。そして、基本的にvirtualboxでシステムを構築するプロセスを経て、それを行うために、vagrantを使用するためだけに、アプライアンスからカスタム「ボックス」を作成してください。
mc0e

10

似たようなアプリケーションがありますが、1つ違いがあります。システムを再起動し、スナップショットから回復する必要があります。

あなたが興味を持っているのはheadless-modeです

そのようなサービスがいくつかあるので、次のスクリプトを使用します。

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background

VMを正常にシャットダウンするにはどうすればよいですか?

VMを正常にオフにする場合、アプリケーションに応じて2つのオプションがあります。

  • 「シャットダウンボタン」または「スリープボタン」をエミュレートし、VMがそれに反応するように準備します(正常に閉じるため)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • 後で復元するためにVMの状態を保存します
    • VBoxManage controlvm <uuid>|<VMname> savestate

ヒント:以下が役立つ場合があります。

  • VBoxManage list vms -利用可能なvmsのリスト
  • rdesktop IP-ADDR:3389またはrdesktop-vrdp IP-ADDR:3389- ヘッドレスモードで実行するときにGUI(リモートでも)が必要な場合:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm -ローカルデバッグ用のGUIから開始

関連するVirtualBoxマニュアルの章:第7章リモート仮想マシン-ステップバイステップ:ヘッドレスサーバーでの仮想マシンの作成

PSフル機能の既に実装されたソリューションに興味がある場合、OpenStackは興味深い選択のようです。


10

http://www.virtualbox.org/manual/ch08.htmlの VirtualBox VM管理ドキュメントを見る

VMをリストするには、次のコマンドを使用します VBoxManage list vms

VMを起動するには、次のコマンドを使用します VBoxManage startvm

http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

VMを制御するには、 VBoxManage controlvm

controlvmサブコマンドを使用すると、現在稼働している仮想マシンの状態を変更することができます。以下を指定できます。

VBoxManage controlvm <vm> pause仮想マシンを一時的に保留にしますが、その状態を永久に変更することはありません。VMウィンドウは灰色でペイントされ、VMが現在一時停止していることを示します。(これは、GUIの[マシン]メニューで[一時停止]アイテムを選択するのと同じです。)

VBoxManage controlvm <vm> resume以前の一時停止コマンドを元に戻すために使用します。(これは、GUIの[マシン]メニューで[再開]項目を選択するのと同じです。)

VBoxManage controlvm <vm> reset仮想マシンでは、実際のコンピューターの[リセット]ボタンを押すのと同じ効果があります。仮想マシンのコールドリブート。ゲストオペレーティングシステムをすぐに再起動して再起動します。VMの状態は事前に保存されず、データが失われる可能性があります。(これは、GUIの[マシン]メニューで[リセット]項目を選択するのと同じです。)

VBoxManage controlvm <vm> poweroff仮想マシンでは、実際のコンピューターで電源ケーブルを引くのと同じ効果があります。繰り返しますが、VMの状態は事前に保存されず、データが失われる可能性があります。(これは、GUIの[マシン]メニューで[閉じる]項目を選択するか、ウィンドウの閉じるボタンを押して、ダイアログで[マシンの電源を切る]を選択するのと同じです。)

この後、VMの状態は「電源オフ」になります。


一部のシステムではvboxmanage、すべて小文字であることに注意してください。
アルセージュ

2
お返事のおかげで、残念ながら、これは私の問題に対処しません:私はする必要が優雅にゲストをシャットダウンするには、つまりは、ホスト持ってゲストの内側と「今-hシャットダウン」を発行待ちのゲストが完全にシャットダウンするまでに。いずれVBoxManage controlvmのサブコマンドは、それを行うことはありません。
jstarek

ホストがダウンする前に、ホストですべてのVMがダウンしていることを再確認することで確認できます。ゲスト内からホストを制御する必要がある場合は、virtualbox.org / manual / ch08.html#vboxmanage-guestcontrolを使用しますが、探しているものが得られない場合があります。/etc/init.d/vboxvms-serviceホストシステム上のスクリプトのような起動スクリプトを作成する必要があります。これにより、起動時にすべてのVMがオンになり、停止するとすべてのVMがダウンします。
ニキルマレー

VBoxManage controlvm savestateもう1つの可能性(少なくともgoogleが教えてくれます)は、マシンのステータスを保存し、クリーンにシャットダウンしますが、ホストを強制的に待機させる方法はありません。
バールン

5

systemdベースのシステムの場合、これを試すことができます。

ステップ#1:サービスファイルを作成する

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target

ステップ#2:サービスファイルを有効にする

$ sudo systemctl enable vboxvmservice@vm_name.service

参照資料


1
ここに回答を含め、オプションでより詳細な情報へのリンクを提供することをお勧めします。リンクターゲットは予告なく表示されなくなり、回答が価値のないものになります。
アントン

問題は、ここのリンク1のsystemdファイル全体を実際にコピーできないか、またはこれを行う必要があるかということです。
ヤンリュッグ

まあ、残念ながら「リンク切れ」は、これらのケースでは大きな問題がある...私が思うに、後世のために、以下の2行は、あなたのリンクの背後にある基本的な考え方をキャッチ:それは用途があること、サービスの作成ですVBoxHeadless -s %i起動すると、VBoxManage controlvm %i savestateVMを停止することを。
jstarek

Debian Jessieでこれを試しましたが、うまくいきませんでした。ユーザーとグループを作成し、すべてのファイルの所有権を設定します(/ dev / vbox *を含む)。ただし、サービスが開始されると、名前が正しい場合でもVMを見つけることができません。結局、通常のinitスクリプトを使用します。
mivk

3

ホストからゲストにssh経由でコマンドを送信する方法は?

それが機能するかどうか、また後でマシンのステータスを確認できるか、終了ステータスのようなものを取得できるかどうかはわかりませんが、少なくとも完全にダウンするはずです。


良い考えですが、これはゲストVMがホスト、少なくともsshポート(22)からネットワーク経由で到達可能であることを保証します。
ニキルマレー

基本的に、これは機能し、DNSエントリを介してLAN全体でアプライアンスに到達できます。ただし、ホストがダウンするたびにアプライアンスにsshするスクリプトを作成したとします。ゲストが完全にシャットダウンするまで、ブロック(一時停止)する必要があります。これがまさに私の質問のポイントです。スクリプトがゲストがダウンしていることをどのようにして知ることができますか。
jstarek

1
あなたのコメントは、すべてがゲストシステムではなくホストシステムでスムーズに動作することを前提としています。電源ケーブルがホストシステムに接続されている場合はどうなりますか?その異なる議論。ホストシステムのSysV-initは、サービススクリプトがゲストVMを正しい方法でオフにするロジックを理解している限り(サービスのリモートホストでのシャットダウンまたはvboxインターフェイスからの電源オフ)、サービススクリプトがVMを停止するのを待ちます。次に、成功または失敗のステータスをコンソールまたはinitに返します。
ニキルマレー

1
に関して:ゲストがダウンしたときにスクリプトがどのように認識するか、vmがVboxManagerインターフェイスからオンまたはオフになっているかどうか、ゲストがssh'ableであるかどうかを簡単に確認してください。また、VMがVboxmanagerから利用可能であり、そのssh'ableをタイムリーに実行できるかどうかを実行するホストシステムを監視します。
ニキルマレー

1

私の解決策:このシェルスクリプトでは、「root」が呼び出し側であり、「theuser」が「thevm」の所有者です

コマンドの出力がVBoxManage list runningvms空の文字列を返すと、vmsが終了したことがわかります。

...
start(){
    su -c "VBoxHeadless --startvm thevm" -s /bin/bash theuser &
    # maybe another vbox command
}

stop(){
    su -c "VBoxManage controlvm thevm acpipowerbutton" -s /bin/bash theuser
    # maybe another vbox command
    while [ "`su -c 'VBoxManage list runningvms' -s /bin/bash theuser`" != "" ]
    do
        echo waiting for VMs to shutdown
        sleep 3
    done
}
...

1

vmを起動するには:

VBoxManage startvm VMNAME --type headless

vmを停止するには:

VBoxManage controlvm VMNAME savestate

実行中のすべてのvmをリストします。

VBoxManage list runningvms

0

たぶんこれは解決策の一部として役立つでしょう。

VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3  | while read uuid; do
   VBoxManage controlvm $uuid savestate; 
done

0

ゲストにログインして、そこからシャットダウンしてみませんか?

sshdをインストールせず、VBoxを介してVMに実際にアクセスする正当な理由がない限り、単にを発行するスクリプトを探しますssh shutdown -h now。正直に言うと、すべてのマシンに対して適切にシャットダウンするスクリプトを作成し、そのマシンでいくつかの検査を実行します。

ホストからもう1つを呼び出す/etc/init.d/shutdown_vmスクリプトをパックするだけで、準備ができるまで呼び出しはブロックされます。このプロセス(説明)は、ゲストでLinux依存関係を追加しますが、ホストでVBox依存関係を削除します。

追いかけよう:マシンをシャットダウンするためにVBoxにアクセスする必要はありません。それにアクセスする手段(つまりssh)がある場合、OSには常に何らかの手段があります(オンにすることはもちろん異なります)


2つの理由:最初に、最初の質問で述べたように、大幅に変更されたゲストOSが本当に必要でない場合は変更したくありませんでした。第二に、さらに重要なことは、これは、ホストがシャットダウンされた場合、実行中のすべてのVMを自動的にシャットダウンするクリーンな方法を提供することを目的としていました。
jstarek 14年

@jstarekただし、必要がない場合はゲストOSを変更する必要はありません(99.99%の時間でログインする手段があるか、これは例外です)。まさにそれがアイデアです。ホストがダウンすると、ランタイムを変更するときに適切なスクリプトが呼び出され、ゲストにログが記録され、「内部」からシャットダウンされます。力」
エスタニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.