libvirtError:XML错误:应为单播mac地址,找到多播



我正在通过ansible设置KVM自动化,我有一个VM一直给我这个错误:

libvirtError:XML错误:应为单播mac地址,找到多播"53:54:00:b4:ad:81'

我不认为这是一个容易解决的问题,因为其他几个虚拟机工作得很好。我尝试过不同的主机,甚至将使用的MAC更改为以前有效的主机和从未使用过的主机。最好我能告诉这不是一个多播mac地址,我不确定问题是什么,也不知道下一步该去哪里。如有任何建议,我们将不胜感激。

这是我用来构建虚拟机的XML-基于构建所有其他虚拟机的相同模板(除了MAC地址、名称等(

<domain type='kvm'>
<name>te01</name>
<cpu mode='host-passthrough'>
<topology sockets='1' cores='1' threads='1'/>
</cpu>
<memory unit='GiB'>8</memory>
<os>
<type arch='x86_64'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' discard='ignore' io='threads'/>
<source file='/images/te01.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<source bridge='br0'/>
<mac address='53:54:00:b4:ad:81'/>
<guest dev='ens3'/>
</interface>
<interface type='bridge'>
<source bridge='br502'/>
<guest dev='ens5'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/1'/>
<target type='isa-serial' port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/1'>
<source path='/dev/pts/1'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<graphics type='vnc' autoport='yes'>
<listen type='address' address='0.0.0.0'/>
</graphics>
</devices>
</domain>

我能说的最好的是这不是一个多播mac地址。。。

但它实际上是一个多播地址,尽管不是IPv4多播到MAC多播(01-00-5E-00-00-0001-00-5E-7F-FF-FF(、IPv6多播到MAC多播(33-33-00-00-00-0033-33-FF-FF-FF-FF(或任何预定义的IEEE多播地址(例如STP、LLDP等(的意义。

在MAC地址的最高有效字节中有两个标志。最高有效字节的最低有效位是I/G(个人/组(标志。设置此位意味着该地址被用作组的目的地址。最高有效字节的第二个最低有效位是U/L(通用/本地(标志。设置此位意味着MAC地址是本地创建的;BIA(Burned in Addresses(已清除U/L位。

设置了I/G位的任何MAC地址都是多播地址,广播MAC地址(ff-ff-ff-ff-ff-ff(有特殊情况。这意味着MAC地址的最高有效字节中的任何奇数都是多播地址。

多播地址只能是目标地址,而不能是分配给接口的地址。

您的MAC地址53:54:00:b4:ad:81既有I/G位集,也有U/L位集,这意味着它是一个多播(目的地组(地址,这意味着您的MAC地址是一个本地定义的MAC地址。

最高有效字节是0x53(01010011(,因此两个标志都已设置。

0   1   0   1   0   0   1   1
^   ^
|   |
U/L I/G

你创建的任何MAC地址,不包括你拥有的任何OUI,都应该设置U/L位,以表明你已经创建了它们,并且它们不会踩到另一家公司拥有的OUI(不幸的是,很多组成自己MAC地址的人都不这样做,但真的没有任何方法来强制执行(。接口地址必须清除I/G位,以防止它们成为多播(组目的地(地址。


人们经常问,为什么标志是最高有效字节的两个最低有效位。这是因为比特、字节和帧字段是在以太网上发送的。首先发送字节的最低有效位,首先发送帧的最高有效位,帧的第一个字段是目的地址。此外,请记住,以太网最初是在共享介质上的(就像现在的Wi-Fi一样(,所以局域网上的所有主机都看到了所有帧。在主机处接收的第一比特告诉看到帧的主机目的地址是单独地址还是组地址。

TL;罗恩·莫平博士的回答是:

为了最大限度地兼容,在创建自己的MAC地址时,第一个字节中的第二个数字必须是2、6、a或E。

当转换为二进制时,它们表示00:10、01:10、10:10和11:10。

这导致U/L位被设置为"0";"本地创建";并且I/G比特是未设置的,用信号表示它不是组地址。

最新更新