Во время поиска я наткнулся на /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 или любую другую виртуальную файловую систему?
Как проверить, работает ли интерфейс Ethernet с каким-то IP или нет в LINUX только с помощью sysfs?
Ответы (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
.