sábado 5 de julio de 2008

Cómo conocer el estado del link de un interface ethernet en Linux (y en Unix)

Acostumbro a preguntar por el estado de los links de las tarjetas de red a través del comando dmesg.

Para filtrar la salida podemos recurrir a un simple grep como el siguiente:

nohost:~# dmesg | grep -i link
ACPI: PCI Interrupt Link [LPE1] (IRQs *10)
ACPI: PCI Interrupt Link [LPE2] (IRQs *10)
ACPI: PCI Interrupt Link [LPVI] (IRQs) *0, disabled.
ACPI: PCI Interrupt Link [LPUS] (IRQs *7)
ACPI: PCI Interrupt Link [LPSA] (IRQs *9)
ACPI: PCI Interrupt Link [LP1A] (IRQs) *0, disabled.
ACPI: PCI Interrupt Link [LP1B] (IRQs) *0, disabled.
ACPI: PCI Interrupt Link [LP2A] (IRQs *9)
ACPI: PCI Interrupt Link [LP2B] (IRQs) *0, disabled.
audit: initializing netlink socket (disabled)
ACPI: PCI Interrupt Link [LPUS] enabled at IRQ 7
ACPI: PCI Interrupt 0000:00:0f.2[A] -> Link [LPUS] -> GSI 7 (level, low) -> IRQ 7
e100: eth0: e100_watchdog: link up, 100Mbps, full-duplex
ADDRCONF(NETDEV_UP): eth1: link is not ready

... aunque esto traerá el estado de link de diferentes dispositivos (no sólo de red). Si queremos lo mismo para un interface determinado, tecleamos de nuevo lo de antes entubando con un nuevo grep, seguido del nombre de interface que queremos conocer.

nohost:~# dmesg | grep -i link | grep eth0
e100: eth0: e100_watchdog: link up, 100Mbps, full-duplex


He tenido que averiguar el estado de un link de una tarjeta en un firewall Stonegate y, bruto de mí, lo he hecho lanzando un arriesgado sg-reconfigure (que por supuesto después he cancelado), sin acordarme de que el SO de estos dispositivos está basado en Debian, y por lo tanto reconoce el dmesg.

dmesg es un comando muy típico en diferentes sistemas operativos *n[iu]x. Con él obtenemos varios mensajes de kernel, que en nuestro caso nos sirve para conocer más acerca de álgún dispositivo que se haya pinchado en caliente. IBM, que va a su bola, pasa del dmesg en sus AIX. Así que para estos SO, si queremos saber acerca de las tarjetas hay que tirar del comando entstat, tal como nos explican en este link.

Y de la foto, decir sólo que es de un tal zinkwazi y que la encontre en flickr.com. Me gusto tanto que no he podido evitar utilzarla para el artículo.

4 Comentarios:

Juan dijo...

Si dispones del comando, mii-tool te ahorra mirar el dmesg, pero claro, no viene en todos los Unix y GNU/Linux.

Pere Moltó Agut dijo...

Gracias por ampliarlo Juan.

Antonio dijo...

Buenos días, me ha parecido interesante tu articulo y quería preguntarte si conoces alguna forma de averiguar la relación entre cada puerto pci con cada tarjeta ethernet. Estoy investigando en la base de datos de hal (lshal) pero no está muy claro. Con mii-tool tampoco veo la información que necesito.

Las tarjetas tienen el mismo driver por lo que no puedo distinguirlas de esta manera.
Cualquier comentario será bien recibido.
Reitero mi reconocimiento a tu articulo.

Pere Moltó Agut dijo...

hola Antonio, gracias por el comentario.

El propio dmesg debería traerte la info de lo que buscas. p. ej estre fragmento

PCI: Found IRQ 11 for device 00:0c.0
eth0: RealTek RTL8139 at 0x7400, 00:05:1c:1c:76:4b, IRQ 11
eth0: Identified 8139 chip type 'RTL-8100B/8139D'

dice que tengo una pci en 00:0c.0 Efectivamente si lanzo un lspci me confirma lo que me devuelve dmesg:

nohost:~# lspci
00:00.0 Host bridge: Intel Corporation 430TX - 82439TX MTXC (rev 01)
...
00:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

Espero que te sirva