netconsoleを使ってみる

netconsoleは、dmesgの出力をUDPリモートホストへ送る機能。
この機能のポイントは、カーネルがpanicした後でも送信してくれる(無理かもしれないけど努力はする)という事。
panic時のbacktraceとかも取れる。

送信側の設定

netconsoleモジュールの引数か、カーネル引数でローカル・リモートのアドレス・ポートを指定。
フォーマットはnetconsole=src-port@src-ip/ifname,dst-port@dst-ip/dst-macって感じ。

$ sudo modprobe netconsole netconsole=6665@192.168.100.12/eth0,6666@192.168.100.11/04:0c:ce:xx:xx:xx

受信側の設定(OSXの場合)

syslogdで受けても良い。
今回は取り敢えず受けて表示したかっただけなので、netcatで。

$ nc -l -u 192.168.100.11 6666

なお、受け側ノードがLinuxの場合はncの引数フォーマットが異なるかも。

実験(送信側)

hogeを4回dmesgへ書いて、最後にpanicさせる。

$ su -
# echo hoge > /dev/kmsg
# echo hoge > /dev/kmsg
# echo hoge > /dev/kmsg
# echo hoge > /dev/kmsg
# echo c > /proc/sysrq-trigger

実験(受信側)

以下の様な出力が得られる。

$ nc -l -u 192.168.100.11 6666
[   26.660685] hoge
[   27.250444] hoge
[   27.722372] hoge
[   28.146850] hoge
[   37.013289] SysRq : Trigger a crash
[   37.013534] BUG: unable to handle kernel NULL pointer dereference at           (null)
[   37.013850] IP: [<ffffffff8122f454>] sysrq_handle_crash+0xd/0x16
[   37.014078] PGD 3d7f9067 PUD 374f1067 PMD 0 
[   37.014389] Oops: 0002 [#1] SMP 
[   37.014626] CPU 0 
[   37.014705] Modules linked in: netconsole configfs nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc loop btusb bluetooth rfkill crc16 coretemp crc32c_intel ghash_clmulni_intel aesni_intel joydev aes_x86_64 aes_generic parport_pc parport vmw_balloon usbhid hid psmouse cryptd pcspkr serio_raw evdev snd_ens1371 snd_ac97_codec snd_rawmidi snd_seq_device snd_pcm snd_page_alloc snd_timer snd soundcore processor ac power_supply ac97_bus container thermal_sys gameport vmwgfx ttm i2c_piix4 button drm i2c_core shpchp ext3 mbcache jbd sg sr_mod uhci_hcd cdrom sd_mod ata_generic crc_t10dif floppy ehci_hcd usbcore e1000 usb_common ata_piix libata mptspi scsi_transport_spi mptscsih mptbase scsi_mod [last unloaded: scsi_wait_scan]
[   37.020622] 
[   37.020732] Pid: 2608, comm: bash Not tainted 3.2.0-4-amd64 #1 Debian 3.2.41-2 VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform
[   37.021209] RIP: 0010:[<ffffffff8122f454>]  [<ffffffff8122f454>] sysrq_handle_crash+0xd/0x16
[   37.021460] RSP: 0018:ffff88003d72be80  EFLAGS: 00010092
[   37.021599] RAX: 0000000000000010 RBX: ffffffff8164bb90 RCX: 00000000000022ea
[   37.021752] RDX: 0000000000000000 RSI: 0000000000000046 RDI: 0000000000000063
[   37.021921] RBP: 000000000000000a R08: 0000000000000000 R09: 000000003bf10202
[   37.022094] R10: 0000000000000000 R11: ffff88003770a000 R12: 0000000000000063
[   37.022251] R13: 0000000000000246 R14: 0000000000000000 R15: 0000000000000000
[   37.022405] FS:  00007f187b50f700(0000) GS:ffff88003f600000(0000) knlGS:0000000000000000
[   37.022577] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   37.022703] CR2: 0000000000000000 CR3: 0000000037265000 CR4: 00000000000406f0
[   37.023249] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   37.023477] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[   37.023621] Process bash (pid: 2608, threadinfo ffff88003d72a000, task ffff88003731f160)
[   37.023853] Stack:
[   37.023951]  ffffffff8122f8a7 0000000000000002 0000000000000000 ffff88003d72bf58
[   37.024430]  0000000000000002 0000000000000001 ffffffff8122f96d ffff88003d72bf58
[   37.025891]  ffff88003bbfb540 ffff88003b419ec0 ffffffff8113f3c0 0000000000000002
[   37.026270] Call Trace:
[   37.026375]  [<ffffffff8122f8a7>] ? __handle_sysrq+0x94/0x128
[   37.026510]  [<ffffffff8122f96d>] ? write_sysrq_trigger+0x32/0x39
[   37.026659]  [<ffffffff8113f3c0>] ? proc_reg_write+0x78/0x91
[   37.026796]  [<ffffffff810f9e6d>] ? vfs_write+0xa2/0xe9
[   37.027153]  [<ffffffff810fa04a>] ? sys_write+0x45/0x6b
[   37.027267]  [<ffffffff81352952>] ? system_call_fastpath+0x16/0x1b
[   37.027404] Code: 00 01 8a 81 23 91 7f 81 19 d2 83 e0 8f f7 d2 83 e2 03 c1 e2 04 09 d0 88 81 23 91 7f 81 c3 c7 05 e3 86 53 00 01 00 00 00 0f ae f8 <c6> 04 25 00 00 00 00 01 c3 53 8d 5f d0 31 c0 48 c7 c7 39 00 50 
[   37.030866] RIP  [<ffffffff8122f454>] sysrq_handle_crash+0xd/0x16
[   37.031061]  RSP <ffff88003d72be80>
[   37.031152] CR2: 0000000000000000
[   37.031246] ---[ end trace 1de8fbb6f262746a ]---
[   37.031341] Kernel panic - not syncing: Fatal exception
[   37.031446] Pid: 2608, comm: bash Tainted: G      D      3.2.0-4-amd64 #1 Debian 3.2.41-2
[   37.031582] Call Trace:
[   37.031673]  [<ffffffff81347128>] ? panic+0x95/0x1a2
[   37.031773]  [<ffffffff8134e7c6>] ? oops_end+0xa9/0xb6
[   37.031880]  [<ffffffff81346a71>] ? no_context+0x1ff/0x20e
[   37.031983]  [<ffffffff8135083b>] ? do_page_fault+0x210/0x337
[   37.032093]  [<ffffffff81070c4d>] ? arch_local_irq_save+0x11/0x17
[   37.032200]  [<ffffffff8134d9a4>] ? _raw_spin_lock_irqsave+0x9/0x25
[   37.032327]  [<ffffffff810634eb>] ? up+0xb/0x34
[   37.032425]  [<ffffffff81047321>] ? console_unlock+0x1f7/0x206
[   37.032566]  [<ffffffff8134d9a4>] ? _raw_spin_lock_irqsave+0x9/0x25
[   37.032682]  [<ffffffff810477b7>] ? vprintk+0x39e/0x3d9
[   37.032809]  [<ffffffff8134df35>] ? page_fault+0x25/0x30
[   37.032918]  [<ffffffff8122f454>] ? sysrq_handle_crash+0xd/0x16
[   37.033058]  [<ffffffff8122f8a7>] ? __handle_sysrq+0x94/0x128
[   37.033164]  [<ffffffff8122f96d>] ? write_sysrq_trigger+0x32/0x39
[   37.033277]  [<ffffffff8113f3c0>] ? proc_reg_write+0x78/0x91
[   37.033382]  [<ffffffff810f9e6d>] ? vfs_write+0xa2/0xe9
[   37.033486]  [<ffffffff810fa04a>] ? sys_write+0x45/0x6b
[   37.033588]  [<ffffffff81352952>] ? system_call_fastpath+0x16/0x1b