Каков стандарт соглашения об именах для интерфейсов Ethernet и Wi-Fi на компьютере с Linux?
Мы разрабатываем инструмент, который должен отображать только интерфейсы Ethernet и Wi-Fi компьютера с Linux и его текущее состояние.
Например, ниже приведен список сетевых интерфейсов (физических и виртуальных) на моем компьютере с Linux (Ubuntu):
docker0
, enp0s25
, lo
,wlp3s0
Когда я запускаю инструмент, ниже приводится результат, который я получаю:
enp0s25
, wlp3s0
Мы написали код с логикой, что все интерфейсы Ethernet всегда начинаются с буквы, e
а интерфейсы Wi-Fi всегда начинаются с буквы w
.
Правильна ли логика? Если нет, как мы можем решить эту проблему?
networking
wifi
network-interface
ethernet
Мохан Радж
источник
источник
iwconfig
фильтрует интерфейсы WiFi от других.lshw -class network
возможно? Ищи все что естьcapabilities: ethernet physical
? Возможно, искать и другие возможности?Ответы:
Сетевые интерфейсы могут быть названы как угодно, поэтому независимо от того, что вы делаете, вы столкнетесь с ситуациями, когда (1) существует «физический» сетевой интерфейс с именем, которое не соответствует вашему шаблону, или (2) существует «Физический» сетевой интерфейс, который будет соответствовать вашему шаблону.
Вдобавок ко всему, если бы я был пользователем вашего инструмента, в тот момент, когда ваш инструмент не позволил бы мне делать то, что я хочу, потому что у меня есть сетевой интерфейс, который является «виртуальным», хотя для практических целей это следует учитывать » «физически», я бы начал громко и сильно ругаться с вашим приложением и больше никогда не буду его использовать.
Физические и виртуальные сетевые интерфейсы имеют общий API - вот что делает Linux по-настоящему гибким. Пожалуйста, не пытайтесь нянчить своего пользователя и отнимать это у него или нее. Ваши пользователи будут вам благодарны.
источник
ip link set ... name ...
может измениться. И да, я мог бы сам перечислить предсказуемые имена интерфейсов. Ответ на оригинальный вопрос: «Пожалуйста, не делайте так». Потому что независимо от того, как вы это сделаете, это не сработает.red
,blue
иgreen
.Для предсказуемых системных имен интерфейсов префиксы можно увидеть в
udev-builtin-net_id.c
:поэтому как для традиционного
ethX
стиля именования, так и для более нового именования systemd, начальная буква e должна быть интерфейсом Ethernet для любых автоматически генерируемых имен интерфейсов. Все интерфейсы wifi должны начинаться с w в обеих схемах, хотя не все интерфейсы, начинающиеся с w, будут wifi.Если этот инструмент должен работать в произвольной среде (а не только на внутренние среды , которые вы контролируете), отмечают , что пользователи могут переименовывать интерфейсы систем Linux с произвольными именами, такими как [
wan0
,lan0
,lan1
,dmz0
] , которые будут нарушать любые предположения о начальных буквах ,источник
biosdevname
для именования интерфейсов, где интерфейс Ethernet может быть назван какp3p7
. Этот метод является предшественником новых предсказуемых имен systemd, и хотя сейчас он не рекомендуется использовать в распространенных дистрибутивах, все равно будет много систем, которые использовали его, когда он был по умолчанию несколько лет назад.rename%u
откатным ), и формат hasn ' t существует в исходном коде с 2012 года. Я хотел бы вздохнуть, что ваше программное обеспечение устарело на шесть лет.Соглашение об именах таково, что интерфейсы LAN называются
eth0
,eth1
... и что интерфейсы WLAN названыwlan0
,wlan1
...То, что вы видите, это так называемые «предсказуемые имена», которые представил systemd. На практике они совсем не предсказуемы и даже могут меняться при смене аппаратного обеспечения, что и является той проблемой, которой они должны избегать.
Для угадывания начальная буква может быть достаточно хорошей. Некоторые интерфейсы, в частности WLAN, имеют подсказки в
/sys/class/net/*/uevent
:К сожалению,
DEVTYPE
для интерфейсов ЛВС такого нет .источник
Одно предостережение с моим ответом (относится и к большинству других): я не знаю цели вашего заявления. Если это одноразовое приложение для устранения одной конкретной проблемы или для лучшего понимания работы сети, которое никогда не будет использоваться снова, то использование первой буквы интерфейса может быть отличным вариантом для быстрого и грязного использования. Если вы планируете записать следующего конкурента в Wireshark или tcpdump, вы должны быть уверены, что получите его правильно для всех видов крайних случаев.
И если приложение, которое вы пишете, находится где-то между этими крайностями, только вы (и ваши клиенты) могут знать, насколько тщательно вам нужно реализовать свою логику.
Другие уже указывали, что имена никогда не бывают достоверными по ряду причин. Конечная проблема очень распространена в программном обеспечении: жесткие предположения вместо того, чтобы полагаться на известные / документированные факты.
Вторая проблема, которая не была упомянута, также основана на предположении о ваших требованиях: список интерфейсов, которые вы хотите перечислить, это всегда именно «аппаратные интерфейсы Ethernet» и «интерфейсы wifi».
Третья проблема - это еще одно предположение: все интерфейсы попадут в категории, о которых вы можете подумать прямо сейчас. Как насчет Infiniband, как упомянуто @ user4556274? Как насчет туннельных интерфейсов для VPN? Как насчет мостовых интерфейсов? Как насчет мостовых интерфейсов, которые объединяют физические и логические интерфейсы?
Но могут быть варианты, чтобы выполнить то, что вы ищете. Во-первых, определите, что именно характеризует интерфейс, который вы хотите перечислить, а не тот, который вы не хотите.
В большинстве случаев одной характеристикой, на которую можно положиться, является таблица маршрутизации (однако она будет работать только до тех пор, пока работает интерфейс, поэтому она может не соответствовать тому, что вы на самом деле ищете).
Любой интерфейс, который имеет маршрут по умолчанию (т. Е. Маршрут к 0.0.0.0), вероятно, будет тем, который вы ищете.
Обратите внимание, что даже это по-прежнему основано на предположении, только более надежном: возможно, что система настроена на маршрутизацию всего исходящего трафика через виртуальную машину или док-контейнер (например, если есть контейнер с брандмауэром) ). И обратное также верно: системный администратор может заблокировать внешний трафик, удалив маршрут по умолчанию.
Другой вариант - перейти к реальному оборудованию и посмотреть, какой драйвер он использует. Вы можете исключить некоторых известных водителей
источник
Вы явно исключаете связанные или объединенные интерфейсы? Нашим по умолчанию здесь является использование
bond0
илиteam0
для основного интерфейса для наших серверов.Я думаю, вам нужно переосмыслить свою логику. Может быть, попробуйте перебрать все определенные сетевые интерфейсы в данной системе, разделить их между Ethernet, Wi-Fi, Infiband, последовательный порт и т. Д., А затем сделать свое дело.
источник
Не используйте жесткий код или шаблон, соответствующий названиям оборудования. Это относится ко всем устройствам. Положитесь на инструменты, предоставляемые udev, чтобы определить список устройств и предпринять соответствующие действия. См. 16.7 «Постоянное именование устройств» , а затем прочитайте весь этот документ. , в частности 16.2 и 16.3. Обратите внимание, что udev не зависит от распространения, а также от системы init, так как теперь udev является предпочтительным методом управления устройствами в linux.
Обратите внимание, что @ user4556274, ссылаясь на это в своем ответе, ссылается на него
udev-builtin-net-id.c
, что вкратце означает, что сопоставление с образцом, которое вы пытаетесь выполнить, является встроенной частьюudev
.Цитирование PredictableNetworkInterfaceNames :
источник
Как уже говорили другие, вы не можете полностью зависеть от имени.
В моем случае кажется, что для беспроводной сети
/sys/class/net/<ifacename>/
будет каталог под названием «беспроводной», если это беспроводной интерфейс:источник