Azure上のVMRoleインスタンスをHPCノードに (1/2)
以前、高添のブログでも紹介がありましたが、イマドキはAzureのVMRoleインスタンスをWindows HPCの計算ノードとして利用することができます。
今日はこれについてベースになるVMを作るところから、VMRole計算ノードを追加するところまでの簡単な手順を説明したいと思うのですが、ちょっと長いので、「地上」でベースVMを作るまでと、「空」に打ち上げる作業で前編/後編に分けますね。この記事は前編です。
で、手順ですが
実はここに全部書いてあります。
Deploying Windows Azure VM Nodes in Windows HPC Server 2008 R2 Step-by-Step Guide
しかしながら、英語である上にずらりと文字ばかりなので、お世辞にもわかりやすいとは言えません。これを元にしながら、もう少しわかりやすく書いてみたいと思います。
大前提
ヘッドノードのHPC Packは、2008 R2 SP2が必要です。SP1ではVMRoleノードは使えません。(Worker Roleノードは使えます)
HPC Pack 2008 R2 Service Pack 2
Windows Azure SDKのインストール
後々必要になります。Hyper-Vホストにこれをインストールしておいてください。
最新版はこれ(でたばかりです) Windows Azure SDK (x64) v1.5
この記事を書くために実際に使用したのはこちら(一つ前のバージョン) Windows Azure SDK (x64) v1.4
“Windows Azure Tools for Microsoft Visual Studio"は不要で、素のSDKだけでOKです。HPCクラスターマネージャーからVMRoleのデプロイができてしまうので、Visual Studioに助けてもらう必要が無いのです。
ベースVMの作成
まずはHyper-V上で元になるVMを作ります。これは簡単なので詳しい説明は割愛しますが、注意点は二つ
まず、VHDのサイズ。Hyper-Vで新規VMを作成するときは、何も考えずにデフォルト値で作ると127GBのVHDができてしまいますが、これでは大きすぎてAzureに載せられません。次の表のサイズ制限をご確認ください。なお、VHDの種別は「容量可変」でかまいません。
Azure上でのVMサイズ | ベースVHDのサイズ上限 |
XS | 15GB |
S | 35GB |
M,L,XL | 65Gb |
※ この表の原本はこちら→How to Create the Base VHD for a VM Role in Windows Azure
あと、もう一つ注意していただきたいことがあります。
Dynamic Memoryを有効にしちゃダメ
良く訓練されたHyper-V使いは、基本的にDynamic Memoryを有効にしてしまうものですが、VMRoleのベースVMを作る時だけは、「メモリの割当量をいちいち考えていたあの頃」にちょっとだけ戻ってみてください。
Dynamic Memoryを有効にしてしまうと何がマズイかというと、、、AzureへアップロードしたVHDを元にロールインスタンスをデプロイしようとする段階で、
Could not load and validate VM image. Ensure that the image is valid and has the right Windows Azure components installed and configured
こんなメッセージのまま、さんざん待たされたあげくエラーになります。VHDのアップロードまでは普通にできてしまうので、割と悲しいのです・・・
ゲストOSのインストール
Windows Server 2008 R2 (英語版)をインストールします。
<簡単すぎるため手順は割愛>
(まめちしき) 私は、インストールが終わった「バニラ」の状態で一度VMのスナップショットを取っておきます。あとで何か失敗しても、OSの再インストールをせずに済みますので。
必要なモジュールのインストール
ゲストOSに三つのモジュールをインストールします。
VMRole統合サービス
まず、VMRole用の統合サービス。これは、Hyper-VホストにAzure SDKをインストールしてあれば、"C:\Program Files\Windows Azure SDK\SDKバージョン\iso\wavmroleic.iso”というのがあるはずです。これをVMにアタッチしてやります。
こんな感じで。
そうするとISOの内容がゲストOSのDVDドライブに見えてきますので、
この、WaIntegrationComponents-x64.msiというのをインストールしてください。
パスワードを聞かれます。
これは、あれです。VMRoleをAzure上で展開する場合には、当然Windowsのセットアップを完全自動化する必要があるわけですが、それには応答ファイルに管理者パスワードを定義する必要があります。そうしないと、「ユーザーは最初にログオンする前にパスワードを変更しなければなりません」というあの画面で止まってしまうのです。ここで設定したパスワードが、応答ファイル(unattend.xml)に書き込まれるわけです。(C:\unattend.xmlが作成されます)
なお、インストールの途中、こんな画面が二回ほど出てきます。
これは、ストレージ用の準仮想化ドライバをインストールするぞ、というお知らせです。"Install"をクリックしてください。
この画面が出てくれば、終了です。
再起動を求められますので、"Yes"をクリックしてください。Windowsが再起動します。
HPC用Azureモジュール
次に、ゲストOSにWindows HPCのノードとして稼働するために必要なモジュールを導入します。
二つあります。
まず、HPC Pack 2008 R2 for Windows Azure Virtual Machines というもので、ファイル名は"HPCAzureVM.msi
"です。
これは、ここ HPC Pack 2008 R2 Service Pack 2 からダウンロードできる "HPC2008R2SP2-Update-x64.zip" というファイルに入っています。
インストール自体は簡単で、特に悩むべき選択肢はありません。次へ次へと進んでください。
この画面が出てきたら完了です。
HPC用MPIモジュール
次に、MPIのランタイムを導入します。"mpi_x64.msi"というファイル名です。さっきのHPCAzureVM.msi
と同じフォルダにも入っていますし、次の場所から単体でもダウンロードできます。
HPC Pack 2008 R2 MS-MPI Redistributable Package with Service Pack 2
これも、特に悩むところはないので、あっさりインストールしてください。
この画面が出てきたら完了です。
ファイアウォールの設定
MPIの通信が通るように、ファイウォールに穴を開けます。これは、それ用のコマンドが用意されているので簡単です。
ゲストOSのコマンドプロンプトで、次のコマンドを実行してください。
“C:\Program Files\Microsoft HPC Pack 2008 R2\Bin\hpcfwutil” reset
以上で、ベースVMの準備はほぼ完了です。あとはsysprepするだけです。
sysprep
(まめちしき) 必須ではありませんが、私はsysprepする前にVMのスナップショットを取っておきます。sysprepはある意味「取り返しの付かない操作」なので。
次のコマンドを実行して、sysprep処理を行います。
c:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /shutdown
sysprep処理が完了すると、自動的にシャットダウンしてVMはOFFになります。
OFFになったら、必ずVMのスナップショットを取ってください。理由は次のステップでわかります。
VHDの取り出し
さて、sysprepも済んだので、あとはVHDをAzureに乗せるばかりなのですが、ここまでの手順の中で、いくつかVMのスナップショットを取得していることだと思います。こうなると、この仮想マシンを表すVHDは
親VHD+複数の差分VHDに分散している
わけです。いったいどれをAzureにアップロードすれば良いのでしょうか。我々が今アップロードしたいのは、sysrep直後の状態のはずです。何とかして、この"sysprep直後"の状態を詰め込んだ単一のVHDを得なければなりません。
そこで、以前も書いた「スナップショットをエクスポートする」機能を利用します。こんな感じで、「sysprep完了後に作成したスナップショットを右クリックして、"エクスポート"」するだけです。
VHDはどこに出力されるのでしょうか。次のように「D:\Hyper-V\HPC\ksasaki\Exported」をエクスポート先に選んだとすると、
ここです↓ ("ksasaki-HPC-VMRole-Base-S"ってのは私が作ったVMの名前)
D:\Hyper-V\HPC\ksasaki\Exported\ksasaki-HPC-VMRole-Base-S\Virtual Hard Disks
こんな感じで、
さて、これでベースVHDの準備は完璧です。あとはこれを受け入れるAzure側と、Azureへ打ち上げるためのHPC Server側の設定です。
後編へ続く
__END__