With this series applied it is possible to get stable NIC device naming
in combination with QEMU >= 6.0.0 (release imminent), by setting the
ACPI device index against NICs.
<acpi index="NNN"/>
The index is an unique integer that can be assigned to any PCI/PCIe
device. systemd uses this value for its stable NIC naming scheme.
If not present, then it falls back to an SMBIOS device index, but
QEMU doesn't support that concept.
Note that although this is only known to be useful for NICs, the
ACPI feature is conceptually available for any PCI device, and so
libvirt doesn't restrict the usage to only NICs.
Tested with current QEMU git master, and Fedora 30 guest. It works
with i440fx, but fails with Q35. The latter problem is reported to
qemu-devel and awaiting response.
<interface type="network">
<mac address="52:54:00:c3:d3:ef" />
<source network="default"
portid="c2361e1b-3ebf-484e-813e-9ee8e2b760c7" bridge="virbr0" />
<target dev="vnet6" />
<model type="virtio" />
<alias name="net0" />
<acpi index="103" />
<address type="pci" domain="0x0000" bus="0x00"
slot="0x03" function="0x0" />
</interface>
<interface type="network">
<mac address="52:54:00:98:22:a6" />
<source network="default"
portid="e6cdb3da-ca24-42fa-973e-8cdb92fcad3f" bridge="virbr0" />
<target dev="vnet7" />
<model type="virtio" />
<alias name="net1" />
<acpi index="113" />
<address type="pci" domain="0x0000" bus="0x00"
slot="0x0a" function="0x0" />
</interface>
<interface type="network">
<mac address="52:54:00:42:00:bc" />
<source network="default"
portid="10efeab4-f59c-4ef7-90a3-32b3895080b7" bridge="virbr0" />
<target dev="vnet8" />
<model type="virtio" />
<alias name="net2" />
<acpi index="123" />
<address type="pci" domain="0x0000" bus="0x00"
slot="0x0b" function="0x0" />
</interface>
<interface type="network">
<mac address="52:54:00:36:8e:5a" />
<source network="default"
portid="fb016189-d764-41b2-b256-f5783ade3726" bridge="virbr0" />
<target dev="vnet9" />
<model type="virtio" />
<alias name="net3" />
<acpi index="133" />
<address type="pci" domain="0x0000" bus="0x00"
slot="0x0c" function="0x0" />
</interface>
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet6 52:54:00:c3:d3:ef ipv4 192.168.122.61/24
vnet7 52:54:00:98:22:a6 ipv4 192.168.122.69/24
vnet8 52:54:00:42:00:bc ipv4 192.168.122.17/24
vnet9 52:54:00:36:8e:5a ipv4 192.168.122.13/24
$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eno103: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group
default qlen 1000
inet 192.168.122.61/24 brd 192.168.122.255 scope global dynamic noprefixroute eno103
valid_lft 2987sec preferred_lft 2987sec
3: eno113: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group
default qlen 1000
inet 192.168.122.69/24 brd 192.168.122.255 scope global dynamic noprefixroute eno113
valid_lft 2987sec preferred_lft 2987sec
4: eno123: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group
default qlen 1000
inet 192.168.122.17/24 brd 192.168.122.255 scope global dynamic noprefixroute eno123
valid_lft 2987sec preferred_lft 2987sec
5: eno133: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group
default qlen 1000
inet 192.168.122.13/24 brd 192.168.122.255 scope global dynamic noprefixroute eno133
valid_lft 2988sec preferred_lft 2988sec
Changed in v2:
- Fix typos
- Document limits / uniqueness
- Drop caps refresh
- Add xml2xml test
Daniel P. Berrangé (5):
conf: add support for <acpi index='NNN'/> for PCI devices
qemu: fix indentation off-by-1
qemu: use a switch when building device addresses
qemu: probe for "acpi-index" property
qemu: wire up command line support for ACPI index
docs/formatdomain.rst | 7 ++
docs/schemas/domaincommon.rng | 73 +++++++++++++++++++
src/conf/device_conf.h | 3 +
src/conf/domain_conf.c | 19 +++++
src/qemu/qemu_capabilities.c | 6 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 42 +++++++++--
src/qemu/qemu_validate.c | 35 +++++++++
.../caps_6.0.0.x86_64.xml | 1 +
.../devices-acpi-index.x86_64-latest.args | 57 +++++++++++++++
tests/qemuxml2argvdata/devices-acpi-index.xml | 62 ++++++++++++++++
tests/qemuxml2argvtest.c | 2 +
.../devices-acpi-index.x86_64-latest.xml | 73 +++++++++++++++++++
tests/qemuxml2xmltest.c | 2 +
14 files changed, 376 insertions(+), 7 deletions(-)
create mode 100644 tests/qemuxml2argvdata/devices-acpi-index.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/devices-acpi-index.xml
create mode 100644 tests/qemuxml2xmloutdata/devices-acpi-index.x86_64-latest.xml
--
2.30.2