Hyper-V」タグアーカイブ

Hyper-V2.0 Server 展開におけるMACアドレスの挙動について

以前、

Hyper-V 2.0 新機能~ネットワーク編その2

で解説を入れたのですが、Hyper-V1.0の仮想端末で使用されるMACアドレスの範囲はどこに記載されているか?というとレジストリになりますが、Hyper-V2.0では仮想ネットワークマネージャーから操作できるようになりました。

ではそもそもなぜこのような機能が増えたのかと考えると、これはHyper-Vサーバーを展開する際にSysperpを使用します。しかし、仮想端末で使用されるMACアドレスの範囲はレジストリに書かれていてSysprepでは変化しません。そこでこのまま展開すると、Hyper-V上の仮想端末のMACアドレスがバッティングする可能性があったので、MACアドレスの範囲を簡単に変更できた方がいいからだと思います。

HKLMSoftwareMicrosoftWindows NTCurrentVersionVirtualization

MinimumMacAddress
MaximumMacAddress

指定例:
MinimumMacAddress = 00-15-5d-ec-34-00
MaximumMacAddress = 00-15-5d-ec-34-FF

*上位MACアドレスの00-15-5dはマイクロソフトが保有しているアドレスになるので固定にする必要があります。

さて、最近気づいたことがあります。それはちょっとHyper-V1.0のときと挙動が異なることがあったので調べてみました。

Hyper-V 2.0 でSysperpをかけます

  • 仮想端末が存在していて外部接続のNWが接続されている→MACアドレスの範囲は変化しない
  • 仮想端末が存在していて内部接続のNWが接続されている→MACアドレスの範囲が変化していた

これはHyper-V1.0ではありえない動作なので本腰を入れて調査してみました。

そもそも、このMACアドレスの範囲は、Hyper-Vが起動して外部ネットワークが作成される段階で作成されます。生成アルゴリズムはどうなっているかというと、その時点のホストのIPアドレスが

192.168.10.200

だとしたら、第3、4オクテットが使われるのでこれらの値を16進数に変換すると0A、C8になります。上位MACアドレスは決まっているので結果的に

00-15-5d-0a-c8-00から00-15-5d-0a-c8-ffの範囲になります。

ここでHyper-V 2.0ではどのような挙動になるか確認です

Sysprep後に起動します。すでに記載したように

  • 仮想端末が存在していて外部接続のNWが接続されている→MACアドレスの範囲は変化しない

これはHyper-V 1.0 と同様です

しかし

  • 仮想端末が存在していて内部接続のNWが接続されている→MACアドレスの範囲が変化していた

なぜこのようになるのか?

実はHyper-V 2.0ではSysprepをかけると

HKLMSoftwareMicrosoftWindows NTCurrentVersionVirtualization

MinimumMacAddress
MaximumMacAddress

これらのレジストリも変化します。ではどの段階で新しい値が付与されるかというと、仮想ネットワークマネージャーを起動した時点で付与されるようです。

しかし、この動作の条件としては外部ネットワークが使用されていないが当てはまります

ただし、外部ネットワークが使用されていなくても同一の固定IPがすべてのHyper-V 2.0サーバーに設定されていて、そのままのアドレスで仮想ネットワークマネージャーを起動すると結果的にすべてのHyper-V 2.0サーバーのMACアドレスの範囲は同じになります。

このような挙動の変化が確認できました。

よって、Hyper-V2.0においてSYSPREPを使用した展開を行う場合は、外部ネットワークを使用しない状態での展開を行い、すべてのサーバーは異なるIPアドレスにしたのちに(DHCPクライアントにしておいてもいいですね)仮想ネットワークマネージャーを起動するとMACアドレスの範囲の重複は起こらないということになります。

まとめ

Hyper-V1.0の場合は、SYSPREPをかけてもMACアドレスの範囲は変化しない
Hyper-V2.0の場合は、SYSPREPをかけるとある条件下ではMACアドレスの範囲は変化する(条件:外部ネットワークを使用していない)

コアパーキングに関して

さて、Windows Server 2008 R2 では新機能としてコアパーキングをサポートしました。

このコアパーキングですが、複数コアのあるCPUに対して全てのコアをフル回転して使用させるのではなく、そのプロセスが動くのに十分なコアを確保する機能になります。結果として少数のコアを使用することになり消費電力を抑える機能になります。

この機能は0.1秒単位で働き、可能な限りCPUの保留状態を作っていきます。

コアパーキング編集済み

リソースモニターで確認すると一瞬ですが保留状態が確認できました。

さて、この機能の制御はできるのか?

マイクロソフトに問い合わせしたところ、この機能はユーザーによる制御などはできないそうです。また制御を行うためのツールなども今のところ存在しません。レジストリをいじればコアパーキングの機能をやめることなど出来そうな気がするのですがそのような情報もありませんでした。

Hyper-v 2.0 もコアパーキングをサポートします。当然ながら設定作業などは一切必要ありません。

まあ、パフォーマンスは変わらず消費電力を抑えてくれるので気にする必要はないということでしょうかね~

Hyper-V2.0におけるNLB設計

NLBを構築する際には注意しなくてはいけないことがあります。それはHyper-Vで構築しようが、物理サーバーで構築しようが同じです。

今回は結論から書きますが、Hyper-VでNLBを設定するサーバーに対してはVLANを使用して専用セグメントを作ることがベストだと考えます。NBLの条件としてはユニキャストモードで構築するとします。

さて、ここでなぜVLANを使用するのか?

ここで考えなくてはいけないのが、NLB(ユニキャストモード)における動作になります。

NLBの動作

NLBを構築すると、NLBに参加しているホストのMACアドレスはNLBのMACアドレスに置き換わります。ここで問題なのはスイッチとの関係になります。スイッチはポートごとにMACを登録しますが、この状態だと複数のポートに同じMACアドレスがあることになります。となると、スイッチではMACアドレスが適切に登録されないという事態が発生するのです。そこで、NLBに参加しているホストはフェイクのMACアドレスを送信するようになります。

この図で解説すると、本来のMACアドレス02-bf-a-a-a-aが02-01-a-a-a-aとして送信されることになります。ただし、ARPデータは本来のMACアドレスである02-bf-a-a-a-aをさすんです。よって、クライアント側ではIPとMACアドレスの対応は正常に行われることになります。

ではクライアントからNLBにアクセスする際の動作としては、NLBのMACアドレスはスイッチに登録されていないので、全てのポートにフラッディングされることになります。そうすると、NLBに参加している全てのサーバーにデータは届きます。

ここでNLBのアルゴリズムである、統計的完全分散フィルタリングアルゴリズムによって適切なサーバーでデータが処理されることになります。

ここで問題です

NLBに参加していないPCやServerたちにも、NLB宛てのデータが届いてしまうのです!しかし、自分宛のパケットではないのでドロップ処理を行い受け付けません。要するに同じセグメントに参加しているコンピュータには不要なパケットがバンバン届くんですね。

よって、NLBを構築する際には専用セグメントを作成して、その中だけでNLBパケットを完結させる必要があるんです。

そのためには、Hyper-V環境ではVLANを使用するのが最も効率が良い方法だと考えるからになります。

Hyper-V 2.0 新機能~ネットワーク負荷分散(NLB)設定

TechED2009ではHyper-V2.0においての設計についての話が結構ありました。そこで検証作業を行いました。

Hyper-V2.0でも1.0と同様の設定が必要になると思っていましたが違う点がありましたので注意する必要があります。

それは、Hyper-V1.0のときはNLBを設定する際にはゲストOSのネットワークのMACアドレスを静的にし、NLBを構成した際に配布されるMACアドレスに書き換える必要がありました。

参考:

http://support.microsoft.com/kb/953828/ja

そこで、Hyper-V2.0でも同じことをしなくてはいけないと思いいざ構成してみると・・・・

WS000013

ここでNLBのMACアドレスをメモ・・・「02-bf-ac-10-0a-96」

WS000014

あらかじめゲストOSのネットワークアダプタには「MACアドレスのスプーフィングを有効にする」にチェックを入れておきます

WS000016

あれれ、静的MACアドレスにしなくても収束してしまった

WS000015

確認のためにゲストOSのMACアドレスを調べると・・・NLBのMACアドレスになっている!!

まとめ

  • Hyper-V1.0では静的MACにして、NLBのMACアドレスに書き換える必要がある
  • Hyper-V2.0では「MACアドレスのスプーフィングを有効にする」にチェックを入れておく

ということになりますね。いや~、知らなかった(汗)

Hyper-V 2.0 新機能~仮想マシンのインポート

細かい点なんですが、Hyper-V1.0のときはエクスポートした仮想マシンをインポートする際には、必ず目的の場所にコピーをしてからインポートしていました。その理由は1回インポートした仮想マシンは再度インポートできないのでその対策がひとつ。

もう一つは、エクスポートする際には外付けHDDなどに行う場合が多いです。その外付けHDDを別のHyper-Vがインストールされている物理マシンに接続し、インポート作業を行うことになります。もしこのままインポートを行ってしまうと、その外付けHDDが仮想化マシンの保存場所になってしまいます。これは困りますよね~

そんなことから、インポートする際にはエクスポートしたデータを目的の場所にコピーしてからインポートを行うということをしていました。

ではHyper-V2.0ではどうなったか?

インポート

すべてのファイルを複製し、同じ仮想化マシンを再度インポートできるようにする」というオプションが付加されたんです。これで、今まで行っていたコピーする作業は自動的に行われることになります。

ここで注意が必要なのは、「仮想マシンをコピーする」チェックですが、この操作を行うと仮想マシンIDが新たに作られるだけで、インポートするゲストOSには変化がありません。ということはSIDの問題などがあるということになります。

また、インポートした仮想マシンの仮想ネットワークに外部接続ネットワークがつけられていた場合は、再設定が必要になるということでしょうか。

Hyper-V 2.0 新機能~ネットワーク編その4

そのほかのネットワーク新機能としては

  • ジャンボフレームのサポート
  • TCPオフロードのサポート

があげられます。

ジャンボフレームやTCPオフロードはホストでは使用できましたが、Hyper-V2.0(Windows Server 2008 R2)より、ゲストOSでサポートされるようになりました。

WS000005

これがHyper-V1.0のゲストOS上のネットワークプロパティの詳細設定です。 (Jumbo Packetの項目はありませんね)

WS000010

これがHyper-V2.0のゲストOS上のネットワークプロパティの詳細設定です。

これらの画面を見れば一目瞭然ですね。

ジャンボパケットはデフォルトでは無効ですので必要ならここの値を変更する必要があります。ただし、通信経路すべての機器がジャンボフレームに対応していないと使えませんので注意が必要です。

ジャンボパケットとは通常イーサネットでは最大1518バイトで通信を行いますが、それよりも大きなパケット通信を行うことを言います。通常1G以上の通信で使用します。10、100Mでの通信でジャンボパケットを使用すると逆にパフォーマンスが劣化したり、リンクが失われる場合がありますので注意が必要です。

TCPオフロードはデフォルトでペアレントOSおよび仮想端末側でオートになっています。

確認方法としてはそれぞれのコマンドプロンプトより

netsh int tcp sh global

TCPオフロードとはネットワーク通信における計算処理をCPUが行っていますが、それをNICに行わせることによってコンピュータまたはサーバー上のネットワークデータの処理を向上させるのに役立ちます。

今まではたとえホストOSでTCPオフロードを使用していても、仮想マシンのネットワーク処理はホストOSのCPUが担当していました。この処理を有効にすることにより10%程度の処理速度の向上が見込まれるようです。

Hyper-V 2.0 新機能~ネットワーク編その3

Hyper-Vにおける推奨のネットワーク構成としては、管理用ネットワークと仮想マシン用ネットワークを分けて構築しましょうということでした。

ではHyper-V1.0において具体的にどのように行うの?

  1. 物理NICを2枚用意する
  2. NIC1を管理用、NIC2を仮想マシン用とする
  3. Hyper-Vマネージャより仮想ネットワークマネージャを開き、NIC2に外部のネットワークを作成する
  4. ホストOSのネットワーク接続からNIC2にバインドされている仮想NICを無効化する

ポイントは4番の仮想NICを無効化するになります。これを行わないとNIC2で管理が行えてしまうからです。

ではHyper-V2.0では?

管理共有

Hyper-V2.0では、外部ネットワーク作成において新しいオプションが増えています。「管理オペレーティングシステムにこのネットワークアダプタの共有を許可する」です。

ということで実際には

  1. 物理NICを2枚用意する
  2. NIC1を管理用、NIC2を仮想マシン用とする
  3. Hyper-Vマネージャより仮想ネットワークマネージャを開き、NIC2に外部のネットワークを作成する
  4. 管理オペレーティングシステムにこのネットワークアダプタの共有を許可する」のチェックがないことを確認する

実は、Hyper-V2.0では「管理オペレーティングシステムにこのネットワークアダプタの共有を許可する」にチェックを入れないとホストOSのネットワーク接続に仮想NICは現れなくなりました。これは、いい変更ですね。

以上のように、より簡単に管理用と仮想マシン用のネットワークの分離ができるようになりました。

Hyper-V 2.0 新機能~ネットワーク編その2

厳密に言うと新機能ではないのですが、新たにインターフェイスが用意されたものがあります。それが、[MACアドレスの範囲]になります。

MACアドレスの範囲

Hyper-Vの仮想マシンのMACアドレスは動的に設定することができます。

実は、Hyper-Vの役割がインストールされた際にMACアドレスプールがレジストリに設定されます。

HKLMSoftwareMicrosoftWindows NTCurrentVersionVirtualization

MinimumMacAddress
MaximumMacAddress

指定例:
MinimumMacAddress = 00-15-5d-ec-34-00
MaximumMacAddress = 00-15-5d-ec-34-FF

*上位MACアドレスの00-15-5dはマイクロソフトが保有しているアドレスになるので固定にする必要があります。

がアドレス範囲として設定されることになります。

参考:Dealing with MAC address pool duplication in Hyper-V

さて、この設定が問題になることとしてはHyper-Vの役割をインストール済みの状態で、マスターとして設定したのちに複数台の物理マシンに展開したとします。仮にSysprepを実行してもこのアドレス範囲は変わりません。

ということは、複数のHyper-Vマシン上で仮想マシンを作成すると仮想マシン間でMACアドレスのバッティングが発生する可能性があります。

Hyper-V1.0の時にはこのレジストリ情報を変更することによって回避していました。すでにゲストを構築済みの場合は、一度ネットワークアダプタを削除し、再度作成する必要があります。

Hyper-V2.0では、インターフェイスからMACアドレス範囲を変更できるようになったんですね。

Hyper-V 2.0 新機能~ネットワーク編その1

ネットワークの設定において「MACアドレスのスプーフィングを有効にする」という機能が追加されました。

ネットワークアダプタ1.0

これがHyper-V1.0のネットワークアダプタの画面になります

ネットワークアダプタ2.0

これがHyper-V2.0のネットワークアダプタの画面になります

さて、これって何?

仮想ネットワークマネージャからネットワークを作成すると仮想スイッチが作られます

仮想スイッチ

この仮想スイッチは通常のスイッチと同様にMACアドレスの学習をします。しかし、ここで問題になるのはそもそも仮想マシンは物理MACを持っていません。ということはMACアドレスは常に仮想MACということになります。これは便利な半面、使い方によってはセキュリティ上の問題が発生する可能性があります。

仮想マシンで異なる複数のMACアドレスがあった場合は再学習されてしまいます。これはこれで正しい動作なのですが、Hyper-V2.0ではこのような動作を禁止させる仕様になりました。

参考:New in Hyper-V Windows Server 2008 R2 Part 2 – MAC Spoofing

チェックなし(セキュアモード)とした場合は次のようになります

  1. 仮想ネットワークに設定されたMACアドレスのみが自分が送るパケットの唯一の送信元MACアドレスになる
  2. 仮想マシンは宛先MACアドレスが登録されたMACアドレスのユニキャストのみを受信します。そのMACを宛先とするパケットは他のポートにフラッディングされることはない
  3. 仮想スイッチは学習するのでルーティングテーブルを含む様々な内部構造をメンテナンスします。仮想マシンを起動し仮想ネットワークが起動したらルーティングテーブルに自分のMACアドレスを登録し、他のポートに移動しないようにする
  4. トラフィックがスイッチによってフラッディングされる必要がある場合、セキュアモードになっているそのポートに対しては行われない
  5. 仮想マシン内のMACアドレスは上書きはされない

チェックを入れた場合(セキュアレスモード)は

  1. 仮想マシンはすべてのMACアドレスのトラフィックを送受信する
  2. 仮想マシンはフラッディングされたユニキャストパケットを受信する
  3. ポートに対して複数のMACアドレスを学習させることができる。またルーティングテーブルはスイッチポートを通過した時点で学習される
  4. 仮想マシンはMACアドレスを上書きできる

NLBを構築する際には(ユニキャスト構成)各ネットワークのMACアドレスをNLBで設定した仮想MACアドレスに変更しなくてはなりませんその場合は、この「MACアドレスのスプーフィングを有効にする」にチェックを入れたセキュアレスモードにする必要があります

2009/09/15追記

NLB構成の際には、静的MACにしてNLBのMACアドレスに変更する必要はないようです。検証の結果、自動的に適用されました。

Hyper-Vのエクスポート・インポートに関して

■エクスポート・インポート機能

仮想マシンの構成情報、スナップショットの情報を含めて仮想マシンを移動する機能

仮想マシン毎に保持する関連ファイルを一括処理
・構成ファイル(.xml)
・仮想ディスク(.vhd)
・状態データ(.bin、.vsv)
・スナップショット(.avhd)

エクスポート

構成ファイルのみのエクスポートが可能

インポート

インポート時にIDの再使用可能
ただし、同一ホストに同じGUIDの仮想マシンがすでに存在する場合は、インポートエラーとなる

■エクスポート・インポート利用上の留意事項

パススルーディスクはエクスポート・インポートできない

より確実に仮想マシンの移動を行うには、全てのスナップショットを削除し、仮想マシンを停止した状態でエクスポートを行うことを推奨

仮想ネットワーク構成の設定
・<外部ネットワーク>の構成情報は、インポート時に初期化される。インポート後に、再設定する必要がある
・<内部ネットワーク>または<プライベートネットワーク>の構成情報は、同名の仮想ネットワークがある場合のみネットワーク情報も復元される

オフラインバックアップの手段として、エクスポートを使用する際は外部ネットワークの構成をインポート後に再構成する必要があることに注意する必要がある。