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