VirtualServer2005用ツールの自作 その4

使い方としては、
 ・Windowsの「タスク」で週末夜間にsaveを実行→shutdownコマンドで再起動
 ・タスクに「システム起動時」のジョブを作成し、そこでresumeを実行
ということを考えていたので、Hyper-Vの中に作ったVirtualServer2005環境で実テスト。
saveはちゃんとできて、shutdownコマンドも実行されてOS再起動。
ログインして管理用Webサイトを確認すると.....「保存済み」のまま??

タスクの実行結果を確認すると、「前回の結果」がエラー(0x0ではない)になっています。

Photo_3

エラー出力をテキストファイルにリダイレクトするようにしていたので、テキストファイルを確認すると、アクセス拒否エラー??

Resume

手動ではresumeもちゃんと動作したし、タスク実行ユーザもログインユーザを指定しているのに....?
またもや小一時間悩み、出た結論は「Virtual Serverサービスが起動されてないから」。

Windowsのサービス起動は基本的に「無秩序」に起動です。
UNIX/Linuxのように「シェルに記述した順番で起動」というものではありません。
サービスの依存関係で前提サービスを指定することは可能ですが、すべてのサービスに対して秩序は求めていません。
(平行で実行されるので、起動時間の短縮にはなるのですが)

ちなみに、Virtual ServerサービスとTask Schedulerサービスの依存関係は
Vs

Task

となっています。
「Remote Procedure Call(RPC)」サービスが起動した後にVirtual ServerサービスとTask Schedulerが起動されますが、Virtual Serverサービスが起動される前にTask Schedulerサービスが起動されてしまうためにエラーになっているようです。

ちょっと長いので分割。

VirtualServer2005用ツールの自作 その5

Virtual Serverが起動されていないせいでエラーになるのであれば、起動するまで待てばよいと。

サービス操作関連は「System.ServiceProcess」名前空間にあるクラスを使えば簡単に操作できます。
サービスが、とある状態になるまで待機するメソッドとして「System.ServiceProcess.ServiceController.WaitForStatus()」があるので、これを使います。
            Dim sc As New System.ServiceProcess.ServiceController("Virtual Server")

            Console.WriteLine("VirtualServer起動待ち")
            sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running)
            Console.WriteLine("VirtualServer起動確認完了")
        End Sub
これで、Virtual Serverが起動してから操作が行えるようになりました。

思ったより結構手間がかかりましたが、これで運用できそうです。

とっととHyper-Vにしたい!!

VirtualServer2005用ツールの自作 その6

補足情報です。

○ツールでのVirtualMachine状態確認について
 少しだけ状態確認(「実行中でないと保存させない」とか)を行っていますが、正確なチェック内容ではありません。
 VirtualServerの正確な状態遷移図(State Diagram)は
英語のMSDN(Virtual Machine State Diagram)にあります。
 ちなみに、Hyper-Vについても
資料(Msvm_ComputerSystem Class)
は存在するのですが、V1.0とV2.0で仕様が異なるようです。

○再起動用バッチファイルについて
 ソースを収納したZIPファイルに、再起動用のバッチファイルを含めています。
 (tempフォルダ内の「再起動時.bat」/「再起動後.bat」)

VirtualServer2005用ツールの自作 その1

会社でまだVirtualServer2005がまだ稼働してるのですが、いつ誰が使ってるかわからないので24時間稼働しっぱなしです。

そんな使い方をしていると、たまにホストOSにアクセスできない状態が発生するんです。
早い段階で見つかれば「IIS Admin Service」(と関連サービス)を再起動すれば回復するのですが、大体は「時すでに遅し」で強制再起動です。
(ログインすら数十分かかるので、ハード的な再起動です)

当然、ゲストOSの稼働状態は吹っ飛び、利用者からは「なんで~」って感じになるので、定期的にリブートしたいとは思うのですが、イチイチゲストOSを保存するのが面倒。
(Hyper-Vならシャットダウン時にゲストOSを自動保存できるのでいいですね。)

ネットを探すと、スクリプトでゲストOSの保存とかは転がってるんですけど、どのゲストOSが実行中だったかをスクリプトで保存するのがちょっと億劫になったので、VB.NETでツールを作成してみることに。

途中でいろいろ引っかかったところを以降で保存。

作ったツールはここに置いてますので、ご自由にどうぞ。
※使用は自由ですが、保証はしませんしサポートもしません。「自己責任」にてお願いします。

使用方法ですが、
 RebootVirtualServer.exe [動作] [稼働中のVirtualMachine名を格納するファイル名]
  ・[動作]
   "save"と"resume"しかありません。
    save:稼働中のVirtualMachine名をファイルに出力し、「保存」状態に変更します。
    resume:ファイルに保存されたVirtualMachine名を取得し、「実行中」状態に変更します。
  ・[稼働中のVirtualMachine名を格納するファイル名]
   稼働中のVirtualMachine名の保存に使用するファイル名を指定します。
となります。

VirtualServer2005用ツールの自作 その2

まずは、VB.NETから操作する方式とその設定について。

WMIで操作するのが楽なんですが、稼働中のゲストOSしか列挙できない様子。
今回の対応だけであればいいのですが、機能追加を考えると稼働していないゲストOSも操作可能にしたいので却下。

となるとCOM経由でのアクセスになります。
スクリプトでも「CreateObject」を使って操作している例が多数あります。
ですが、VB.NETから「CreateObject」はしたくないので、「参照の追加」でCOM参照をしておきたいなと。
Photo
でも、何を追加すればいいの??

小一時間探してなんとか資料を発見。
VirtualServer2005インストールフォルダ(デフォルトは「C:\Program Files\Microsoft Virtual Server」)の下に「Documentation」フォルダがあり、その中の「Microsoft.VirtualServer.Interop.dll」を参照追加します。
(同じフォルダにある「Microsoft.VMRCClientControl.Interop.dll」は、VMRCクライアントの機能を使用するためのDLLです)

あとは「Microsoft.VirtualServer.Interop」をImportすれば簡単にソース記述できるようになります。
(Intellisenseもちゃんと出てきます)

Imports

これでメデタシメデタシと思ってたのですが...。

あ~疲れた

ブログ引っ越し作業が完了しました。

Windows Liveからはまとめて移せる手段がないようだったので、1個1個丹精込めてコピペしました。┐( ̄ヘ ̄)┌ フゥゥ~