Mai, 2017

Kernel Loggin via UDP

Montag, Mai 8th, 2017

Wir haben das Problem, dass wir Server haben die einfach Abstürzen ohne einem Meldung im /var/log/kernel.log zu hinterlassen. Wir haben nun das Kernel Loggin Modul „netconsole“ verwendet, um die Logzeilen direkt vom Kernel via UDP verschicken zu können.

Dafür würde auf Empfänger und Sender Seite folgendes eingerichtet.

Empfänger:
Möchte man das ganze nicht Reboot fest machen und für mehrere Ports/Server einrichten kann man auch einfach den socat Befehl von Hand ausführen. Hier wird nun beschreiben wie wir einen dynamischer Systemd Service verwenden.

/etc/systemd/system/netconsole@.service

[Unit]
Description=netconsole
After=network.target remote-fs.target nss-lookup.target
PartOf=netconsole.service

[Service]
Type=simple
Environment="LANG=C"
ExecStart=/usr/bin/socat OPEN:/var/log/netconsole-%i,append udp4-listen:%i,reuseaddr,fork

Restart=always

[Install]
WantedBy=multi-user.target

/etc/systemd/system/netconsole.service

[Unit]
Description=netconsole
Wants=netconsole@10001.service netconsole@10002.service

[Service]
RemainAfterExit=yes
ExecStart=/bin/true

[Install]
WantedBy=multi-user.target

An dieser Stelle kann das der Punkt „Wants“ beliebig anpassen werden. Der Zahlen wert hinter dem @xxxx ist der übergebene Port.

Abschließend müssen das systemd noch aktiviert werden:

systemctl enable netconsole.service
systemctl start netconsole.service
systemctl status netconsole.service
● netconsole.service - netconsole
   Loaded: loaded (/etc/systemd/system/netconsole.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mo 2017-05-08 10:54:23 CEST; 4s ago
  Process: 11124 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 11124 (code=exited, status=0/SUCCESS)

Mai 08 10:54:23 server systemd[1]: Started netconsole.

Sender:
/etc/modprobe.d/netconsole.conf

options netconsole netconsole=10000@192.168.0.1/br0,10001@192.168.0.9/00:00:00:00:00

Dann kann das Kernel Modul geladen werden:

modprobe netconsole

Möchte man das ganze reboot fest machen, muss das Modul in /etc/modules eingetragen werden:

echo "netconsole" >> /etc/modules

Zum Testen erzeugt folgender Befehl einen Eintrag im Kernel log, als auch auf dem Empfänger Server:

echo h > /proc/sysrq-trigger

Update 17.05.2017: für die Verwendung von CentOS7 wurde das Script von nc auf socat umgebaut.