netconsole is like syslog where it sends messages to a remote a system for analysis. syslog sends logs (/var/log/messages & syslog & journalctl). Where as netconsole sends the dmesg output, its literally like having a console cable connected to the system (except you cant send commands back).

If you have to enable netconsole while the system is running, you will not be able to send netconsole messages while the system is booting, in that case either configure netconsole on boot – or better yet have serial cable/console cable to capture the output

SENDER (where netconsole is installed)

First you need to make sure your kernel is compiled with the netconsole module

Verify like this (this also shows you the usage):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# modinfo netconsole
filename: kernel/drivers/net/netconsole.ko
license: GPL
author: Maintainer: Matt Mackall <mpm@selenic.com>
description: Console driver for network interfaces
depends:
vermagic: 3.0.101.RNx86_64.3 SMP mod_unload modversions
parm: netconsole: netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@/[tgt-macaddr]
root@log-sender:~# modinfo netconsole filename: kernel/drivers/net/netconsole.ko license: GPL author: Maintainer: Matt Mackall <mpm@selenic.com> description: Console driver for network interfaces depends: vermagic: 3.0.101.RNx86_64.3 SMP mod_unload modversions parm: netconsole: netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@/[tgt-macaddr]
root@log-sender:~# modinfo netconsole
filename: kernel/drivers/net/netconsole.ko
license: GPL
author: Maintainer: Matt Mackall <mpm@selenic.com>
description: Console driver for network interfaces
depends:
vermagic: 3.0.101.RNx86_64.3 SMP mod_unload modversions
parm: netconsole: netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@/[tgt-macaddr]

To setup netconsole to send you can do this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122/00:50:43:f8:54:ee
root@log-sender:~# modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122/00:50:43:f8:54:ee
root@log-sender:~# modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122/00:50:43:f8:54:ee

Or you can leave out the target MAC address, however you need to leave the trailing slash:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122
root@log-sender:~# modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122
root@log-sender:~# modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122

You can also leave out everything except the target IP address, this will default to source port 6665 and destination port 6666:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# modprobe netconsole netconsole=@/,@10.200.101.122/
root@log-sender:~# modprobe netconsole netconsole=@/,@10.200.101.122/
root@log-sender:~# modprobe netconsole netconsole=@/,@10.200.101.122/

You can see the configuration in the kernel log, letting you know that netconsole has been successfully loaded:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# dmesg | tail
netconsole: local port 6666
netconsole: local IP 10.200.101.117
netconsole: interface 'eth0'
netconsole: remote port 6666
netconsole: remote IP 10.200.101.122
netconsole: remote ethernet address 00:50:43:f8:54:ee
console [netcon0] enabled
netconsole: network logging started
root@log-sender:~# dmesg | tail netconsole: local port 6666 netconsole: local IP 10.200.101.117 netconsole: interface 'eth0' netconsole: remote port 6666 netconsole: remote IP 10.200.101.122 netconsole: remote ethernet address 00:50:43:f8:54:ee console [netcon0] enabled netconsole: network logging started
root@log-sender:~# dmesg | tail
netconsole: local port 6666
netconsole: local IP 10.200.101.117
netconsole: interface 'eth0'
netconsole: remote port 6666
netconsole: remote IP 10.200.101.122
netconsole: remote ethernet address 00:50:43:f8:54:ee
console [netcon0] enabled
netconsole: network logging started

Finally you need to instruct the kernel to output the log messages to a console:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# dmesg -E
root@log-sender:~# dmesg -E
root@log-sender:~# dmesg -E

Then instruct the kernel to output debug log level messages (all of the messages) to the console (which goes out to netconsole and to our target):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# dmesg –n debug
root@log-sender:~# dmesg –n debug
root@log-sender:~# dmesg –n debug

netconsole has now successfully been setup on the source system.

RECEIVER

You will need to setup a receiving/listening system.  The easiest way to do this is with netcat.

This is available as an installable package on linux systems.

You will need to run netcat in a loop, as it will exit after each line that ends. CTRL+Z to suspend the process and kill %%  to end it.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-receiver:~# while [ 0 ]; do nc -l -u -p 6666; done
root@log-receiver:~# while [ 0 ]; do nc -l -u -p 6666; done
root@log-receiver:~# while [ 0 ]; do nc -l -u -p 6666; done

NOTE: just doing nc -l -i -p 6666  might be good enough

Kernel logs should now be printed out to the receiveing console. You can test this by sending a test message to dmesg (/dev/kmsg):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@log-sender:~# echo "Testing netconsole…" > /dev/kmsg
root@log-receiver:~# while [ 0 ]; do nc -l -u -p 6666; done
Testing netconsole...
root@log-sender:~# echo "Testing netconsole…" > /dev/kmsg root@log-receiver:~# while [ 0 ]; do nc -l -u -p 6666; done Testing netconsole...
root@log-sender:~# echo "Testing netconsole…" > /dev/kmsg
root@log-receiver:~# while [ 0 ]; do nc -l -u -p 6666; done
Testing netconsole...

NOTE: you will also see “Testing netconsole…” in dmesg output and in your regular log output (such as /var/log/kernel and /var/log/syslog and journalctl). echoing to /dev/kmsg is similar to your using logger “test message to syslog” to send test messages to syslog.

On Windows as a receiver (the nmap software comes with ncat installed):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
C:\Users\> cd c:\program files (x86)\nmap
C:\Program Files (x86)\Nmap>ncat -l 6666 --keep-open
C:\Users\> cd c:\program files (x86)\nmap C:\Program Files (x86)\Nmap>ncat -l 6666 --keep-open
C:\Users\> cd c:\program files (x86)\nmap
C:\Program Files (x86)\Nmap>ncat -l 6666 --keep-open

MORE INFORMATION

Linux kernel documentation: https://www.kernel.org/doc/Documentation/networking/netconsole.txt

Arch Linux wiki guide: https://wiki.archlinux.org/index.php/Netconsole

Ubuntu Linux wiki guide: https://wiki.ubuntu.com/Kernel/Netconsole

SuSE Linux community article: https://www.suse.com/communities/conversations/netconsole-howto-send-kernel-boot-messages-over-ethernet/

Sidenote: configuring netconsole while its running

from arch linux article:

# set log level for kernel messages
dmesg -n 8

modprobe configfs
modprobe netconsole
mount none -t configfs /sys/kernel/config

# 'netconsole' dir is auto created if the module is loaded 
mkdir /sys/kernel/config/netconsole/target1
cd /sys/kernel/config/netconsole/target1

# set local IP address
echo 192.168.0.111 > local_ip
# set destination IP address
echo 192.168.0.17 > remote_ip
# set local network device name (find it trough ifconfig, examples: eth0, eno1, wlan0)
echo eno1 > dev_name
# find destination MAC address
arping $(cat remote_ip) -f | grep -o ..:..:..:..:..:.. > remote_mac

echo 1 > enabled

One thought on “Linux – netconsole module – send dmesg/console/logs to remote system

  1. Hi,

    You forgot the trailing slash you mentioned in:

    modprobe netconsole netconsole=6666@10.200.101.117/eth0,6666@10.200.101.122

    Thanks.

Leave a Reply to João M. S. Silva Cancel reply

Your email address will not be published. Required fields are marked *