Проблема с Supermicro

22 января 2019

Проблема с именами встроенных сетевых интерфейсов на 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
    

Обсуждения проблемы:

  • https://github.com/systemd/systemd/issues/1390 — небезызвестный автор systemd предсказуемо ответил, что ошибка не в systemd, а в окружающей Вселенной, и закрыл баг;
  • https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1578141 — в Убунте обсуждение заглохло;
  • https://bugzilla.altlinux.org/show_bug.cgi?id=31939 — ALT Linux одним из первых понял, в чём проблема, но впал в ступор при попытке выбрать меньшее из двух зол:
    • то ли внести исправления в собственной сборке и сопровождать их в дальнейшем;
    • то ли попытаться убедить автора systemd принять изменения в апстрим.

Немного истории:

  • В старых ядрах сетевые интерфейсы получали имена 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 в параметрах загрузки ядра.


← Назад в Блог