Lo hice y lo entendí

El blog de Vicente Navarro
08 dic

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 DriversNetwork device supportNetwork console logging support

netconsole kernel

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

Entradas relacionadas

Tema LHYLE09, creado por Vicente Navarro