Comprobando el hardware de un servidor Linux sin abrirlo: pequeñas utilidades de línea de comandos (y IV)

Para terminar esta serie de artículos sobre herramientas software para conocer el hardware de un servidor que esté en producción sin pararlo ni abrirlo, quiero dedicar este artículo a enumerar una serie de sencillas utilidades de línea de comandos que sólo hacen una tarea pero la hacen de una manera muy especializada y eficiente, lo que las convierten en realmente útiles para el administrador de sistemas.

lspci

lspci es una herramienta que lista todos los dispositivos PCI presentes en el sistema.

# lspci
00:00.0 Host bridge: Intel Corporation Device 0150 (rev 09)
00:01.0 PCI bridge: Intel Corporation Device 0151 (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Device 0162 (rev 09)
00:14.0 USB Controller: Intel Corporation Device 1e31 (rev 04)
00:16.0 Communication controller: Intel Corporation Device 1e3a (rev 04)
00:1a.0 USB Controller: Intel Corporation Device 1e2d (rev 04)
00:1c.0 PCI bridge: Intel Corporation Device 1e10 (rev c4)
00:1c.4 PCI bridge: Intel Corporation Device 1e18 (rev c4)
00:1d.0 USB Controller: Intel Corporation Device 1e26 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Device 1e4a (rev 04)
00:1f.2 SATA controller: Intel Corporation Device 1e02 (rev 04)
00:1f.3 SMBus: Intel Corporation Device 1e22 (rev 04)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 09)

Gracias a la gran cantidad de parámetros que admite, podemos controlar el nivel de detalle y la forma de presentar la información que nos devuelve lspci. Por ejemplo, -k nos indica el módulo del kernel que gestiona cada dispositivo, -t nos muestra los dispositivos en un árbol, -m saca la información en un formato fácilmente analizable por scripts y -v nos da información detallada sobre cada dispositivo (podemos poner hasta tres v para aumentar el nivel de detalle).

# lspci -k
00:00.0 Host bridge: Intel Corporation Device 0150 (rev 09)
Subsystem: ASUSTeK Computer Inc. Device 84ca
Kernel driver in use: agpgart-intel
00:01.0 PCI bridge: Intel Corporation Device 0151 (rev 09)
Kernel driver in use: pcieport
00:02.0 VGA compatible controller: Intel Corporation Device 0162 (rev 09)
Subsystem: ASUSTeK Computer Inc. Device 84ca
00:14.0 USB Controller: Intel Corporation Device 1e31 (rev 04)
Subsystem: ASUSTeK Computer Inc. Device 84ca
Kernel driver in use: xhci_hcd
00:16.0 Communication controller: Intel Corporation Device 1e3a (rev 04)
Subsystem: ASUSTeK Computer Inc. Device 84ca
...

# lspci -t
-[0000:00]-+-00.0
+-01.0-[01]--
+-02.0
+-14.0
+-16.0
+-1a.0
+-1c.0-[02]--
+-1c.4-[03]----00.0
+-1d.0
+-1f.0
+-1f.2
\-1f.3

lsusb

lsusb realiza un trabajo similar pero con el subsistema USB y los dispositivos conectados.

# lsusb
Bus 002 Device 002: ID 046d:c50e Logitech, Inc. Cordless Mouse Receiver
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

lsusb cuenta con un menor número de parámetros que modifican su salida pero son igualmente útiles. Por ejemplo, -t nos muestra los dispositivos en un árbol, -v nos da información detallada y -s y -d muestran sólo los dispositivos especificados por bus y dispositivo o por identificador de fabricante, respectivamente.

# lsusb -d 046d:c50e -v
Bus 002 Device 002: ID 046d:c50e Logitech, Inc. Cordless Mouse Receiver
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x046d Logitech, Inc.
idProduct 0xc50e Cordless Mouse Receiver
...

ethtool

ethtool sirve para mostrar o cambiar la configuración de los interfaces de red. Esta herramienta necesita de al menos un argumento para trabajar (el interfaz de red a consultar) y de parámetros que indiquen qué información requerimos.

# ethtool eth0
Settings for eth0:
Supported ports: [ MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: MII
PHYAD: 1
Transceiver: external
Auto-negotiation: on
Supports Wake-on: g
Wake-on: d
Link detected: yes

# ethtool -i eth0
driver: forcedeth
version: 0.64
firmware-version:
bus-info: 0000:00:08.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

# ethtool -S eth0
NIC statistics:
tx_bytes: 266807800
tx_zero_rexmt: 333342
tx_one_rexmt: 0
tx_many_rexmt: 0
tx_late_collision: 0
...

# ethtool -t eth0
The test result is PASS
The test extra info:
link (online/offline) 0
register (offline) 0
interrupt (offline) 0
loopback (offline) 0

dmesg

dmesg es un comando que nos muestra el contenido del registro del núcleo, lo que implica que al comienzo se encuentra toda la información relativa a la detección del hardware. Personalmente recomiendo su invocación de la siguiente manera para no mostrar las marcas de tiempo del núcleo y paginar la exhaustiva información que se nos va a mostrar en pantalla:
# dmesg -t | less
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 3.9-0.bpo.1-amd64 (debian-kernel@lists.debian.org) (gcc version 4.7.2 (Debian 4.7.2-5) ) #1 SMP Debian 3.9.6-1~bpo70+1
Command line: BOOT_IMAGE=/boot/vmlinuz-3.9-0.bpo.1-amd64
e820: BIOS-provided physical RAM map:
BIOS-e820: [mem 0x0000000000000000-0x000000000009f7ff] usable
...
NX (Execute Disable) protection: active
SMBIOS 2.3 present.
DMI: /M55S-S3, BIOS FB 01/10/2007
No AGP bridge found
...
ACPI: RSDP 00000000000f6260 00014 (v00 GBT )
ACPI: RSDT 00000000cfff3000 00038 (v01 GBT NVDAACPI 42302E31 NVDA 01010101)
...
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
forcedeth: Reverse Engineered nForce ethernet driver. Version 0.64.
ehci-pci: EHCI PCI platform driver
ACPI: PCI Interrupt Link [APCH] enabled at IRQ 21
forcedeth 0000:00:08.0: setting latency timer to 64
forcedeth 0000:00:08.0: ifname eth0
...

/proc

Para terminar el artículo, quiero hablar de /proc, que no es una herramienta en sí, sino el sistema de ficheros a través del cual se puede interactuar con el núcleo en vivo. Por tanto, podemos utilizar los comandos habituales tanto para consultar información como para modificarla al vuelo. Veamos varios ejemplos de uso de /proc para conocer el hardware del sistema.

# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
stepping : 9
microcode : 0x12
cpu MHz : 1600.000
cache size : 8192 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu de tsc msr pae cx8 apic sep cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl nonstop_tsc pni pclmulqdq est ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase smep erms
bogomips : 6800.20
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

# cat /proc/meminfo
MemTotal: 19554776 kB
MemFree: 156468 kB
Buffers: 239696 kB
Cached: 18424088 kB
SwapCached: 5088 kB
Active: 9483528 kB
Inactive: 9367064 kB
Active(anon): 152516 kB
Inactive(anon): 34384 kB
Active(file): 9331012 kB
Inactive(file): 9332680 kB
Unevictable: 20 kB
Mlocked: 20 kB
SwapTotal: 33553332 kB
SwapFree: 33537992 kB
...

# cat /proc/partitions
major minor #blocks name

2 0 4 fd0
11 0 1048575 sr0
8 0 156289847 sda
8 1 1951744 sda1
8 2 97655808 sda2
8 3 56680448 sda3

Conclusión

Existen muchas más herramientas, como free, top, uname, lsmod, fdisk, etc. La lista es sencillamente interminable. Basta con hacer una sencilla búsqueda por Internet para encontrar pequeñas joyas como las que he comentado en este artículo, consultar su manual y añadirlas a nuestra «caja de herramientas» particular.

Con esta serie de artículos espero haber facilitado un poquito el día a día a mis colegas administradores de sistemas. Espero vuestros comentarios.