専用マシンにアプライアンスとしてインストールするためのソフトウェアシステムを実行する必要があります。エネルギーを節約するために、代わりにVirtualBox VMでシステムを実行する予定です。
ホストはSysV-Initシステムを備えた標準のLinuxボックスであり、ゲストは大幅に変更されたLinuxであり、これをさらに変更する必要はありません。 VirtualBoxはOSEバージョンで使用されます。
ホストの起動時にVMを開始する方法をすでに理解しました(Edit:これは、以下にNikhilが述べたように、コマンドVBoxManager startvm
)、しかしどのようにしてVMを適切にシャットダウンできますか?ホストで実行中のスクリプトは、ゲストが完全にシャットダウンするまで待機する必要があります。
たとえば、これを行うサービスファイルがどのように見える必要があるかを誰かが提案できますか?
このコマンドセットからacpipowerbutton
を試しましたか?
VBoxManage controlvm <uuid>|<name>
pause|resume|reset|poweroff|savestate|
acpipowerbutton|acpisleepbutton|
コメントを読んだ後に編集します。
acpid
または他のacpiユーティリティを使用して、優雅にすることができます。また、現時点でマシンをどのようにシャットダウンするかについての詳細情報を提供できますか?
プレーンshutdown
は未完了のジョブを待たず、遅延時間が長すぎる可能性があります。
私はあなたがウィンドウマネージャを使用していないと思いますので、 this ツールを試してください。
見たばかり このデーモン 。あなたはそれが役に立つかもしれません。
これを自分でコーディングするのではなく、virtualboxインスタンスをインスタンス化して制御するために構築された Vagrant の使用を検討してください。ドキュメントはすばらしいので、自分でロールバックするのではなく、チェックアウトすることをお勧めします。
長い点と短い点は、単純な制御ファイルを作成してからvagrant up
を実行して、必要な数のVirtualBoxインスタンスを開始することです。 vagrant ssh
を使用してホストにログインし、vagrant halt
を使用して(終了せずに)ホストをシャットダウンできます。 vagrant destroy
はインスタンスを削除します。
Puppet、Ansible、Chefによるプロビジョニングをサポートし、公開されているVBox構成設定のほとんどを制御できます。
私はあなたと同じようなアプリケーションを持っていますが、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つのオプションがあります。
VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
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 が興味深い選択のようです。
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の状態は「電源オフ」になります。
Systemdベースのシステムの場合、これを試すことができます。
[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
$ Sudo systemctl enable vboxvmservice@vm_name.service
ホストからゲストにssh経由でコマンドを送信するのはどうですか?
それが機能するかどうか、後でマシンのステータスを確認できるかどうか、または終了ステータスのようなものを取得できるかどうかはわかりませんが、少なくともクリーンアップする必要があります。
Vmを起動するには:
VBoxManage startvm VMNAME --type headless
Vmを停止するには:
VBoxManage controlvm VMNAME savestate
実行中のすべてのVMを一覧表示します。
VBoxManage list runningvms
私の解決策:このシェルスクリプトでは、「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
}
...
ゲストにログインして、そこからシャットダウンしませんか?
SshdをインストールせずにVMにVBoxからアクセスする正当な理由がない限り、ssh shutdown -h now
を発行するだけのスクリプトを作成します。正直なところ、 dすべてのマシンのスクリプトを作成し、適切にシャットダウンして、そのマシンでいくつかのチェックを実行します。
ホストから他のスクリプトを呼び出す/etc/init.d/shutdown_vmスクリプトをパックするだけで、準備ができるまで呼び出しはブロックされます。このプロセス(説明)は、ゲストにLinux依存関係を追加しますが、ホストにあるVBox依存関係を削除します。
追いかける:マシンをシャットダウンするためにVBoxにアクセスする必要はありません。それにアクセスする手段(つまりssh)がある場合、OSは常にそのための手段をいくつか持っています(オンにすることはもちろん異なります)。
多分これは解決策の一部として役立つでしょう。
VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3 | while read uuid; do
VBoxManage controlvm $uuid savestate;
done