web-dev-qa-db-ja.com

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

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

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

ホストの起動時にVMを開始する方法をすでに理解しました(Edit:これは、以下にNikhilが述べたように、コマンドVBoxManager startvm)、しかしどのようにしてVMを適切にシャットダウンできますか?ホストで実行中のスクリプトは、ゲストが完全にシャットダウンするまで待機する必要があります。

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

52
jstarek

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

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

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

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

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

私はあなたがウィンドウマネージャを使用していないと思いますので、 this ツールを試してください。

見たばかり このデーモン 。あなたはそれが役に立つかもしれません。

34

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

長い点と短い点は、単純な制御ファイルを作成してからvagrant upを実行して、必要な数のVirtualBoxインスタンスを開始することです。 vagrant sshを使用してホストにログインし、vagrant haltを使用して(終了せずに)ホストをシャットダウンできます。 vagrant destroyはインスタンスを削除します。

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

16
Aaron Brown

私はあなたと同じようなアプリケーションを持っていますが、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-使用可能なVMのリスト
  • rdesktop IP-ADDR:3389またはrdesktop-vrdp IP-ADDR:3389-ヘッドレスモードで実行しているときにGUIが必要な場合(remotely):VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm-ローカルデバッグ用のGUIから開始

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

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

10

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

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の状態は「電源オフ」になります。

10
Nikhil Mulley

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

参考文献

5
Jan Rüegg

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

それが機能するかどうか、後でマシンのステータスを確認できるかどうか、または終了ステータスのようなものを取得できるかどうかはわかりませんが、少なくともクリーンアップする必要があります。

3
Baarn

Vmを起動するには:

VBoxManage startvm VMNAME --type headless

Vmを停止するには:

VBoxManage controlvm VMNAME savestate

実行中のすべてのVMを一覧表示します。

VBoxManage list runningvms
1
VVB

私の解決策:このシェルスクリプトでは、「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
Jorge Sanchez

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

SshdをインストールせずにVMにVBoxからアクセスする正当な理由がない限り、ssh shutdown -h nowを発行するだけのスクリプトを作成します。正直なところ、 dすべてのマシンのスクリプトを作成し、適切にシャットダウンして、そのマシンでいくつかのチェックを実行します。

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

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

0
estani

多分これは解決策の一部として役立つでしょう。

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