VMware ESXi 5.5 クローン時の注意点 ~VMkernelのMacアドレス重複~
Pocket

VMware ESXiをクローン(HDDをLinuxのライブCDでマウントして他のHDDにコピーしたり)やHDDの載せ替えしてシステムボードから変わってしまうと、ESXiが旧NICのMACアドレスを保有しているために問題が発生することは有名なので、結構知っている人も多いかと思う。

↑普通にクローンすると、こんなんが起きる。

Sponsored Links

で、それらの問題を解消するためには、以下のコマンドを実行するかvSphere Clientで対象となるESXiホストのインベントリ⇛「構成」タブ⇛ソフトウェアの「詳細設定」⇛で、左メニューからNetを選んで「FollowHardwareMac」のフラグを立ててあげる必要がある。

esxcfg-advcfg -s 1 /Net/FollowHardwareMac
これで、ESXiホストの再起動時に物理NICとVMkernel用に設定されるMacアドレスで相違がある場合、物理NICのMacアドレスに自動的に書き換えられる様になる。

このあたりについては、以下のリンクが詳しいかもしれない。

VMware ESXi 5.0が使用するMACアドレスがNICのMACアドレスと異なる

http://d.hatena.ne.jp/EijiYoshida/20120519/1337405747

ESXi5 MAC ADDRESSが更新されない件

http://rukmavimana.wordpress.com/2012/06/03/esxi5-mac-address%E3%81%8C%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E4%BB%B6/

一応、公式フォーラムにも掲載されている。

vmk0 management network MAC address is not updated when NIC card is replaced or vmkernel has duplicate MAC address (1031111)

http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1031111

で、上記設定だがNICが1個、もしくはvSwitchに接続するVMkernel接続が1個である場合ならば問題は無い。

問題となるのはVMkernel接続が複数ある場合。

なんとvmk0、要は最若番のvSwitchに接続されたVMkernel接続以外のmacアドレスは更新してくれないようなのだ。

マジかよ…

そもそも、これがどういう問題を引き起こすのか。

上記で問題が発生するのは、クローン元とクローン先もしくはクローン先同士が同じネットワークに所属する場合。

ようは、同一ネットワーク内に同じMacアドレスが重複する事になってしまうのだ。

『別にMacアドレスが重複したところで、大したこと無いんじゃないの?IPアドレスが重複するとまずいと思うけど』と考える人もいるかも知れない。

そこで、以下がMacアドレスが重複した時のネットワークの動き

ネットワーク機器については別のところで調べてほしいけど、ようはあいつらの中ではMacアドレスとIPアドレスを紐付けてどのポートにデータを送信するか決めている。

で、ARP(データを一気に送信して同一ネットワークの機械がどこにいるのかを確かめる処理。大体ネットワークに接続可能な機械は全部やってくる)が行われる度にmacアドレスとIPアドレスの対応が書き換わる。

ようは「同一ネットワーク内でmacアドレスが重複している機器は、一つを除き疎通出来なくなる。

↑の図でいうと、ESXiクローン1と接続中はESXiオリジナルとESXiクローン2は全く疎通出来ないと…

問題大有りだよ!
VMware社さん、ちゃんと仕事してくださいよ!!(泣)

適当に解答して穴埋めしといた小学生の宿題のような片手落ち感ではないですか…(実行経験あり)

で、そもそもどうして物理NICと実際の通信で使用されるMacアドレスが変わってしまうかというと、VMkernelのmacアドレスというのがESXiの「/etc/vmware/esx.conf」という設定ファイルに記述されている事が要因。
で、ここを書き換える事でこの問題は解消出来るのだがあまりおすすめしない。

というのが、設定ファイルを手動で書き換えるということがどのような影響を与えるか分からない、失敗したらそもそも起動しなくなる可能性もあるからだ。

というわけでコマンド、というかシェルスクリプトで対応する事とする。
なお、このシェルスクリプトはVMware ESXi 5.5以降でしか使えないと思われる。

というのが、ESXi 5.5以降で「esxcfg-vmknic」コマンドにMacアドレスの指定オプション(ただしポートグループ作成時に限る)が追加されており、それを実行しているからだ。

(試しに手元のESXi 5.0を確認したが、該当のオプションはついていなかった)

●MacAddChange.sh

#!/bin/sh
#Input Nic Name
Nic1="vmnic0"
#Input VMkernel Port Group Name
PortGroup1="Management Network"
 
PortGWord1=`echo $PortGroup1 | wc -w`
PortGSpace1=$((PortGWord1 - 1))
echo $PortGSpace1
 
MacAddr1=`esxcfg-nics -l | grep $Nic1 | awk '{print $7}'`
echo $MacAddr1
 
vmknic1=`esxcfg-vmknic -l | grep "$PortGroup1"`
echo $vmknic1
 
IPAddr1=`echo $vmknic1 | awk '{print $'$((4+PortGSpace1))'}'`
echo $IPAddr1
NetMask1=`echo $vmknic1 | awk '{print $'$((5+PortGSpace1))'}'`
echo $NetMask1
MTU1=`echo $vmknic1 | awk '{print $'$((8+PortGSpace1))'}'`
echo $MTU1
 
esxcfg-vmknic -d $PortGroup1
esxcfg-vmknic -a -i IPAddr1 -n $NetMask1 -M MacAddr1 -m $MTU1  $PortGroup1

まぁ、使い方は見ればわかると思うんだけど、Nic1に物理Nic名を、PortGroup1に対象のVMkernel名を入れてもらえれば…

それぞれの対応に関しては「esxcfg-nics -l」「esxcfg-vmknic -l」コマンドからわかると思う。

…5.5ではこれで対処出来るんだけど、過去のバージョンに関してはどう対応すればいいんだろう?やっぱりesx.confを書き換えるしか無いのかな?

~補足~
当たり前なんだけども、このスクリプトはNIC一個、一回分だけを記述している。
なので、複数のNICを対象とするのであればNICの数だけ同様の記述を後ろに入れるか、何回も変数を変えて実行してもらう必要がある。

そんなに親切な作りになってなかったので、一応補足でした。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。