虛擬世界的MAC地址
先看一下真實世界的MAC地址是如何分配,如何保證沒有重復的。
每塊網卡都有一個MAC地址,MAC地址是一個6字節、也即48bit的數據。前3字節稱為OUI ,是由IEEE組織注冊給網絡設備生產商的;每個廠商擁有一個或多個OUI,彼此不同。后三字節則是由網絡設備生產商分配給自己生產的每一個擁有MAC地址的設備,互不重復。
在VM的世界中,每一台擁有虛擬NIC(網卡)的設備當然也擁有MAC地址。這虛擬網卡的MAC地址,當然也是按照規定,前三字節為OUI,后三字節逐一分配給每個設備。
由於虛擬網卡的”制造商“是VMware,XenSource,微軟 等虛擬平台軟件的生產商,OUI當然就分配給了他們。
VMware VM所使用的OUI
按照VMware ESX 3的[Server Configuration Guide ]的說法,VMware的使用下面的三個OUI作為VM的MAC地址:
00:0C:29 – 用於自動生成的MAC地址
00:50:56 – 用於手動設置的MAC地址
00:05:69 – 曾經用於舊版本的VM(大約是在ESX 1.5的時代),在ESX 3中已經不再使用
但是在實際應用上,我發現00:50:56這一MAC地址段並不是完全用於手動設置的MAC地址:
00:50:56:00:00:00 – 00:50:56:3F:FF:FF
這一段MAC地址可以用於手動設置的MAC地址
00:50:56:40:00:00 – 00:50:56:FF:FF:FF
這一段(我的推測,不一定准確),則是用於ESX 3上的自動生成的MAC地址(包括VM和Service Console)
MAC地址的生成
OUI有了,后三字節如何生成呢?要知道虛擬機是經常被創建和銷毀的,這一點不像實體PC。網卡生產商可以計算每年生產多少塊網卡,從而為每塊網卡分配不同的MAC地址; VMware卻不可能計算出每年有多少台VM、有多少塊虛擬網卡被創建。
VMware ESX Server的算法是,使用散列算法,通過VM的UUID來生成MAC地址。VM的UUID是每一台VM特有的、128bit的ID,是由ESX Server硬件SMBIOS的UUID、加上VM的路徑生成的。因此,一台虛擬機的虛擬網卡的MAC地址就與下面四個因素有關:
VMware的OUI
Host (ESX Server)的SMBIOS中的UUID
VM在服務器上的路徑
網卡的實體名 (Entity Name),用來確保同一VM上的不同網卡有不同的MAC地址
MAC地址沖突的檢測與解決
MAC地址一旦生成,就不會再有變化,除非上面所述的四項因素發生改變(最可能發生的就是第三項,VM在服務器上的路徑改變)。
盡管如此,由於散列算法本身的特征,還是有萬一發生MAC地址沖突的可能(可能性極小,和年末ジャンボ中頭彩的幾率差不多)。ESX Server會不斷跟蹤和檢測運行中和掛起(Suspend)的VM,以保證沒有MAC地址沖突。但是已經關閉電源的VM是不在檢查對象之內的。
因此,萬一一台VM啟動時ESX檢測到MAC地址沖突,它會分配給VM的虛擬網卡一個新的MAC地址。所以從這個意義上說,VM的MAC地址是可能發生變化的——只是這個概率實在太小。
手動指定MAC地址
手動指定MAC地址僅用於一些極其特殊的情況,通常是進行P2V的時候。例如,某物理服務器上的軟件,其License已經與該服務器的MAC地址 綁定,如果MAC地址改變則軟件無法運行;再如,某些底層網絡軟件以MAC地址來鑒別機器時,為了不做更改能夠繼續使用,在P2V的時候也要手動指定 MAC地址。
打開一個VM的.vmx文件,可以看到如下設置:(如果有多塊NIC的話,那么就會有ethernet0、ethernet1、ethernet2……)
ethernet0.addressType = “generated”
ethernet0.generatedAddress = “00:0c:29:9b:fb:18”
這說明該NIC是自動生成的MAC地址。只需如下更改即可變為手動分配的MAC地址:
ethernet0.addressType = “static”
ethernet0.address = “00:50:56:00:00:01”
其中的00:50:56:00:00:01就是手動指定的MAC地址。