Probando la netconsole de Linux
Trabajando en la entrada Configurar Linux para permitir el acceso remoto por módem a la consola y por RAS/PPP, descubrí en el fichero Documentation/kernel-parameters.txt de las fuentes del kernel el fichero Documentation/networking/netconsole.txt que cuenta cómo configurar el kernel para poder monitorizar sus mensajes remotamente a través de una red Ethernet y usando paquetes UDP. No se puede hacer exactamente desde el primer momento del arranque como hacíamos con la consola serie, claro, sino que es únicamente a partir del punto en el que los drivers de la tarjeta de red sean cargados. Esto es porque mientras que el puerto serie es único y se puede configurar de forma muy sencilla desde el primer momento, las tarjetas de red posibles se cuentan por cientos.
It can be used either built-in or as a module. As a built-in, netconsole initializes immediately after NIC cards and will bring up the specified interface as soon as possible. While this doesn't allow capture of early kernel panics, it does capture most of the boot process.
No confundamos la netconsole de Linux con la “LAN Console” de los grandes sistemas UNIX, que es simplemente un chip independiente del sistema que redirige la salida de la consola serie típica a un pequeño servidor de telnet, por ejemplo, y que nos permite interactuar con la consola por la red pero exactamente igual que si estuviéramos conectados con cualquier tipo de terminal serie. La netconsole de Linux es más bien un netlogging o un “kernel-level network logging via UDP packets” tal y como se referían a ella cuando sacaron el primer parche que lo permitía: [patch] netconsole – log kernel messages over the network. 2.4.10.
La forma de usarla es:
It takes a string configuration parameter "netconsole" in the
following format:
netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]
where
src-port source for UDP packets (defaults to 6665)
src-ip source IP to use (interface address)
dev network interface (eth0)
tgt-port port for logging agent (6666)
tgt-ip IP address for logging agent
tgt-macaddr ethernet MAC address for logging agent (broadcast)
Examples:
linux netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc
or
insmod netconsole netconsole=@/,@10.0.0.2/
Built-in netconsole starts immediately after the TCP stack is
initialized and attempts to bring up the supplied dev at the supplied
address.
The remote host can run either 'netcat -u -l -p <port>' or syslogd.
En el kernel por defecto de Debian el netconsole viene como módulo, no integrado en el kernel:
# grep -i netconsole /boot/config-2.6.18-5-686 CONFIG_NETCONSOLE=m
Sin embargo, parece mucho más conveniente compilarlo integrado en el kernel si queremos tener bien controlado desde el principio el arranque. Para ello, podemos ir al make menuconfig e integrar la netconsole en el binario principal del kernel:
Device Drivers → Network device support → Network console logging support

Pero si arrancamos tras compilar e instalar este kernel poniendo algo como:
netconsole=4445@192.168.1.4/eth0,4444@192.168.1.3/00:12:D9:C5:50:5F
en los parámetros del kernel, por ejemplo en el /boot/grub/menu.lst:
title linux netconsole root (hd0,0) kernel /boot/vmlinuz vga=794 root=/dev/hda1 netconsole=4445@192.168.1.4/eth0,4444@192.168.1.3/00:12:D9:C5:50:5F ro initrd /boot/initrd.img savedefault
aunque vemos que la netconsole arranca, no encuentra el interfaz de red que le hemos indicado:
# dmesg | grep -i netconsole Kernel command line: vga=794 root=/dev/hda1 netconsole=4445@192.168.1.4/eth0,4444@192.168.1.3/00:12:D9:C5:50:5F ro netconsole: local port 4445 netconsole: local IP 192.168.1.4 netconsole: interface eth0 netconsole: remote port 4444 netconsole: remote IP 192.168.1.3 netconsole: remote ethernet address 00:12:D9:C5:50:5F netconsole: eth0 doesn't exist, aborting.
Esto es porque el interfaz de red está configurado como módulo. Para poder usar la netconsole desde el arranque, también tenemos que poner el driver de la tarjeta de red en el kernel, no en un módulo, y esta vez sí que funcionará:
# dmesg | egrep 'netconsole|eth0' Kernel command line: vga=794 root=/dev/hda1 netconsole=4445@192.168.1.4/eth0,4444@192.168.1.3/00:12:D9:C5:50:5F ro netconsole: local port 4445 netconsole: local IP 192.168.1.4 netconsole: interface eth0 netconsole: remote port 4444 netconsole: remote IP 192.168.1.3 eth0: VIA Rhine III at 0x1cc00, 00:40:64:eb:27:d1, IRQ 16. eth0: MII PHY found at address 1, status 0x786d advertising 05e1 Link 45e1. netconsole: device eth0 not up yet, forcing it eth0: link up, 100Mbps, full-duplex, lpa 0x45E1 netconsole: carrier detect appears untrustworthy, waiting 4 seconds netconsole: network logging started
En otro sistema, tal y como decía la documentación, con un simple netcat UDP (-u) en modo listen (-l) al puerto idicado (-p), ya podemos seguir todos los mensajes de consola remotamente:
# netcat -u -l -p 4444
Linux version 2.6.22.6-VIC (root@ordenador) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #4 SMP Sat Dec 8 17:02:33 CET 2007
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001bef0000 (usable)
BIOS-e820: 000000001bef0000 - 000000001bef3000 (ACPI NVS)
BIOS-e820: 000000001bef3000 - 000000001bf00000 (ACPI data)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved)
BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
BIOS-e820: 00000000ffff0000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
446MB LOWMEM available.
found SMP MP-table at 000f51e0
Zone PFN ranges:
DMA 0 -> 4096
Normal 4096 -> 114416
HighMem 114416 -> 114416
early_node_map[1] active PFN ranges
0: 0 -> 114416
DMI 2.3 present.
ACPI: RSDP 000F92A0, 0014 (r0 CX700 )
ACPI: RSDT 1BEF3040, 0030 (r1 CX700 AWRDACPI 30302E32 AWRD 0)
ACPI: FACP 1BEF30C0, 0084 (r2 CX700 AWRDACPI 30302E32 AWRD 0)
ACPI: DSDT 1BEF31C0, 3D9A (r1 CX700 AWRDACPI 1000 MSFT 100000E)
ACPI: FACS 1BEF0000, 0040
ACPI: MCFG 1BEF7080, 003C (r1 CX700 AWRDACPI 30302E32 AWRD 0)
ACPI: APIC 1BEF6FC0, 005A (r1 CX700 AWRDACPI 30302E32 AWRD 0)
ACPI: PM-Timer IO Port: 0x408
ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
Processor #0 6:10 APIC version 20
ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])
IOAPIC[0]: apic_id 2, version 3, address 0xfec00000, GSI 0-23
ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level)
Enabling APIC mode: Flat. Using 1 I/O APICs
Using ACPI (MADT) for SMP configuration information
Allocating PCI resources starting at 20000000 (gap: 1bf00000:c4100000)
Built 1 zonelists. Total pages: 113523
Kernel command line: vga=794 root=/dev/hda1 netconsole=4445@192.168.1.4/eth0,4444@192.168.1.3/00:12:D9:C5:50:5F ro
netconsole: local port 4445
netconsole: local IP 192.168.1.4
netconsole: interface eth0
netconsole: remote port 4444
netconsole: remote IP 192.168.1.3
netconsole: remote ethernet address 00:12:D9:C5:50:5F
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Initializing CPU#0
PID hash table entries: 2048 (order: 11, 8192 bytes)
Detected 1000.044 MHz processor.
Console: colour dummy device 80x25
[...]
Finalmente, leíamos en el netconsole.txt que también podemos recibir los mensajes de la netconsole en el syslog. Para ello, únicamente hemos de seguir las indicaciones de la entrada Configurar el syslogd para que acepte mensajes de sistemas remotos y especificar el puerto 514 como destino. Por ejemplo, en el /boot/grub/menu.lst pondríamos:
title linux netconsole root (hd0,0) kernel /boot/vmlinuz vga=794 root=/dev/hda1 netconsole=4445@192.168.1.4/eth0,514@192.168.1.3/00:12:D9:C5:50:5F ro initrd /boot/initrd.img savedefault
Y los mensajes de la consola remota comenzarán a llegarnos a syslog del sistema local:
Dec 8 19:12:14 ordenador Linux version 2.6.22.6-VIC (root@ordenador) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #4 SMP Sat Dec 8 17:02:33 CET 2007 Dec 8 19:12:14 ordenador BIOS-provided physical RAM map: Dec 8 19:12:14 ordenador BIOS-e820: 0000000000000000 - 000000000009f800 (usable) Dec 8 19:12:14 ordenador BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved) Dec 8 19:12:14 ordenador BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) Dec 8 19:12:14 ordenador BIOS-e820: 0000000000100000 - 000000001bef0000 (usable) Dec 8 19:12:14 ordenador BIOS-e820: 000000001bef0000 - 000000001bef3000 (ACPI NVS) Dec 8 19:12:14 ordenador BIOS-e820: 000000001bef3000 - 000000001bf00000 (ACPI data) Dec 8 19:12:14 ordenador BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved) Dec 8 19:12:14 ordenador BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved) Dec 8 19:12:14 ordenador BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) Dec 8 19:12:14 ordenador BIOS-e820: 00000000ffff0000 - 0000000100000000 (reserved) Dec 8 19:12:14 ordenador 0MB HIGHMEM available. Dec 8 19:12:14 ordenador 446MB LOWMEM available. Dec 8 19:12:14 ordenador found SMP MP-table at 000f51e0 Dec 8 19:12:14 ordenador Zone PFN ranges: Dec 8 19:12:14 ordenador DMA 0 -> 4096 Dec 8 19:12:14 ordenador Normal 4096 -> 114416 Dec 8 19:12:14 ordenador HighMem 114416 -> 114416 Dec 8 19:12:14 ordenador early_node_map[1] active PFN ranges Dec 8 19:12:14 ordenador 0: 0 -> 114416 Dec 8 19:12:14 ordenador DMI 2.3 present. Dec 8 19:12:14 ordenador ACPI: RSDP 000F92A0, 0014 (r0 CX700 ) Dec 8 19:12:14 ordenador ACPI: RSDT 1BEF3040, 0030 (r1 CX700 AWRDACPI 30302E32 AWRD 0) Dec 8 19:12:14 ordenador ACPI: FACP 1BEF30C0, 0084 (r2 CX700 AWRDACPI 30302E32 AWRD 0) Dec 8 19:12:14 ordenador ACPI: DSDT 1BEF31C0, 3D9A (r1 CX700 AWRDACPI 1000 MSFT 100000E) Dec 8 19:12:14 ordenador ACPI: FACS 1BEF0000, 0040 Dec 8 19:12:14 ordenador ACPI: MCFG 1BEF7080, 003C (r1 CX700 AWRDACPI 30302E32 AWRD 0) Dec 8 19:12:14 ordenador ACPI: APIC 1BEF6FC0, 005A (r1 CX700 AWRDACPI 30302E32 AWRD 0) Dec 8 19:12:14 ordenador ACPI: PM-Timer IO Port: 0x408 Dec 8 19:12:14 ordenador ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled) Dec 8 19:12:14 ordenador Processor #0 6:10 APIC version 20 Dec 8 19:12:14 ordenador ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1]) Dec 8 19:12:14 ordenador ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0]) Dec 8 19:12:14 ordenador IOAPIC[0]: apic_id 2, version 3, address 0xfec00000, GSI 0-23 Dec 8 19:12:14 ordenador ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) Dec 8 19:12:14 ordenador ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) Dec 8 19:12:14 ordenador Enabling APIC mode: Flat. Using 1 I/O APICs Dec 8 19:12:14 ordenador Using ACPI (MADT) for SMP configuration information Dec 8 19:12:14 ordenador Allocating PCI resources starting at 20000000 (gap: 1bf00000:c4100000) Dec 8 19:12:14 ordenador Built 1 zonelists. Total pages: 113523 Dec 8 19:12:14 ordenador Kernel command line: vga=794 root=/dev/hdc1 netconsole=4445@192.168.1.4/eth0,514@192.168.1.3/00:12:D9:C5:50:5F ro Dec 8 19:12:14 ordenador netconsole: local port 4445 Dec 8 19:12:14 ordenador netconsole: local IP 192.168.1.4 Dec 8 19:12:14 ordenador netconsole: interface eth0 Dec 8 19:12:14 ordenador netconsole: remote port 514 Dec 8 19:12:14 ordenador netconsole: remote IP 192.168.1.3 Dec 8 19:12:14 ordenador netconsole: remote ethernet address 00:12:D9:C5:50:5F Dec 8 19:12:14 ordenador Enabling fast FPU save and restore... done. Dec 8 19:12:14 ordenador Enabling unmasked SIMD FPU exception support... done. Dec 8 19:12:14 ordenador Initializing CPU#0 Dec 8 19:12:14 ordenador PID hash table entries: 2048 (order: 11, 8192 bytes) Dec 8 19:12:14 ordenador Detected 1000.070 MHz processor. Dec 8 19:12:14 ordenador Console: colour dummy device 80x25
:wq



