libvirtError: XML error: expected unicast mac address, found multicast

libvirtError: XML error: expected unicast mac address, found multicast

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

libvirtError: XML 错误:需要单播 mac 地址,发现多播 '53:54:00:b4:ad:81'

我认为这不是一个可靠的问题,因为其他几个虚拟机工作得很好。我已经尝试过不同的主机,甚至将 MAC 更改为以前使用过的主机以及从未使用过的主机。我只能说这不是多播 mac 地址,我不确定问题出在哪里或下一步要看哪里。如有任何建议,我们将不胜感激。

这是我用来构建 VM 的 XML - 基于构建我所有其他 VM 的相同模板(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>

Best I can tell this is NOT a multicast mac address...

但它确实是一个多播地址,虽然不是 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 (Individual/Group) 标志。设置该位意味着该地址用作组的目标地址。最高有效字节的第二个最低有效位是 U/L (Universal/Local) 标志。设置该位意味着 MAC 地址是在本地创建的; BIA(烧入地址)清除了 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 地址。

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

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

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


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