调试netconsole的使用
开发环境客户端
开发板:FireFlyRK3399
Linux4。4
IP:192。168。137。110服务端
VMwareWorkstationPro16,ubuntu18。04
IP:192。168。137。100
MAC:00:0c:29:c1:9c:ednetconsole简介
netconsole模块可以让printk信息(输出到控制台的信息)通过网络(UDP)发送到远程主机。
与串口控制台不同,netconsole不需要串口线和串口。另外,它可以轻易地将多台服务器的内核信息收集到一台服务器上。
当设备上串口无法使用时,使用netconsole将日志信息保存到远程主机更方便、可行。netconsole模块不能用于获取crashdump,也不能进行一般的控制台输入输出。
netconsole模块不能获得网络相关的kernelpanic,以及与操作系统启动到网络和netconsole模块启动之间发生的pnic相关的内核信息。netconsole编译
netconsole可以独立编译为模块手动加载,也可以编译进内核自动加载,本例使用的是第一种。编译为独立模块
netconsole默认是没有编译进内核,需要手动编译到内核或编译成模块。
在内核目录下执行makemenuconfig开启以下选项DeviceDriversNetworkdevicesupportNetworkconsoleloggingsupport
将内核重新编译后烧写到开发板上。
手动编译netconsole模块makeCONFIGNETCONSOLEmChomezhongyicoderk3399linuxreleasev2。5。120210301kernelMhomezhongyicoderk3399linuxreleasev2。5。120210301kerneldriversnetmodulesCROSSCOMPILEhomezhongyicoderk3399linuxreleasev2。5。120210301prebuiltsgcclinuxx86aarch64gcclinaro6。3。12017。05x8664aarch64linuxgnubinaarch64linuxgnu
之后,就会在模块目录下生成netconsole。ko的文件,这个文件就是我们所需的。将netconsole编译进内核
如自定义内核启用netconsole只需将以下内核选项打开即可(编译为模块)。CONFIGNETCONSOLEmCONFIGNETCONSOLEDYNAMICy
如果将netconsole编译进内核自动加载,则需要在内核启动参数中传递进去,并且还要确保网卡驱动在netconsole驱动前加载。netconsole加载
将netconsole。ko通过共享目录发送到开发板,给予权限,这个需要预先知道服务端的IP地址以及MAC地址。
日志服务器在同一内网,直接通过ping获取服务器目的MAC:pingc1192。168。1。103devnullarpn192。168。1。103AddressHWtypeHWaddressFlagsMaskIface192。168。1。103ether08:00:46:d4:1d:82Ceth01234
日志服务器不在同一内网,获取网关目的MAC:netstatrngrep0。0。0。00。0。0。0192。168。1。10。0。0。0UG000eth0pingc1192。168。1。1devnullarpn192。168。1。1AddressHWtypeHWaddressFlagsMaskIface192。168。1。1ether00:0f:66:5b:2a:3cC
执行加载指令insmodnetconsole。konetconsole6665192。168。137。110eth0,514192。168。137。10000:0c:29:c1:9c:ed
各个参数含义如下netconsolesrcport〕〔srcip〕〔〕,〔tgtport〕〔tgtmacaddr〕wheresrcportsourceforUDPpackets(defaultsto6665)开发板上的端口,省略的话默认为6665srcipsourceIPtouse(interfaceaddress)开发板上的IP地址devnetworkinterface(eth0)开发板上使用的网卡设备名tgtportportforloggingagent(6666)目的机器的端口,省略的话默认为6666tgtipIPaddressforloggingagent目的机器的IP地址tgtmacaddrethernetMACaddressforloggingagent(broadcast)目的机器的MAC地址rsyslog服务端设置开启514端口
客户端设置好了,配置rsyslog以在服务器模式下运行sudovimetcrsyslog。conf
取消注释udp和tcp端口绑定的行:providesUDPsyslogreceptionmodule(loadimudp)input(typeimudpport514)providesTCPsyslogreceptionmodule(loadimtcp)input(typeimtcpport514)
测试端口是否能通sudoncvuz192。168。137。110514Connectionto192。168。137。110514port〔udpsyslog〕succeeded!创建接收模板
创建一个模板,指示rsyslog服务器如何存储传入的syslog消息,在GLOBALDIRECTIVES部分之前添加模板:templateremoteincominglogs,varlogHOSTNAMEfromhostipYEARMONTHDAY。log。?remoteincominglogs
收到的日志将使用上面的模板进行解析并存储在目录varlog中,文件命名遵循约定:HOSTNAMEfromhostipYEARMONTHDAY。log。
日志接收模板参数的含义可参考:https:www。dandelioncloud。cnarticledetails1517852831246839810
完成后保存并关闭文件。然后,使用以下命令检查Rsyslog配置是否存在语法错误:rsyslogdfetcrsyslog。confN1
你应该看到以下输出:rsyslogd:version8。32。0,configvalidationrun(level1),masterconfigetcrsyslog。confrsyslogd:Endofconfigvalidationrun。Bye。配置启动文件
以root身份修改etcdefaultrsyslog启动配置文件RSYSLOGDOPTIONSm0rr选项以允许接受外来日志消息。x禁用掉dns记录项不够齐全或其他的日志中心的日志。m修改syslog的内部mark消息写入间隔时间(0为关闭)。例如m180,表示每隔180分钟(每天8次)在日志文件里增加一行时间戳消息。h默认情况下,syslog不会发送从远端接受过来的消息到其他主机,而使用该选项,则把该开关打开,所有接受到的信息都可根据syslog。conf中定义的主机转发过去。重启服务
重新启动rsyslog服务以使更改生效:sudosystemctlrestartrsyslog
确认服务是否正在侦听已配置的端口:sstunelpgrep514udpUNCONN000。0。0。0:5140。0。0。0:ino:178435sk:2cudpUNCONN00〔::〕:514〔::〕:ino:178436sk:2dv6only:1tcpLISTEN0250。0。0。0:5140。0。0。0:ino:178439sk:2etcpLISTEN025〔::〕:514〔::〕:ino:178440sk:2fv6only:1配置Rsyslog防火墙
如果你的ufw防火墙服务正在运行,请允许rsyslog防火墙端口:sudoufwallow514tcpsudoufwallow514udp输出测试
测试使用的是SysRq键在客户端输出内核信息。
在开发板上,修改etcsysctl。conf启动SysRq。kernel。sysrq1
执行下列命令,使修改生效。sysctlp
执行下列命令向控制台输出内核信息。rootfirefly:mntmoduleechohprocsysrqtrigger〔10224。626165〕sysrq:SysRq:HELP:loglevel(09)reboot(b)crash(c)terminatealltasks(e)memoryfulloomkill(f)killalltasks(i)thawfilesystems(j)sak(k)showbacktraceallactivecpus(l)showmemoryusage(m)niceallRTtasks(n)poweroff(o)showregisters(p)showalltimers(q)unraw(r)sync(s)showtaskstates(t)unmount(u)forcefb(V)showblockedtasks(w)dumpftracebuffer(z)
在服务器的varlog192。168。137。110目录下即可看到生成的日志文件。192。168。137。110cat192。168。137。11020221016。log20221016T22:35:54。77718008:00192。168。137。110〔10224。626165〕sysrq:SysRq:20221016T22:35:54。77718008:00192。168。137。110loglevel(09)20221016T22:35:54。77718008:00192。168。137。110〔10224。626165〕sysrq:SysRq:20221016T22:35:54。77718008:00192。168。137。110loglevel(09)20221016T22:35:54。77718008:00192。168。137。110reboot(b)20221016T22:35:54。77718008:00192。168。137。110crash(c)20221016T22:35:54。77718008:00192。168。137。110reboot(b)20221016T22:35:54。77718008:00192。168。137。110crash(c)20221016T22:35:54。77718008:00192。168。137。110terminatealltasks(e)20221016T22:35:54。77718008:00192。168。137。110terminatealltasks(e)20221016T22:35:54。77718008:00192。168。137。110memoryfulloomkill(f)20221016T22:35:54。77718008:00192。168。137。110memoryfulloomkill(f)20221016T22:35:54。77718008:00192。168。137。110killalltasks(i)20221016T22:35:54。77718008:00192。168。137。110killalltasks(i)20221016T22:35:54。77718008:00192。168。137。110thawfilesystems(j)20221016T22:35:54。77718008:00192。168。137。110thawfilesystems(j)20221016T22:35:54。77718008:00192。168。137。110sak(k)20221016T22:35:54。77718008:00192。168。137。110sak(k)20221016T22:35:54。77718008:00192。168。137。110showbacktraceallactivecpus(l)20221016T22:35:54。77718008:00192。168。137。110showbacktraceallactivecpus(l)20221016T22:35:54。77718008:00192。168。137。110showmemoryusage(m)20221016T22:35:54。77718008:00192。168。137。110showmemoryusage(m)20221016T22:35:54。77718008:00192。168。137。110niceallRTtasks(n)20221016T22:35:54。77718008:00192。168。137。110niceallRTtasks(n)20221016T22:35:54。77718008:00192。168。137。110poweroff(o)20221016T22:35:54。77718008:00192。168。137。110poweroff(o)20221016T22:35:54。77718008:00192。168。137。110showregisters(p)20221016T22:35:54。77718008:00192。168。137。110showregisters(p)20221016T22:35:54。77718008:00192。168。137。110showalltimers(q)20221016T22:35:54。77718008:00192。168。137。110showalltimers(q)20221016T22:35:54。77718008:00192。168。137。110unraw(r)20221016T22:35:54。77718008:00192。168。137。110unraw(r)20221016T22:35:54。77718008:00192。168。137。110sync(s)20221016T22:35:54。77718008:00192。168。137。110sync(s)20221016T22:35:54。77718008:00192。168。137。110showtaskstates(t)20221016T22:35:54。77718008:00192。168。137。110showtaskstates(t)20221016T22:35:54。77718008:00192。168。137。110unmount(u)20221016T22:35:54。77718008:00192。168。137。110unmount(u)20221016T22:35:54。77718008:00192。168。137。110forcefb(V)20221016T22:35:54。77718008:00192。168。137。110forcefb(V)20221016T22:35:54。77718008:00192。168。137。110showblockedtasks(w)20221016T22:35:54。77718008:00192。168。137。110showblockedtasks(w)20221016T22:35:54。90098908:00192。168。137。110dumpftracebuffer(z)20221016T22:35:54。90098908:00192。168。137。110dumpftracebuffer(z)20221016T22:35:54。90098908:00192。168。137。110
若进入192。168。137。110目录无权限,则执行sudochmod777192。168。137。110赋予权限。其他监听方法netcat
在没有syslogd在运行的主机上可以使用netcatsocat接收来自远程主机的消息:nculpportnculportnetcatulpportnetcatulportsocatudprecv:port
举例sudonetcatlp514u〔sudo〕passwordforzhongyi:〔263。748032〕sysrq:SysRq:HELP:〔263。748032〕sysrq:SysRq:HELP:loglevel(09)loglevel(09)reboot(b)reboot(b)crash(c)crash(c)terminatealltasks(e)terminatealltasks(e)memoryfulloomkill(f)memoryfulloomkill(f)killalltasks(i)killalltasks(i)thawfilesystems(j)thawfilesystems(j)sak(k)sak(k)showbacktraceallactivecpus(l)showbacktraceallactivecpus(l)showmemoryusage(m)showmemoryusage(m)niceallRTtasks(n)niceallRTtasks(n)poweroff(o)showregisters(p)poweroff(o)showregisters(p)showalltimers(q)showalltimers(q)unraw(r)sync(s)showtaskstates(t)unraw(r)sync(s)showtaskstates(t)unmount(u)forcefb(V)unmount(u)forcefb(V)showblockedtasks(w)showblockedtasks(w)dumpftracebuffer(z)dumpftracebuffer(z)dmesg
nconsolelevel控制kernelmessageconsole输出级别,设置输出level为debug(n8):dmesgn8uboot中的netconsole
uboot下的netconsole类似于kernel下的telnet等网络终端功能,将网络作为输入输出的终端,这样就便于我们在PC端通过网络登录设备uboot中运行命令。
uboot下netconsole的实现在driversnetnetconsole。c中,uboot开启netconsole只需要在配置文件configsfireflyrk3399defconfig加入CONFIGNETCONSOLEy即可。重新编译uboot,烧写到设备上。
设置环境变量nc,设置CONFIGNETCONSOLEBUFFERSIZE覆盖默认缓冲区大小,设置环境变量ncip为通信对端ip,格式为:,不设置时为默认值6666,发送端口和接收端口可以分别设置,ncinport和ncoutport,setenvipaddr192。168。137。110setenvncsetenvstdoutnc;setenvstdinncsetenvncip192。168。137。100saveenvrunnc
uboot进入netonsole模式,此时串口控制台就没有输出了。
在服务器上执行。toolsnetconsole192。168。137。110
就可以在PC端运行uboot命令了。本文参考
https:www。kernel。orgdochtmllatestnetworkingnetconsole。html
https:blog。csdn。netweixin44143206articledetails123598281
https:blog。csdn。netforceeaglearticledetails114670045
https:www。kernel。orgdochtmllatestnetworkingnetconsole。html
https:blog。csdn。netZhuZhu2009articledetails105120184
https:blog。csdn。netj00362articledetails50389131
http:t。zoukankan。comclnchanpinp7232687。html
https:blog。csdn。netforceeaglearticledetails114670045
https:blog。csdn。netweixin42300896articledetails119500359
https:0xzx。com201912100028405199。html
https:blog。csdn。netu014044032articledetails81462054