Home > Windows にまつわる e.t.c.

Hyper-V VM の MAC Address 重複対策


Hyper-V VM に割り当てられる MAC アドレスは、Hyper-V がインストールされた時の IPv4 アドレスを使って構成されます。

複数 NIC を持っていているとかで、複数の IPv4 アドレスを持っている場合はいる場合は、そのうち1つが選択されます。

 

Hyper-V VM MAC Address 体系

オクテット位置 意味
1-3 MS のベンダーコード
00-15-5d 固定
4 Hyper-V ホスト IPv4 アドレスの第3オクテット
5 Hyper-V ホスト IPv4 アドレスの第4オクテット
6 連番

 

例えば、172.16.58.52 の IPv4 アドレスを持っている環境に Hyper-V をインストールすると、00-15-5d-3a-34-00 体系の MAC Address が VM に割り当てられます。
(58 = 0x3a、52 = 0x34)

 

この値を管理しているのが、仮想スイッチ設定の「MAC アドレス範囲」です。

 

Hyper-V ホスト1台で運用している場合は問題無いのですが、複数台の Hyper-V ホストを運用している場合には VM の MAC アドレスが重複する事があります。

Hyper-V をインストールした時に、ユニークな IPv4 アドレスがセットされていれば、VM の MAC アドレス重複は発生しませんが、Hyper-V をインストールした時に、何らかの理由で重複する IPv4 アドレスを持っていると、VM の MAC アドレス重複が発生します。

IPv4 アドレスが重複するケースとして考えられるのは、以下のような場合です。

・ Hyper-V ホスト構築用のセグメントが DHCP になっていて、Hyper-V をインストール後に固定 IP を設定する
→ 過去構築時と同じ IP アドレスがリースされる(これが原因のトラブルやりました orz)

・ 構築時に IP アドレスを設定していない NIC が複数あり、IPv4 のリンクローカルアドレス(169.254.0.0/16)が構成されている
  (リンクローカルは対策されていると思いますが、この仕様に触れているドキュメントが見当たらないので実装不明です)

 

ユニークな IPv4 アドレスを割り当てた後に Hyper-V をインストールすれば VM の MAC アドレス重複は防げるのですが、そうもいかない場合はユニークな IPv4 アドレスを割り当てた後に、MAC アドレス範囲を再設定します。

GUI で設定するのが面倒な場合は、レジストリ更新します。

レジストリ:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization

キー:

名前 タイプ 意味
MinimumMacAddress Binary 最小値
MaximumMacAddress Binary 最大値

 

PowerShell で設定するのであれば、以下のスクリプトで設定できます。

# IPv4 アドレス取ってくる
[array]$IPv4Adresses = Get-NetIPAddress -ErrorAction SilentlyContinue | ? AddressFamily -eq "IPv4"

# IPv4 Linklocal(169.254.0.0/16) と Loopback 以外の IPv4 アドレスをチョイス
foreach ( $IPv4Adress in $IPv4Adresses ){
    if( ($IPv4Adress.IPAddress -notmatch "^169\.254") -and ($IPv4Adress.IPAddress -notmatch "^127") ){
        $UniqueIPv4Adress = $IPv4Adress.IPAddress
    }
}

# オクテット分解する
$Octets = $UniqueIPv4Adress.Split(".")

# MAC Address 設定用の byte 配列作る
$MACAddress = @()
$MACAddress += [byte]0x00
$MACAddress += [byte]0x15
$MACAddress += [byte]0x5d
$MACAddress += [byte]$Octets[2]
$MACAddress += [byte]$Octets[3]
$MACAddress += [byte]0x00

# MAC Address の最小値
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization"
$RegKey = "MinimumMacAddress"
Set-ItemProperty -Path $RegPath -Name $RegKey -Value $MACAddress

# MAC Address の最大値
$MACAddress[5] = [byte]0xff
$RegKey = "MaximumMacAddress"
Set-ItemProperty -Path $RegPath -Name $RegKey -Value $MACAddress

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.