Qemu scrambles order of eth devices in vm

Bug #1089006 reported by john fisher
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
QEMU
Expired
Undecided
Unassigned

Bug Description

HV = 12.04 LTS plus libvirt 1.0x
VM = 12.04 LTS

On the HV there are 12 eth interfaces which we make available to the VM. We have 4 10G virtual function interfaces, and 8 1G conventionally bridged interfaces. No matter what order we present the interfaces in the xml file, they come up in eth0-eth11 order on the VM as follows: ( the interfcaes do work, once you figure out which is which)

eth0-eth7 not in order as compoared to the bridges on the HV (interfaces file) or compared to the xml file for the VM, or compared to the bus numbers. MAC addresses are random.
eth8-eth11 show up in the VM in order of PCU bus numbers just as you'd expect, always after the bridged interfaces.

Consulting the libvirt mailing list, the developer says they present the list in bus order to qemu, but qemu scrambles that order. That appears to me too, to be the case.

Revision history for this message
Daniel Berrange (berrange) wrote :

There is really no such concept as "NIC order" at the hardware level in QEMU. NIC naming order is something that operating systems invent according to some policy they have. As far as libvirt & QEMU are concerned, you only have control over the PCI device slot numbering. The operating system may choose to number NICs based on their PCI device slot number, or something else entirely. Further after an OS has been booted once, they often record the original mapping of MAC <-> NIC names, so even if you change the PCI slot ordering on later boots, the naming won't change.

Revision history for this message
john fisher (john-jpfisher) wrote :

Thank you Daniel.
I understand what you say and agree. However when presented with a mapping and an order by libvirt, shouldn't the order be preserved by default? If the OS scrambles it, then fine, not your problem...

Are we on the right track here, is there some way to control the order as presented by Qemu when the VM's OS boots?

If its at all helpful to understand the issue, here is our current proposed workaround:
=start 32 fresh VMs, each with 8 bridged connections and 4 82599 virtual connections=
take one generic xml file
qemu-img one default disk image
examine the HV's lspci output to find out bus numbering for the 82599 virtuals
add correct bus numbering in xml file
virsh create the xml to get randomized MAC addresses ( better ways to do this...)
save xml again
shutdown VM
> heres where the workaround occurs <
mount VM
write to /etc/udev/rules.d file to capture MAC vs PCI numbering in order of presentation for booting
etc etc

Revision history for this message
john fisher (john-jpfisher) wrote : Re: [Bug 1089006] Re: Qemu scrambles order of eth devices in vm
Download full text (4.5 KiB)

For the benefit of 1) others and 2) me when I forget how this works-

I did find a solution in formatting the xml file.

If you leave the vnets out completely, see file below, the generic xml file will cooperate with libvirt and qemu and
order the VM's eth devices as they are ordered on the hypervisor.

(note: the macvtap entries seen below may also not be needed, sound and usb not tested)

## sample xml file for libvirt 1.0.0 showing some bridges and some SRIOV ports too ##

<domain type='kvm' id='1'>
  <name>sample</name>
  <hostname>sample</hostname>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-1.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/oa4-vm-sample-cli.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <alias name='usb0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <interface type='bridge'>
      <source bridge='br4'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br5'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br6'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br7'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br8'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br9'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br10'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br11'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br250'/>
      <model type='virtio'/>
    </interface>
    <interface type='hostdev'>
      <source dev='eth0' mode='vepa'>
                  <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x0'/>
          </source>
      <target dev='macvtap1'/>
      <model type='virtio'/>
    </interface>
    <interface type='hostdev'>
      <source dev='eth1' mode='vepa'>
                  <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
          </source>
      <target dev='macvtap1'/>
      <model type='virtio'/>
    </interface>
    <interface type='hostdev'>
      <source dev='eth2' mode='vepa'>
                  <address type='pci' domain='0x0000' bus='0x16' slot='0x10' function='0x0'/>
          </source>
      <target dev='macvtap0'/>
    </interface>...

Read more...

Revision history for this message
Thomas Huth (th-huth) wrote :

Is there still something left to do here, or could we close this bug nowadays?

Changed in qemu:
status: New → Incomplete
Revision history for this message
Launchpad Janitor (janitor) wrote :

[Expired for QEMU because there has been no activity for 60 days.]

Changed in qemu:
status: Incomplete → Expired
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.