虚拟机的MAC地址分配与修改



虚拟世界的MAC地址
html

先看一下真实世界的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、有多少块虚拟网卡被建立。ide

VMware ESX Server的算法是,使用散列算法,经过VM的UUID来生成MAC地址。VM的UUID是每一台VM特有的、128bit的ID,是由ESX Server硬件SMBIOS的UUID、加上VM的路径生成的。所以,一台虚拟机的虚拟网卡的MAC地址就与下面四个因素有关:ui

  • 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地址是可能发生变化的——只是这个几率实在过小。spa

 

手动指定MAC地址

手 动指定MAC地址仅用于一些极其特殊的状况,一般是进行P2V的时候。例如,某物理服务器上的软件,其License已经与该服务器的MAC地址 绑定,若是MAC地址改变则软件没法运行;再如,某些底层网络软件以MAC地址来鉴别机器时,为了避免作更改可以继续使用,在P2V的时候也要手动指定 MAC地址。
打开一个VM的.vmx文件,能够看到以下设置:(若是有多块NIC的话,那么就会有ethernet0、ethernet一、ethernet2……)htm

 

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地址。blog



[原文连接] http://zhuz5750.blog.51cto.com/184091/623532

相关文章
相关标签/搜索