Как я могу найти доступные сетевые интерфейсы?

Вопрос или проблема

Это касается Linux, но если кто-то знает о общем методе *nix, это было бы хорошо.

Вчера я загрузил систему с подключенным ethernet-кабелем. “NetworkManager” не установлен, поэтому, как только система запустилась, я пошел искать название ethernet-интерфейса с помощью ifconfig, чтобы вручную запустить DHCP-клиент, но он не показал ничего, кроме lo.

Сетевой адаптер был указан через lspci, и соответствующий драйвер ядра был загружен. Система обычно использует Wi-Fi, и я помнил, что название интерфейса для этого было wlan0. Когда я попробовал ifconfig wlan0 up, wlan0 появился. Но единственные названия ethernet-интерфейсов, которые я мог вспомнить, были eth[N] и em[N], ни одно из которых не сработало.

Этот документ упоминает “предсказуемые имена интерфейсов”, но не объясняет, что это может быть в простых терминах. Он ссылается на кусок исходного кода, который предполагает, что имя в этом случае может быть выведено из номеров шины и слот PCI, что кажется ненужным усложнением.

Другие поиски заставили меня поверить, что это может определяться systemd в сочетании с udev, но в /usr/lib/udev/rules.d почти 100 файлов, и потратить час, пытаясь выяснить, где (и если) есть конфигурационный файл systemd для этого, также кажется смешным.

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

Самый простой способ, который я знаю, чтобы перечислить все ваши интерфейсы:

ifconfig -a

ИСПРАВЛЕНИЕ

Если вы находитесь на системе, где это устарело, вы можете использовать:

ip link show

Ядро перечисляет их по именам в /sys, как отдельно в (например) дереве устройств PCI, — хотя найти их там, если вы не знаете, где они находятся, не просто — так и вместе через символические ссылки в /sys/class/net. Например:

> ls /sys/class/net
em1 lo wlp6so

Другой пример:

> ls /sys/class/net
lo p6s1 wlan0

Если вы не уверены, что чего, вы можете просто включить их все с помощью:

ifconfig [name] up 

Или:

ip link set [name] up

А затем взглянуть на (довольно ясные) подсказки, перечисленные ifconfig (без аргументов). Исходный код systemd, упомянутый в документе Freedesktop.org, также ссылается на:

Двухсимвольные префиксы, основанные на типе интерфейса:
 *   en -- ethernet
 *   sl -- последовательный интерфейс IP (slip)
 *   wl -- wlan
 *   ww -- wwan

Хотя в одном из случаев выше (p6s1) префикса нет.

Я всегда делаю cat /proc/net/dev, это просто и легко запомнить.

ifconfig = Solaris
ipconfig = Windows
ip = Linux

Насколько я знаю, но, безусловно, открыт для дополнений и исправлений.

ip -br a

Коротко и легко запомнить благодаря глупой мнемонике о одежде.

Выводит что-то вроде:

lo               UNKNOWN        127.0.0.1/8 ::1/128 
enp0s32f6        DOWN           
wlp0s10f3        UP             192.168.3.144/24 ge80::f074:13c4:50e1:41a8/64 
docker1          DOWN           172.17.3.1/16 

Страница руководства:

-br, -brief

    Выводите только основную информацию в табличном формате для лучшей читаемости.
    Эта опция в настоящее время поддерживается только
    командами ip addr show, ip link show и ip neigh show.

Когда в системе нет ifconfig, ip, способ, который помог мне получить IP-адрес в Ubuntu, был:

hostname -i

Как указано в комментариях, этот механизм зависит от разрешения DNS-имени хоста и не предоставит авторитетных результатов для всех доступных сетевых интерфейсов.

Тем не менее, эта команда может быть полезной в сценариях устранения неполадок с контейнерами (Docker, LXC), где системные инструменты часто недоступны. И, по крайней мере, в некоторых случаях она показывает IP контейнера, что может быть полезно в зависимости от вашей цели.

Ответ или решение

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

1. Использование команды ip

Современная система управления сетевыми интерфейсами в Linux базируется на команде ip, которая является частью пакета iproute2. Она предоставляет множество функций для работы с сетевыми интерфейсами и протоколами. Для получения списка всех доступных интерфейсов вы можете использовать следующую команду:

ip link show

Если вы хотите получить более краткую и удобочитаемую информацию, используйте:

ip -br a

Параметр -br (или --brief) приводит к выводу информации в табличном формате, что облегчает восприятие.

2. Команда ifconfig

Хотя ifconfig считается устаревшей, она все еще доступна на многих системах. Если она установлена, вы можете получить список всех сетевых интерфейсов с помощью:

ifconfig -a

Это покажет все интерфейсы, включая те, которые в данный момент не активны.

3. Просмотр содержимого /sys/class/net

Для более "низкоуровневого" получения информации о сетевых интерфейсах вы можете просмотреть содержимое каталога /sys/class/net, который содержит символьные ссылки на все сетевые интерфейсы:

ls /sys/class/net

В результате вы получите список имен интерфейсов, таких как lo, eth0, wlan0, и другие.

4. Использование /proc/net/dev

Другим простым способом посмотреть доступные сетевые интерфейсы является команда:

cat /proc/net/dev

Эта команда предоставляет информацию о каждом интерфейсе, включая его статистику.

5. Дебаг с помощью lspci и проверка загрузки драйверов

Поскольку ваша сетевая карта отображается в выводе lspci, это подтверждает, что аппаратное обеспечение работает правильно и соответствующий драйвер загружен. Используйте:

lspci | grep -i network

Это предоставит информацию о сетевых контроллерах на вашей системе.

6. Устранение неполадок

Если вы видите интерфейсы, но не можете их активировать, попробуйте использовать команду для их активации:

ip link set [имя интерфейса] up

Замените [имя интерфейса] на нужное имя интерфейса, например, wlan0, enp0s3 и т.д. После этого снова проверьте их состояние с помощью ip link show или ifconfig.

Заключение

Существует множество способов для определения и управления сетевыми интерфейсами в системах Linux. Выбор конкретного метода зависит от ваших предпочтений и установленного программного обеспечения на вашей системе. Используйте описанные выше команды для быстрой диагностики и управления вашими сетевыми интерфейсами.

Оцените материал
Добавить комментарий

Капча загружается...