Назад | Перейти на главную страницу

Как определить «предсказуемое имя» сетевого интерфейса

Я настраиваю новый сервер и устанавливаю Ubuntu Bionic, который использует Предсказуемые имена сетевых интерфейсов.

Программа установки работает в системе восстановления, которая по-прежнему использует старые имена интерфейсов, например eth0, eth1, но недавно установленная система настроила первую сетевую карту как enp8s0.

С помощью lshw, информация об автобусе для этой карты:

bus info: pci@0000:08:00.0

Я хотел бы настроить другие сетевые интерфейсы, не загружая только что установленную систему, но не знаю, как определить предсказуемые имена сетевых интерфейсов для других карт.

С помощью lshw, Я нашел другую сетевую карту, которая на данный момент отключена:

bus info: pci@0000:41:00.0

Можно ли по этому определить предсказуемое имя сетевого интерфейса? Было бы что-то вроде enp41s0?

Я искал какое-то время и не смог найти ни одного инструмента, который просто перечислял бы все устройства вместе с их предсказуемыми именами.

Изменить: почему я не хочу загружать новую систему, чтобы узнать? Потому что это добавит дополнительный шаг к процессу установки. Используя старое именование интерфейса, я мог запустить сценарий для настройки сервера из системы аварийного восстановления, предоставленной хостинговой компанией, и он был готов к использованию. Теперь мне нужно сначала настроить сервер без дополнительной сетевой конфигурации. Затем мне нужно настроить сеть вручную после загрузки новой системы, просто чтобы узнать имена интерфейсов.

Подробная информация о схеме именования находится в исходном коде: udev / udev-builtin-net_id.c. Раньше у него был хороший читаемый блок комментариев, объясняющий вещи, но поскольку рефакторинг удален, лучшая ссылка находится на man systemd.net-схема именования.

Некоторые распространенные схемы - физическая PCI, горячая замена PCI и встроенная. Ваш интерфейс enp предлагает физический.

Исключение экзотических и не относящихся к делу фрагментов из комментариев оставляет следующие правила:

 * Two character prefixes based on the type of interface:
 *   en — Ethernet
 *
 * Type of names:
 *   [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>]
 *                                         — PCI geographical location
 *
 * All multi-function PCI devices will carry the [f<function>] number in the
 * device name, including the function 0 device.
 *
 *
 * When using PCI geography, The PCI domain is only prepended when it is not 0.

Это имя шины PCI отформатировано как домен: bus: slot.function.

Предполагая, что это не многофункциональное устройство, pci@0000:41:00.0 выглядит как enp65s0, поскольку шестнадцатеричный 41 преобразуется в десятичное 65.

Есть несколько (новых) возможностей напрямую найти предсказуемое имя сетевого интерфейса. Ты можешь использовать udevadm info для этого. Кроме того, вы получите дополнительную информацию, которая может оказаться полезной.

Команда может экспортировать его как пары ключ-значение для удобства использования в скриптах. Видеть ID_NET_NAME в этом примере:

# udevadm info --export --query=property --path=/sys/class/net/eth0
DEVPATH='/devices/pci0000:00/0000:00:0d.0/0000:02:00.0/net/eth0'
INTERFACE='eth0'
IFINDEX='2'
SUBSYSTEM='net'
USEC_INITIALIZED='3750679'
ID_NET_NAME_MAC='enx0012345678'
ID_OUI_FROM_DATABASE='Super Micro Computer, Inc.'
ID_NET_NAME_PATH='enp2s0f0'
ID_BUS='pci'
ID_VENDOR_ID='0x8086'
ID_MODEL_ID='0x10c9'
ID_PCI_CLASS_FROM_DATABASE='Network controller'
ID_PCI_SUBCLASS_FROM_DATABASE='Ethernet controller'
ID_VENDOR_FROM_DATABASE='Intel Corporation'
ID_MODEL_FROM_DATABASE='82576 Gigabit Network Connection'
ID_PATH='pci-0000:02:00.0'
ID_PATH_TAG='pci-0000_02_00_0'
ID_NET_DRIVER='igb'
ID_NET_LINK_FILE='/lib/systemd/network/99-default.link'
ID_NET_NAME='enp2s0f0'
SYSTEMD_ALIAS='/sys/subsystem/net/devices/eth0'
TAGS=':systemd:'

Напоминание: этот пример предназначен для интерфейсов, которые все еще имеют имя «eth [0-9]». В противном случае предсказуемое имя - это имя интерфейса.