Проблема с именами встроенных сетевых интерфейсов на Supermicro
- Имеется сервер с материнской картой от Супермикро.
- Несколько встроенных сетевых интерфейсов (в нашем случае два гигабитных Интела и два 10-гигабитных Броадкома).
- CentOS 7.
- Результат: при старте системы имена однотипных сетевых интерфейсов могут поменяться местами, или один может пропасть из системы, а его имя присвоится другому.
Что мы увидели в dmesg:
- исходно systemd нормально видит все четыре встроенных интерфейса под именами eth0,1,2,3;
- каждому из интерфейсов systemd пытается назначить одно и то же имя eno1;
- eth3 переименовывается нормально, остальные три после ошибок File exists и device appeared twice with different sysfs path перестают быть видны.
Oct 24 21:38:35 ki-1 kernel: bnx2x 0000:05:00.1: part number 394D4342-31383735-30314130-473630
Oct 24 21:38:35 ki-1 systemd-udevd: Error changing net interface name 'eth2' to 'eno1': File exists
Oct 24 21:38:35 ki-1 systemd-udevd: could not rename interface '4' from 'eth2' to 'eno1': File exists
Oct 24 21:38:35 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eth2 and /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1
Oct 24 21:38:35 ki-1 systemd-udevd: Error changing net interface name 'eth1' to 'eno1': File exists
Oct 24 21:38:35 ki-1 systemd-udevd: could not rename interface '3' from 'eth1' to 'eno1': File exists
Oct 24 21:38:35 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eth2 and /sys/devices/pci0000:80/0000:80:00.0/0000:85:00.0/net/eth1
Oct 24 21:38:35 ki-1 systemd-udevd: Error changing net interface name 'eth0' to 'eno1': File exists
Oct 24 21:38:35 ki-1 systemd-udevd: could not rename interface '5' from 'eth0' to 'eno1': File exists
Oct 24 21:38:35 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eth2 and /sys/devices/pci0000:80/0000:80:00.0/0000:85:00.1/net/eth0
Oct 24 21:38:36 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eth2 and /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1
Oct 24 21:38:36 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eth2 and /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1
...
Oct 24 21:38:36 ki-1 kernel: bnx2x 0000:05:00.0 eno1: renamed from eth0
...
Oct 24 21:38:38 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1 and /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eth2
Oct 24 21:38:38 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1 and /sys/devices/pci0000:80/0000:80:00.0/0000:85:00.0/net/eth1
Oct 24 21:38:38 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1 and /sys/devices/pci0000:80/0000:80:00.0/0000:85:00.1/net/eth0
...
Oct 24 21:38:38 ki-1 systemd-udevd: Error changing net interface name 'eth0' to 'eno1': File exists
Oct 24 21:38:38 ki-1 systemd-udevd: could not rename interface '5' from 'eth0' to 'eno1': File exists
Oct 24 21:38:38 ki-1 systemd-udevd: Error changing net interface name 'eth1' to 'eno1': File exists
Oct 24 21:38:38 ki-1 systemd-udevd: could not rename interface '3' from 'eth1' to 'eno1': File exists
Oct 24 21:38:38 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1 and /sys/devices/pci0000:80/0000:80:00.0/0000:85:00.1/net/eth0
Oct 24 21:38:38 ki-1 systemd: Device sys-subsystem-net-devices-eno1.device appeared twice with different sysfs paths /sys/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eno1 and /sys/devices/pci0000:80/0000:80:00.0/0000:85:00.0/net/eth1
Немного истории:
- В старых ядрах сетевые интерфейсы получали имена eth0, eth1, ... в порядке обнаружения ядром.
- С появлением udev и iproute2 имена стали конфигурируемыми. Ключевой характеристикой интерфейса стал его MAC-адрес.
Назначение имён по MAC-адресам настраивалось в /etc/udev/rules.d/70-persistent-net.rules
и приносило неизменные проблемы при замене сетевой карты или при перестановке диска с системой в другой компьютер,
потому что eth0 исчезал, вместо него появлялся eth1, а все сетевые настройки продолжали относиться к eth0.
- Затем Redhat решил, что застой — это плохо, и предложил генерировать имена в зависимости от расположения интерфейса на материнской плате.
Собираем информацию:
- Мы решили собрать о сетевых устройствах как можно больше сведений, которые systemd-udevd использует для генерации нового имени.
- В полученном отчёте мы увидели:
- что ID_NET_NAME_PATH у всех карт разный и осмысленный;
- но ID_NET_NAME_ONBOARD у всех встроенных карт одинаковый — eno1!
$ for f in /sys/devices/pci*/*/*/net/* ; do udevadm info $f; done
P: /devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eth0
E: DEVPATH=/devices/pci0000:00/0000:00:02.2/0000:05:00.0/net/eth0
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=NetXtreme II BCM57810 10 Gigabit Ethernet
E: ID_MODEL_ID=0x168e
E: ID_NET_DRIVER=bnx2x
E: ID_NET_NAME_MAC=enx002590fb8bd4
E: ID_NET_NAME_ONBOARD=eno1
E: ID_NET_NAME_PATH=enp5s0f0
E: ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
E: ID_PATH=pci-0000:05:00.0
E: ID_PATH_TAG=pci-0000_05_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Broadcom Corporation
E: ID_VENDOR_ID=0x14e4
E: IFINDEX=2
E: INTERFACE=eth0
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eno1
E: TAGS=:systemd:
E: USEC_INITIALIZED=15601
P: /devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eno1
E: DEVPATH=/devices/pci0000:00/0000:00:02.2/0000:05:00.1/net/eno1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=NetXtreme II BCM57810 10 Gigabit Ethernet
E: ID_MODEL_ID=0x168e
E: ID_NET_DRIVER=bnx2x
E: ID_NET_NAME_MAC=enx002590fb8bd6
E: ID_NET_NAME_ONBOARD=eno1
E: ID_NET_NAME_PATH=enp5s0f1
E: ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
E: ID_PATH=pci-0000:05:00.1
E: ID_PATH_TAG=pci-0000_05_00_1
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Broadcom Corporation
E: ID_VENDOR_ID=0x14e4
E: IFINDEX=4
E: INTERFACE=eno1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eno1
E: TAGS=:systemd:
E: USEC_INITIALIZED=15748
P: /devices/pci0000:80/0000:80:00.0/0000:85:00.0/net/eth1
E: DEVPATH=/devices/pci0000:80/0000:80:00.0/0000:85:00.0/net/eth1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection
E: ID_MODEL_ID=0x1521
E: ID_NET_DRIVER=igb
E: ID_NET_NAME_MAC=enx002590fdbc44
E: ID_NET_NAME_ONBOARD=eno1
E: ID_NET_NAME_PATH=enp133s0f0
E: ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
E: ID_PATH=pci-0000:85:00.0
E: ID_PATH_TAG=pci-0000_85_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=3
E: INTERFACE=eth1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eno1
E: TAGS=:systemd:
E: USEC_INITIALIZED=79461
P: /devices/pci0000:80/0000:80:00.0/0000:85:00.1/net/eth2
E: DEVPATH=/devices/pci0000:80/0000:80:00.0/0000:85:00.1/net/eth2
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection
E: ID_MODEL_ID=0x1521
E: ID_NET_DRIVER=igb
E: ID_NET_NAME_MAC=enx002590fdbc45
E: ID_NET_NAME_ONBOARD=eno1
E: ID_NET_NAME_PATH=enp133s0f1
E: ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
E: ID_PATH=pci-0000:85:00.1
E: ID_PATH_TAG=pci-0000_85_00_1
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=5
E: INTERFACE=eth2
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eno1
E: TAGS=:systemd:
E: USEC_INITIALIZED=80310
P: /devices/pci0000:80/0000:80:03.0/0000:81:00.0/net/enp129s0f0
E: DEVPATH=/devices/pci0000:80/0000:80:03.0/0000:81:00.0/net/enp129s0f0
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (Ethernet Server Adapter X520-2)
E: ID_MODEL_ID=0x10fb
E: ID_NET_DRIVER=ixgbe
E: ID_NET_NAME_MAC=enx001b21b11e3c
E: ID_NET_NAME_PATH=enp129s0f0
E: ID_OUI_FROM_DATABASE=Intel Corporate
E: ID_PATH=pci-0000:81:00.0
E: ID_PATH_TAG=pci-0000_81_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=6
E: INTERFACE=enp129s0f0
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp129s0f0
E: TAGS=:systemd:
E: USEC_INITIALIZED=82250
P: /devices/pci0000:80/0000:80:03.0/0000:81:00.1/net/enp129s0f1
E: DEVPATH=/devices/pci0000:80/0000:80:03.0/0000:81:00.1/net/enp129s0f1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (Ethernet Server Adapter X520-2)
E: ID_MODEL_ID=0x10fb
E: ID_NET_DRIVER=ixgbe
E: ID_NET_NAME_MAC=enx001b21b11e3d
E: ID_NET_NAME_PATH=enp129s0f1
E: ID_OUI_FROM_DATABASE=Intel Corporate
E: ID_PATH=pci-0000:81:00.1
E: ID_PATH_TAG=pci-0000_81_00_1
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=7
E: INTERFACE=enp129s0f1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp129s0f1
E: TAGS=:systemd:
E: USEC_INITIALIZED=82665
Решение:
- Скопировать 80-net-name-slot.rules в файл с меньшим номером, вырезав при копировании строку с ID_NET_NAME_ONBOARD.
- Благодаря этому первым будет обработано правило с ID_NET_NAME_SLOT или ID_NET_NAME_PATH.
- Чтобы не менять без необходимости стандартное поведение на тех серверах, на которых проблема отсутствует, копирование имеет смысл предварять проверкой на необходимость:
for f in /sys/devices/pci*/*/*/net/* ; do udevadm info $f; done | grep ID_NET_NAME_ONBOARD | sort | uniq -c | grep -qv ' 1 E: ' &&
grep -v ID_NET_NAME_ONBOARD /lib/udev/rules.d/80-net-name-slot.rules > /etc/udev/rules.d/79-net-name-slot-cdnnow.rules
Альтернативные варианты, которые у нас не заработали:
- Явное указание HWADDR вместо DEVICE в /etc/sysconfig/network-scripts/ifcfg-ethX.
- /etc/systemd/network/OnboardBroadcom.link с Match/Driver=bnx2x и Link/NamePolicy=path.
- Не пробовали: biosdevname=1 в параметрах загрузки ядра.