« | »

2014.01.19

“vmrun”コマンドTips

もともとサーバー構築Tipsに掲載予定だったのですが、なかなかそちらの記事作成まで時間を作ることが出来ないので、個別Tipsをblogの方に投稿して行こうと思います。 今回はVMwareWorkstaionに内包されている”vmrun”コマンドのTipsについて。

 

vmrunコマンドはコマンドラインで仮想PCを制御する事を目的としたコマンドで、通常はGUIコンソールで制御する仮想PCの電源ON/OFF/Suspendといった制御が可能となります。 CUIで制御可能なので、シェルスクリプトから仮想PCを制御可能となりますので、仮想PCをサーバーとして仕立てて、自動実行・自動シャットダウンなどを行うのに必須といえるコマンドです。

VMware公式にはVMwareWorkstaion9用のドキュメント一覧があります。

ここに”Using vmrunto Control Virtual Machines“としてエントリされているのがvmrunのコマンド解説です。

英文なのでちょっと理解するのに時間を要しますが、一読の価値はあると思います。

以下では、vmrunコマンドの代表的なオプションを使用したTipsを記載します。

 

当サイトでは、システム起動時に複数の仮想サーバーを一括起動したり、UPSから停電の信号を受け取った場合のシャットダウン、週に一回cronでのシステム再起動といったイベントでこれらvmrunを使用して仮想PC(仮想サーバー)の制御を行っています。

下記に、システム起動スクリプトとcron用再起動スクリプトを参考として記載します。

 

仮想PC起動スクリプト

 

#!/bin/bash
echo VMwareworkstaion  Server START!! >> /home/system_user/logfile

echo START OLD Web server /var/vm/vmmachine/OLD_WEB/OLD_WEB.vmx `date` >> /home/system_user/logfile
vmrun start /var/vm/vmmachine/OLD_WEB/OLD_WEB.vmx nogui

echo START NEW Web server /var/vm/vmmachine/WEB/WEB.vmx `date` >> /home/system_user/logfile
vmrun start /var/vm/vmmachine/WEB/WEB.vmx nogui

echo START Xmail server /var/vm/vmmachine/Xmailserver/Xmailserver.vmx `date` >> /home/system_user/logfile
vmrun start /var/vm/vmmachine/Xmailserver/Xmailserver.vmx nogui

echo START SMB server /var/vm/vmmachine/samba/samba.vmx `date` >> /home/system_user/logfile
vmrun start /var/vm/vmmachine/samba/samba.vmx nogui

echo START Re-Proxy server /var/vm/vmmachine/reverse/reverse.vmx `date` >> /home/system_user/logfile
vmrun start /var/vm/vmmachine/reverse/reverse.vmx nogui

仮想PCを起動する場合は “vmrun start vmxファイルパス nogui” で起動します。

 

“nogui”を指定しなかった場合はお馴染みのVMwareのGUI管理コンソールが起動しますので、”nogui”を指定してバックグラウンド起動にします。 バックグラウンド起動した場合、仮想PCの起動状況はssh なり vncリモートデスクトップなどでアクセスする必要があります。

 

仮想PCシャットダウンスクリプト

vmrunで仮想PCをシャットダウンする場合、事前準備として管理コンソールで”PowerOFF”ボタンを押した場合の挙動を”Shutdown”に指定する必要があります。 これはvmrunコマンドで”stop”オプションの挙動がPowerOFFボタンを押した挙動に値するため、PowerOFFの挙動が電源断の指定の場合は最悪仮想PCのクラッシュにつながるためです。

よって事前にVirtual Machine SettingでPowerオプションの指定を実施しておきます。

 

このセッティングを行っている前提であれば、下記スクリプトで仮想PCを一斉シャットダウンを実施し、ホストPCもリブートするスクリプトが実行可能となります。

#!/bin/bash
echo cron maintenance reboot start !! `date` >> /home/system_user/logfile

# NFSが動いているので、一旦同期処理実施
sync
sync
sync
# 実行中の仮想サーバーのリスト取得して一斉にシャットダウン指定。
for i in `vmrun list | grep vmx`
do
    echo VM Machine $i Shutdown! `date` >> /home/system_user/logfile
    `vmrun stop  $i` &
done


# 仮想サーバーがすべて停止するまで待つ。
VMX=`vmrun list | grep vmx | wc -l`
while [ $VMX -ne 0 ]
do
    sleep 3
    VMX=`vmrun list | grep vmx | wc -l`
done


# 仮想サーバーがすべて停止したならば、再度ディスクの同期を行い、再起動する。
sleep 1
sync
sync
echo All VM Machine Shutdown Complate!! `date`  >> /home/system_user/logfile
echo Reboot System  >> /home/system_user/logfile
reboot


 

スクリプトでは最初にsyncコマンド3連続実行していますがこれはNFSのキャッシュを一旦ディスクに吐き出すためです。

当サイトのホストPCと仮想PCとはNFSでディスク共有していますが、書き込み処理を高速化するためNFS接続は非同期接続としています。 一般にNFSの非同期接続は危険とされていますが、これは物理的にイーサネットで接続されている場合の話。

ホストPCと仮想PCとはvmnetによる仮想ネットワーク接続なので、ソフトウェア的にはネットワーク接続になっていますが実態はメモリブロック転送により実装されています。 なのでディスク書き込み処理が同期処理というのはパフォーマンスが著しく低下します。

VMwareを使用して仮想ネットワークで接続している場合は、ネットワークケーブル断などのリスクが無いので、NFS接続は非同期接続がもっとも効率よく取り扱えます。 ただしディスク書き込みデータは膨大にメモリにキャッシュされますので、仮想PCをシャットダウンする場合はディスク同期処理は必須となります。

 

続いて、ループ処理でvmrunコマンドの”list”オプションを用いて実行中の仮想PCのVMXデータを吸い上げ、”stop”オプションを指定して順次仮想PCに対してPowerOFFを要求していきます。

vmrunコマンドの”stop”オプションで仮想PCを停止させる場合、vmrunはより確実な動作のため仮想PCがPowerOFF状態になったことを確認してからリターンコードを返してくる仕様となっています。 このため、順々に複数の仮想PCをシャットダウンする作りになっているとシャットダウンにかなりの時間を要してしまいます。

 

当サイトの仮想PC(仮想サーバー)は特に相互依存している訳ではなく、順序良くシャットダウンする事を待つ必要がありませんので、”&”バックグラウンド指定で仮想PCをシャットダウンするように指定しています。 ただし、この場合はすべての仮想PCに対してシャットダウン処理を投げてループを抜けてしまいますので、次ループで実行中の仮想PCが存在していないかチェックを行っています。

最終的に実行中の仮想PCが無くなったのを確認した段階で、再度キャッシュされているNFSデータ等の同期を行い、システムをリブートするようにしています。

Trackback URL

Comment & Trackback

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">