На сервере установлено несколько сетевых карт, кабель подключен только к одной из них.
Как проверить, 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 и некоторые другие ответы там, которые касаются обнаруженияизмененияв состоянии связи, что, как я полагаю, не совсем то, что вам нужно.