Как проверить, работает ли интерфейс Ethernet с каким-то IP или нет в LINUX только с помощью sysfs?

Во время поиска я наткнулся на /sys/class/net/eth0/operstate(will contain "up/down") и /sys/class/net/eth0/carrier(will contain either "0/1") , значения которых зависят от того, включен ли интерфейс вверх/вниз и какой-либо физический кабель Ethernet подключен к порту Ethernet или нет, но он не скажет, есть ли у интерфейса какой-либо IP или нет. так есть ли способ узнать, есть ли у интерфейса Ethernet IP или нет, используя sysfs или любую другую виртуальную файловую систему?


person divakar    schedule 12.11.2020    source источник
comment
Мне немного непонятно. Что вы подразумеваете под интерфейсом есть IP-адрес и уведомлять? Вы имеете в виду получение какого-либо уведомления о событии назначения DHCP-адреса или изменения IP-адреса вручную? Или вы просто хотите найти текущий IP-адрес указанного интерфейса в файловой системе?   -  person red0ct    schedule 12.11.2020
comment
Прочитайте stackoverflow.com /вопросы/5281341/   -  person red0ct    schedule 12.11.2020
comment
Между прочим, sysfs не относится к POSIX. Я думаю, вам следует удалить этот тег или отредактировать свой вопрос, чтобы показать, что вы пытаетесь найти решение, совместимое с POSIX.   -  person red0ct    schedule 12.11.2020


Ответы (1)


В sysfs нет ничего, что могло бы сообщить вам IP-адреса. Сетевая система всегда была немного другой, например. сетевые интерфейсы не являются узлами устройств, и он не использует sysfs. Сетевое аппаратное обеспечение — да, но сетевой уровень — не очень.

Список интерфейсов в /sys/class/net — это все, что вы получите. Информация там относится ко всем устройствам и не имеет сети, протоколов и неаппаратных адресов.

В /proc есть еще что-то, но не совсем то, что вам нужно. Вы можете получить список интерфейсов в /proc/net/dev. Он не сообщает вам, включен ли интерфейс или назначен ли ему адрес.

Если интерфейс появляется в /proc/net/route, то он находится в таблице маршрутизации. Как правило, любой интерфейс, которому был назначен IP-адрес, появится в таблице маршрутизации, и маршрут будет создан одновременно с назначением IP-адреса. Но не обязательно, чтобы интерфейс с IP отображался в таблице маршрутизации. С IPv4LL даже интерфейс без маршрутов может отправлять и получать пакеты.

В /proc/net/if_inet6 есть список всех интерфейсов, которым назначен адрес IPv6, вместе с адресом в шестнадцатеричном формате. Но это только IPv6, а не IPv4.

Если вы хотите получать уведомления о назначении или удалении адресов, лучше всего это сделать через сокет netlink. Вам нужно написать код, чтобы использовать это. Дейтаграмма netlink будет отправлена ​​вашим процессам через сокет netlink при добавлении, изменении или удалении адреса интерфейса. Дейтаграмма будет содержать такие вещи, как имя и адрес интерфейса.

Это гораздо лучший способ мониторинга, так как ваш процесс может просто спать в сокете netlink, ожидая пакета. Когда адрес изменится, вас сразу же разбудят. Это будет быстрее реагировать и намного эффективнее, чем непрерывный опрос файлов в sysfs. Вам также не нужно беспокоиться о том, что что-то упущено, если оно изменяется несколько раз, например. адреса добавляются, а затем удаляются между опросами. И сохраняет порядок событий.

Если в системе работает NetworkManager или что-то совместимое, то мониторинг через dbus можно сделать. Сигнал org.freedesktop.NetworkManager.DeviceAdded можно отслеживать для новых устройств и на каждом устройстве, например. /org/freedesktop/NetworkManager/Devices/1 сигнал org.freedesktop.NetworkManager.Device.StateChanged можно отслеживать, чтобы увидеть, когда устройство входит/выходит из NM_DEVICE_STATE_ACTIVATED.

person TrentP    schedule 12.11.2020
comment
Спасибо за ваш ответ . я решил это, используя сокет для определения IP-адреса сетевого интерфейса. - person divakar; 17.11.2020
comment
Сетевых интерфейсов может быть несколько. - person TrentP; 18.11.2020