The current systemd naming scheme for Network cards has a problem correctly naming multi-port NIC devices in a PCI slot.
Systemd currently generates names of the form: enpAsBfCdD pA = PCI bus number sB = PCI device number (confusingly called 'SLOT') fC = PCI function number [dD = NIC device port (sysfs dev_port)] eg. enp5s0f0 for a NIC at 05:00.0, dev_port = 0 These names already aren't necessarily persistent if PCI bus topology changes (Bus number changes due to adding cards across reboot, etc). --or-- ensBfCdD sB = _SUN slot fC = PCI function number [dD = NIC device port (sysfs dev_port)] eg. ens2f0d1 for a single-port NIC at 0?:00.0 in PCI slot 2, dev_port = 1 The problem is the 2nd naming scheme cannot handle multi-port NICs. Multi-port NICs often have one or more bridges before the PCI slot number itself. eg. for my quad-port Intel NIC in PCI slot 2 the devices are actually: 44:00.0 44:00.1 45:00.0 45:00.1 Using the 2nd naming scheme, the names generated are: ens2f0 ens2f1 ens2f0 ens2f1 Oops. Problem. There is a name collision. So depending on who gets initialized first I'll see either: ens2f0 ens2f1 enp69s0f0 enp69s1f0 or enp68s0f0 enp68s1f0 ens2f0 ens2f1 There is a way to fix this by combining the two naming schemes, with a bit of a hack. enpAsBfCdD pA = PCI bus # (no change) sB = _SUN slot # (no change) fC = This is what changes. Instead of C = function number (0..7) it is Device:Function (0..31) dD = Device port (no change) On my system this generates new names: enp4s0 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f0 enp4s0d1 at /sys/devices/pci0000:00/0000:00:03.0 1 SLOT 3 => enp3s4f0d1 enp4s0f1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f1 enp4s0f1d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f1d1 enp4s0f2 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f2 enp4s0f2d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f2d1 enp4s0f3 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f3 enp4s0f3d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f3d1 enp4s0f4 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f4 enp4s0f4d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f4d1 enp4s0f5 at /sys/devices/pci0000:00/0000:00:03.0 SLOT => enp3s4f5 enp4s0f5d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f5d1 enp4s0f6 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f6 enp4s0f6d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f6d1 enp4s0f7 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f7 enp4s0f7d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f7d1 enp4s1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f8 (Device 1:0 => Function 8) enp4s1d1 at /sys/devices/pci0000:00/0000:00:03.0 SLOT 3 => enp3s4f8d1 (Device 1:0 => Function 8) enp68s0f0 at /sys/devices/pci0000:40/0000:40:03.0 SLOT 2 => enp68s2f0 enp68s0f1 at /sys/devices/pci0000:40/0000:40:03.0 SLOT 2 => enp68s2f1 enp69s0f0 at /sys/devices/pci0000:40/0000:40:03.0 SLOT 2 => enp69s2f0 enp69s0f1 at /sys/devices/pci0000:40/0000:40:03.0 SLOT 2 => enp69s2f1 This way it is always able to determine the physical PCI slot the device is in. This scheme still does have a limitation... the names may not be persistent if PCI topology changes due to the PCI bus number still being part of the name. _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel