netconsole 重定向kernel日志到远程服务器

netconsole 重定向kernel日志到远程服务器

linux netconsole 内核模块可以通过配置转发规则讲内核日志通过 udp 发送到远程服务器。通用的Linux发行版内核都已编译 netconsole 模块, 直接使用即可。

如自定义内核启用netconsole只需将以下内核选项打开即可(编译为模块).

CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=y


此文为之前的netconsole博文的更新版本.

配置

netconsole 模块加载语法

modprobe netconsole netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]

src-port 源端口
src-ip   源ip
dev      指定发送数据网卡设备
tgt-port 目的端口
tgt-ip   目的ip
tgt-macaddr 目的MAC地址,一般为当前设备网关; 统一个网关内可直接指定目的ip的MAC

日志服务器在同一内网, 直接通过ping获取服务器目的MAC:

$ ping -c 1 192.168.1.103 > /dev/null
$ arp -n 192.168.1.103
 Address                  HWtype  HWaddress           Flags Mask            Iface
 192.168.1.103            ether   08:00:46:d4:1d:82   C                     eth0

日志服务器不在同一内网, 获取网关目的MAC:

$ netstat -rn | grep ^0.0.0.0
 0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
$ ping -c 1 192.168.1.1 > /dev/null
$ arp -n 192.168.1.1
 Address                  HWtype  HWaddress           Flags Mask            Iface
 192.168.1.1              ether   00:0f:66:5b:2a:3c   C                     eth0

加载netconsole:

echo options netconsole netconsole=6666@192.168.1.102/eth0,6666@192.168.1.103/08:00:46:d4:1d:82 > /etc/modprobe.d/netconsole.conf
modprobe netconsole
or
modprobe netconsole netconsole=6666@192.168.1.102/eth0,6666@192.168.1.103/08:00:46:d4:1d:82

以下为自动化配置脚本, 用于非同网段使用。
自动获取当前默认路由网卡ip及网关ip&MAC地址加载netconsole模块脚本,只需指定syslogd服务器目的地址REMOTE_IP即可.

REMOTE_IP=1.1.1.1
DEVNAME=`ip r |grep default |cut -d' ' -f5`
REMOTE_PORT=6666
LOCAL_IP=`ifconfig $DEVNAME |grep "inet addr"|cut -f2 -d':'|cut -d' ' -f1`
LOCAL_PORT=${LOCAL_IP##*.}

VIA=`ip r |grep default |awk '{print $3}'`    
VIAHW=`ping -c 1 $VIA  > /dev/null 2>&1; /sbin/arp -an |grep $VIA | awk '{print $4}'`
modprobe netconsole netconsole=$LOCAL_PORT@$LOCAL_IP/$DEVNAME,$REMOTE_PORT@$REMOTE_IP/$VIAHW

netconsole 动态配置

netconsole 使用 configfs 接口实现动态配置, CentOS/RHEL/Fedora/Ubuntu 启动默认都已自动 mount configfs:

mount |grep configfs

如未mount, 执行以下命令:

mount -t configfs configfs /sys/kernel/config

动态配置命令:

modprobe netconsole
cd /sys/kernel/config/netconsole
# 新建一条规则
mkdir 103
cd 103
ls -l
total 0
-rw-r--r-- 1 root root 4096 Mar 11 01:17 dev_name
-rw-r--r-- 1 root root 4096 Mar 11 01:17 enabled
-rw-r--r-- 1 root root 4096 Mar 11 01:17 extended
-rw-r--r-- 1 root root 4096 Mar 11 01:17 local_ip
-r--r--r-- 1 root root 4096 Mar 11 01:17 local_mac
-rw-r--r-- 1 root root 4096 Mar 11 01:17 local_port
-rw-r--r-- 1 root root 4096 Mar 11 01:17 remote_ip
-rw-r--r-- 1 root root 4096 Mar 11 01:17 remote_mac
-rw-r--r-- 1 root root 4096 Mar 11 01:17 remote_port
# 配置与命令行参数一致
echo eth0 > dev_name
echo 6666 > local_port
echo 192.168.1.102 > local_ip
echo 192.168.1.103 > remote_ip
echo 6666 > remote_port
echo 08:00:46:d4:1d:82 > remote_mac
# 启用规则
echo 1 > enabled
# 禁用规则
echo 0 > enabled

删除规则

cd 
rmdir /sys/kernel/config/netconsole/103

取消netconsole只需卸载模块即可:

rmmod netconsole

rsyslog

/etc/rsyslog.conf 添加UDP 6666端口监听:

module(load="imudp")
input(type="imudp" port="6666")

重启rsyslog 服务:

systemctl  restart rsyslog

:
防火墙需开放6666端口.

firewall-cmd --zone=$(firewall-cmd --get-default-zone) --add-port=6666/udp --permanent

netcat

在没有syslogd在运行的主机上可以使用 netcat/socat 接收来自远程主机的消息:

nc -u -l -p <port> / nc -u -l <port>
netcat -u -l -p <port> / netcat -u -l <port>
socat udp-recv:<port> -

示例:

nc -l -u 192.168.1.103 6666 | tee ~/netconsole.log

dmesg

-n/--console-level 控制kernel message console 输出级别, 设置输出level为debug(-n 8):

dmesg -n 8

参考:
Documentation/networking/netconsole.txt

<think>嗯,用户想了解如何让kernel panic的日志显示在终端。这个问题挺有意思的,因为kernel panic发生时系统通常已经崩溃,常规的日志记录方式可能失效。我需要回忆Linux内核处理panic时的机制。 根据引用资料,kernel panic时内核会尝试记录关键信息,但记录到哪里取决于系统配置。引用[1]提到/var/log/messages可能记录堆栈跟踪,引用[4]则讨论了预留内存区域保存panic信息的方法。这说明默认情况下终端可能不会显示完整日志。 用户特别强调"显示在终端",这需要区分两种情况:系统完全崩溃前的终端输出,和系统重启后的日志查看。前者涉及内核的console配置,后者涉及日志持久化机制。 引用[3]提供的命令很有参考价值,特别是update-initramfs和update-grub,这提示我需要关注内核启动参数配置。要让panic信息实时显示在终端,关键应该是在内核启动参数中设置console输出级别和保留最后一个控制台。 用户可能遇到的情况是:发生panic时终端突然卡住,看不到任何调试信息。这通常是因为内核默认只输出到串口或第一个控制台。我需要建议用户配置多个控制台输出,特别是tty0这样的虚拟终端。 引用[4]提到的预留内存方法(kmsg_dump)虽然高级,但用户当前需求可能不需要这么复杂的方案。更简单的做法是调整log级别和console参数。不过这会产生大量内核日志,需要权衡系统性能影响。 用户身份应该是Linux系统管理员或内核开发者,遇到panic需要即时调试。ta可能正在处理服务器宕机问题,情绪比较急切。我应当给出快速验证的方法,比如直接修改grub条目进行测试。 </think>要让 kernel panic 日志直接显示在系统终端上,关键是通过内核启动参数配置控制台的日志级别和输出行为。主要方法如下: ### 🔧 核心配置方法 1. **调整内核启动参数** * 编辑 `/etc/default/grub` 文件 * 找到 `GRUB_CMDLINE_LINUX_DEFAULT` 行 * 添加或修改以下参数: ``` GRUB_CMDLINE_LINUX_DEFAULT="... console=tty0 loglevel=7 ignore_loglevel earlyprintk=vga" ``` * `console=tty0`:强制内核将消息输出到当前虚拟终端(VGA控制台) * `loglevel=7`:设置内核日志级别为 `DEBUG`(最高级别) * `ignore_loglevel`:忽略所有日志级别过滤,输出所有内核消息 * `earlyprintk=vga`:确保内核启动早期阶段的错误能输出到屏幕 2. **更新 GRUB 配置** ```bash sudo update-grub # 更新GRUB配置(Ubuntu/Debian) sudo grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/RHEL ``` 3. **启用 `kmsg` 控制台输出(可选)** 在 `/etc/rsyslog.conf` 或 `/etc/systemd/journald.conf` 中添加: ```bash kernel.printk = 7 4 1 7 # 设置控制台日志级别为DEBUG ``` 4. **重启系统生效** ```bash sudo reboot ``` --- ### 📝 验证与注意事项 1. **触发测试(慎用!)** ```bash echo c > /proc/sysrq-trigger # 模拟panic(仅限测试环境!) ``` * 此时终端应显示完整panic回溯信息 2. **持久化日志问题** * 终端显示**不保证日志持久化**,系统崩溃后信息仍可能丢失 * 需配合以下方案持久化日志: * **Kdump** :捕获崩溃时内存镜像(需预留内存) * **PStore** :将日志保存到持久存储区(需内核支持) ```bash # 检查PStore支持 grep -i pstore /proc/config.gz # 或 /boot/config-$(uname -r) ``` * **Netconsole** :通过网络发送日志到另一台主机[^4] --- ### 💡 故障排查建议 1. **检查当前控制台配置** ```bash cat /proc/cmdline | grep console # 验证启动参数 dmesg | grep "Kernel command line" # 查看实际加载参数 ``` 2. **调整帧缓冲区(适用于图形界面)** 在 `/etc/default/grub` 添加: ``` video=vesafb:off vga=normal ``` > 📌 **关键限制**:若系统在初始化控制台前发生panic(如硬件故障),日志仍无法显示[^1]。此时需依赖串口控制台(serial console)或专用硬件调试器。 --- ### 📚 相关问题 1. **如何配置串口控制台接收 kernel panic 日志?** 2. **Kdump 和 PStore 在捕获 panic 日志时有何区别?** 3. **系统启动早期发生 panic 该如何捕获日志?** 4. **如何解析 kernel panic 日志中的堆栈回溯信息?** 5. **在生产环境中安全测试 kernel panic 的方法有哪些?** > [^1]: 内核 panic 时记录能力取决于系统状态 > [^2]: 定位 panic 需首先获取有效日志 > [^3]: 系统启动参数校验至关重要 > [^4]: 持久化存储需特殊机制(如预留内存)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值