проверьте, подключен ли сетевой кабель к данной сетевой карте

проверьте, подключен ли сетевой кабель к данной сетевой карте

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

Как проверить, ethXподключен ли данный порт или нет?

Я нашел много похожихвопросы, но ни то, ethtoolни другое cat /sys/class/net/eth1/carrierу меня не работает.

В моем случае кабель действительно подключен eth2, но ethtoolвсе равно отображаетсяLink detected: no

Settings for eth2:
    Supported ports: [ FIBRE ]
    Supported link modes:   10000baseT/Full 
    Supported pause frame use: Symmetric
    Supports auto-negotiation: No
    Advertised link modes:  10000baseT/Full 
    Advertised pause frame use: Symmetric
    Advertised auto-negotiation: No
    Speed: Unknown!
    Duplex: Unknown! (255)
    Port: Direct Attach Copper
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: off
    Supports Wake-on: d
    Wake-on: d
    Current message level: 0x00000007 (7)
                   drv probe link
    Link detected: no

Кабель не подключен eth3, но ethtoolвывод выглядит почти так же:

diff <(ethtool eth2) <(ethtool eth3)
1c1
< Settings for eth2:
---
> Settings for eth3:
11c11
<   Port: Direct Attach Copper
---
>   Port: Other

Сначала, когда я поднимаю интерфейс eth2, затем ethtoolпоказывает Link detected: yes. После этого ethtoolсообщает о ссылке как yes, даже когда я отключаю интерфейс.

Короче говоря, ethtoolпохоже, что с первого раза ничего не работает, пока не был обновлен интерфейс.

Как можно надежно проверить, подключен ли кабель к данному интерфейсу??

решение1

Я предполагаю, что вы хотите узнать состояние соединения сетевой карты, а не физическое состояние кабеля, подключенного к разъему (это может оказаться невозможным выяснить).

При быстром поиске, я думаю, у вас уже есть ответ. Откройте интерфейс, подождите, пока он найдет ссылку, если она есть (это может занять несколько секунд), затем проверьте вывод ethtool, или carrierи/или operstateв /sys/class/net/$NIC/.

ifconfig somenic upпохоже, делает эти два ioctlзвонка:

ioctl(4, SIOCGIFFLAGS, {ifr_name="somenic", ifr_flags=IFF_BROADCAST|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="somenic", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0

То есть, он устанавливает IFF_UP. На основездесь, установка которого фактически приводит к инициализации устройства:

Затем он устанавливает IFF_UPбит dev->flagс помощью ioctl(SIOCSIFFLAGS)(Socket I/O Control Set Interface Flags) для включения интерфейса.

Однако последняя команда ( ioctl(SIOCSIFFLAGS)) вызывает метод открытия устройства.

Что касается самого кода, драйвер должен выполнять многие из тех же задач, что и символьные и блочные драйверы. open запрашивает все необходимые системные ресурсы и сообщает интерфейсу о необходимости запуска;

Есть комментарии к подобному эффекту вe1000eисточник драйвера:

/**
 * e1000e_open - Called when a network interface is made active
 * @netdev: network interface device structure
 *
 * Returns 0 on success, negative value on failure
 *                                                                                                                                                                           * The open entry point is called when a network interface is made
 * active by the system (IFF_UP).  At this point all resources needed
 * for transmit and receive operations are allocated, the interrupt
 * handler is registered with the OS, the watchdog timer is started,
 * and the stack is notified that the interface is ready.
 **/
int e1000e_open(struct net_device *netdev)  

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


Конечно, теоретически возможно, что некоторые драйверы ведут себя по-другому и инициализируют оборудование до того, как кто-либо установит IFF_UP, но в общем случае это все равно не поможет.

На одной машине (подключенной e1000eк коммутатору Cisco) отключение интерфейса также приводит к тому, что коммутатор видит, что соединение отключается.

На другой машине (со встроенной сетевой картой Realtek) при изменении состояния с повышенного на пониженное происходит кратковременное отключение удаленного коммутатора, но коммутатор видит соединение, а затем восстанавливает его ( ethtoolхотя на стороне ПК отображается сообщение «нет соединения»). Возможно, это связано с подготовкой к Wake-on-LAN или чему-то подобному, но я понятия не имею.

решение2

Попробуйте команду ifplugstatusиз пакетаifplugd

$ ifplugstatus net0
net0: unplugged

$ ifplugstatus wlnet0
wlnet0: link beat detected

Помимо вывода на экран, вы также можете узнать о состоянии завершения команды.

(из руководства)

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

  0 Success

  1 Failure

  2 Link beat detected (only available when an interface is specified)

  3 Unplugged (same here)

решение3

Я посмотрел исходный код ethertools, но не нашел места, где описывается состояние соединения.

Затем я обнаружил, что это, похоже, точная копия вопроса на SO:https://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network-cable-connector

Я перепробовал большинство из перечисленных там ответов (mii-tools, ethertool, cat the carrier или operstate, dmesg), и ни один из них не работал должным образом на канале, когда ifconfig был недоступен.

Поскольку SO вопросу уже более 6 лет, я думаю, что большинствовозможныйответы уже есть.

Я бы проголосовал, что со стандартными инструментами Linux вы не сможете проверить оператора, пока не попытаетесь его поднять. После этого, mii-toolsпохоже, все работало нормально для обнаружения ссылок и давало однородный ответ.

Я не пробовал rtnetlink и некоторые другие ответы там, которые касаются обнаруженияизмененияв состоянии связи, что, как я полагаю, не совсем то, что вам нужно.

Связанный контент