開(kāi)發(fā)環(huán)境
客戶端
開(kāi)發(fā)板:FireFly-RK3399
Linux 4.4
IP:192.168.137.110
服務(wù)端
VMware Workstation Pro16,ubuntu 18.04
IP:192.168.137.100
MAC0cc1ed
netconsole簡(jiǎn)介
netconsole模塊可以讓printk信息(輸出到控制臺(tái)的信息)通過(guò)網(wǎng)絡(luò)(UDP)發(fā)送到遠(yuǎn)程主機(jī)。
與串口控制臺(tái)不同,netconsole不需要串口線和串口。另外,它可以輕易地將多臺(tái)服務(wù)器的內(nèi)核信息收集到一臺(tái)服務(wù)器上。
當(dāng)設(shè)備上串口無(wú)法使用時(shí),使用netconsole將日志信息保存到遠(yuǎn)程主機(jī)更方便、可行。
netconsole模塊不能用于獲取crash dump,也不能進(jìn)行一般的控制臺(tái)輸入輸出。
netconsole模塊不能獲得網(wǎng)絡(luò)相關(guān)的kernel panic,以及與操作系統(tǒng)啟動(dòng)到網(wǎng)絡(luò)和netconsole模塊啟動(dòng)之間發(fā)生的pnic相關(guān)的內(nèi)核信息。
netconsole編譯
netconsole 可以獨(dú)立編譯為模塊手動(dòng)加載,也可以編譯進(jìn)內(nèi)核自動(dòng)加載,本例使用的是第一種。
編譯為獨(dú)立模塊
netconsole默認(rèn)是沒(méi)有編譯進(jìn)內(nèi)核,需要手動(dòng)編譯到內(nèi)核或編譯成模塊。
在內(nèi)核目錄下執(zhí)行make menuconfig 開(kāi)啟以下選項(xiàng)
DeviceDrivers>Networkdevicesupport>Networkconsoleloggingsupport
將內(nèi)核重新編譯后燒寫(xiě)到開(kāi)發(fā)板上。
手動(dòng)編譯netconsole模塊
makeCONFIG_NETCONSOLE=m-C/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/kernelM=/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/kernel/drivers/netmodulesCROSS_COMPILE=/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
之后,就會(huì)在模塊目錄下生成netconsole.ko的文件,這個(gè)文件就是我們所需的。
將netconsole編譯進(jìn)內(nèi)核
如自定義內(nèi)核啟用netconsole只需將以下內(nèi)核選項(xiàng)打開(kāi)即可(編譯為模塊).
CONFIG_NETCONSOLE=m CONFIG_NETCONSOLE_DYNAMIC=y
如果將netconsole編譯進(jìn)內(nèi)核自動(dòng)加載,則需要在內(nèi)核啟動(dòng)參數(shù)中傳遞進(jìn)去,并且還要確保網(wǎng)卡驅(qū)動(dòng)在netconsole驅(qū)動(dòng)前加載。
netconsole加載
將netconsole.ko通過(guò)共享目錄發(fā)送到開(kāi)發(fā)板,給予權(quán)限,這個(gè)需要預(yù)先知道服務(wù)端的IP地址以及MAC地址。
日志服務(wù)器在同一內(nèi)網(wǎng), 直接通過(guò)ping獲取服務(wù)器目的MAC:
$ping-c1192.168.1.103>/dev/null $arp-n192.168.1.103 AddressHWtypeHWaddressFlagsMaskIface 192.168.1.103ether08461d:82Ceth0 1234
日志服務(wù)器不在同一內(nèi)網(wǎng), 獲取網(wǎng)關(guān)目的MAC:
$netstat-rn|grep^0.0.0.0 0.0.0.0192.168.1.10.0.0.0UG000eth0 $ping-c1192.168.1.1>/dev/null $arp-n192.168.1.1 AddressHWtypeHWaddressFlagsMaskIface 192.168.1.1ether00662a:3cC
執(zhí)行加載指令
insmodnetconsole.konetconsole=6665@192.168.137.110/eth0,514@192.168.137.100/00299c:ed
各個(gè)參數(shù)含義如下
netconsole=src-port]@[src-ip]/[],[tgt-port]@/[tgt-macaddr] wheresrc-portsourceforUDPpackets(defaultsto6665)#開(kāi)發(fā)板上的端口,省略的話默認(rèn)為6665 src-ipsourceIPtouse(interfaceaddress)#開(kāi)發(fā)板上的IP地址 devnetworkinterface(eth0)#開(kāi)發(fā)板上使用的網(wǎng)卡設(shè)備名 tgt-portportforloggingagent(6666)#目的機(jī)器的端口,省略的話默認(rèn)為6666 tgt-ipIPaddressforloggingagent#目的機(jī)器的IP地址 tgt-macaddrethernetMACaddressforloggingagent(broadcast)#目的機(jī)器的MAC地址
rsyslog服務(wù)端設(shè)置
開(kāi)啟514端口
客戶端設(shè)置好了,配置rsyslog以在服務(wù)器模式下運(yùn)行
sudovim/etc/rsyslog.conf
取消注釋udp和tcp端口綁定的行:
#providesUDPsyslogreception module(load="imudp") input(type="imudp"port="514") #providesTCPsyslogreception module(load="imtcp") input(type="imtcp"port="514")
測(cè)試端口是否能通
?~sudonc-vuz192.168.137.110514 Connectionto192.168.137.110514port[udp/syslog]succeeded!
創(chuàng)建接收模板
創(chuàng)建一個(gè)模板,指示rsyslog服務(wù)器如何存儲(chǔ)傳入的syslog消息,在GLOBAL DIRECTIVES部分之前添加模板:
$templateremote-incoming-logs,"/var/log/%HOSTNAME%/%fromhost-ip%-%$YEAR%-%$MONTH%-%$DAY%.log *.*?remote-incoming-logs &~
收到的日志將使用上面的模板進(jìn)行解析并存儲(chǔ)在目錄/var/log/中,文件命名遵循約定:%HOSTNAME%/%fromhost-ip%-%$YEAR%-%$MONTH%-%$DAY%.log。
完成后保存并關(guān)閉文件。然后,使用以下命令檢查Rsyslog配置是否存在語(yǔ)法錯(cuò)誤:
rsyslogd-f/etc/rsyslog.conf-N1
你應(yīng)該看到以下輸出:
rsyslogd:version8.32.0,configvalidationrun(level1),masterconfig/etc/rsyslog.conf rsyslogd:Endofconfigvalidationrun.Bye.
配置啟動(dòng)文件
以root身份修改/etc/default/rsyslog啟動(dòng)配置文件
RSYSLOGD_OPTIONS="-m0-r"
-r 選項(xiàng)以允許接受外來(lái)日志消息。
-x 禁用掉dns記錄項(xiàng)不夠齊全或其他的日志中心的日志。
-m 修改syslog的內(nèi)部mark消息寫(xiě)入間隔時(shí)間(0為關(guān)閉)。例如-m 180,表示每隔180分鐘(每天8次)在日志文件里增加一行時(shí)間戳消息。
-h 默認(rèn)情況下,syslog不會(huì)發(fā)送從遠(yuǎn)端接受過(guò)來(lái)的消息到其他主機(jī),而使用該選項(xiàng),則把該開(kāi)關(guān)打開(kāi),所有接受到的信息都可根據(jù)syslog.conf中定義的@主機(jī)轉(zhuǎn)發(fā)過(guò)去。
重啟服務(wù)
重新啟動(dòng)rsyslog服務(wù)以使更改生效:
sudosystemctlrestartrsyslog
確認(rèn)服務(wù)是否正在偵聽(tīng)已配置的端口:
ss-tunelp|grep514 udpUNCONN000.0.0.0:5140.0.0.0:*ino:178435sk:2c<-> udpUNCONN00[::]:514[::]:*ino:178436sk:2dv6only:1<-> tcpLISTEN0250.0.0.0:5140.0.0.0:*ino:178439sk:2e<-> tcpLISTEN025[::]:514[::]:*ino:178440sk:2fv6only:1<->
配置Rsyslog防火墻
如果你的ufw防火墻服務(wù)正在運(yùn)行,請(qǐng)?jiān)试Srsyslog防火墻端口:
sudoufwallow514/tcp sudoufwallow514/udp
輸出測(cè)試
測(cè)試使用的是SysRq鍵在客戶端輸出內(nèi)核信息。
在開(kāi)發(fā)板上,修改/etc/sysctl.conf啟動(dòng)SysRq。
kernel.sysrq=1
執(zhí)行下列命令,使修改生效。
sysctl-p
執(zhí)行下列命令向控制臺(tái)輸出內(nèi)核信息。
root@firefly:~/mnt/module#echoh>/proc/sysrq-trigger [10224.626165]sysrq:SysRq:HELP:loglevel(0-9)reboot(b)crash(c)terminate-all-tasks(e)memory-full-oom-kill(f)kill-all-tasks(i)thaw-filesystems(j)sak(k)show-backtrace-all-active-cpus(l)show-memory-usage(m)nice-all-RT-tasks(n)poweroff(o)show-registers(p)show-all-timers(q)unraw(r)sync(s)show-task-states(t)unmount(u)force-fb(V)show-blocked-tasks(w)dump-ftrace-buffer(z)
在服務(wù)器的/var/log/192.168.137.110目錄下即可看到生成的日志文件。
?192.168.137.110cat192.168.137.110-2022-10-16.log 2022-10-16T2254.777180+08:00192.168.137.110[10224.626165]sysrq:SysRq: 2022-10-16T2254.777180+08:00192.168.137.110loglevel(0-9) 2022-10-16T2254.777180+08:00192.168.137.110[10224.626165]sysrq:SysRq: 2022-10-16T2254.777180+08:00192.168.137.110loglevel(0-9) 2022-10-16T2254.777180+08:00192.168.137.110reboot(b) 2022-10-16T2254.777180+08:00192.168.137.110crash(c) 2022-10-16T2254.777180+08:00192.168.137.110reboot(b) 2022-10-16T2254.777180+08:00192.168.137.110crash(c) 2022-10-16T2254.777180+08:00192.168.137.110terminate-all-tasks(e) 2022-10-16T2254.777180+08:00192.168.137.110terminate-all-tasks(e) 2022-10-16T2254.777180+08:00192.168.137.110memory-full-oom-kill(f) 2022-10-16T2254.777180+08:00192.168.137.110memory-full-oom-kill(f) 2022-10-16T2254.777180+08:00192.168.137.110kill-all-tasks(i) 2022-10-16T2254.777180+08:00192.168.137.110kill-all-tasks(i) 2022-10-16T2254.777180+08:00192.168.137.110thaw-filesystems(j) 2022-10-16T2254.777180+08:00192.168.137.110thaw-filesystems(j) 2022-10-16T2254.777180+08:00192.168.137.110sak(k) 2022-10-16T2254.777180+08:00192.168.137.110sak(k) 2022-10-16T2254.777180+08:00192.168.137.110show-backtrace-all-active-cpus(l) 2022-10-16T2254.777180+08:00192.168.137.110show-backtrace-all-active-cpus(l) 2022-10-16T2254.777180+08:00192.168.137.110show-memory-usage(m) 2022-10-16T2254.777180+08:00192.168.137.110show-memory-usage(m) 2022-10-16T2254.777180+08:00192.168.137.110nice-all-RT-tasks(n) 2022-10-16T2254.777180+08:00192.168.137.110nice-all-RT-tasks(n) 2022-10-16T2254.777180+08:00192.168.137.110poweroff(o) 2022-10-16T2254.777180+08:00192.168.137.110poweroff(o) 2022-10-16T2254.777180+08:00192.168.137.110show-registers(p) 2022-10-16T2254.777180+08:00192.168.137.110show-registers(p) 2022-10-16T2254.777180+08:00192.168.137.110show-all-timers(q) 2022-10-16T2254.777180+08:00192.168.137.110show-all-timers(q) 2022-10-16T2254.777180+08:00192.168.137.110unraw(r) 2022-10-16T2254.777180+08:00192.168.137.110unraw(r) 2022-10-16T2254.777180+08:00192.168.137.110sync(s) 2022-10-16T2254.777180+08:00192.168.137.110sync(s) 2022-10-16T2254.777180+08:00192.168.137.110show-task-states(t) 2022-10-16T2254.777180+08:00192.168.137.110show-task-states(t) 2022-10-16T2254.777180+08:00192.168.137.110unmount(u) 2022-10-16T2254.777180+08:00192.168.137.110unmount(u) 2022-10-16T2254.777180+08:00192.168.137.110force-fb(V) 2022-10-16T2254.777180+08:00192.168.137.110force-fb(V) 2022-10-16T2254.777180+08:00192.168.137.110show-blocked-tasks(w) 2022-10-16T2254.777180+08:00192.168.137.110show-blocked-tasks(w) 2022-10-16T2254.900989+08:00192.168.137.110dump-ftrace-buffer(z) 2022-10-16T2254.900989+08:00192.168.137.110dump-ftrace-buffer(z) 2022-10-16T2254.900989+08:00192.168.137.110
若進(jìn)入192.168.137.110目錄無(wú)權(quán)限,則執(zhí)行 sudo chmod 777 192.168.137.110 賦予權(quán)限。
其他監(jiān)聽(tīng)方法
netcat
在沒(méi)有syslogd在運(yùn)行的主機(jī)上可以使用 netcat/socat 接收來(lái)自遠(yuǎn)程主機(jī)的消息:
nc-u-l-p/nc-u-l netcat-u-l-p /netcat-u-l socatudp-recv: -
舉例
~sudonetcat-l-p514-u [sudo]passwordforzhongyi: [263.748032]sysrq:SysRq:HELP:[263.748032]sysrq:SysRq:HELP:loglevel(0-9)loglevel(0-9)reboot(b)reboot(b)crash(c)crash(c)terminate-all-tasks(e)terminate-all-tasks(e)memory-full-oom-kill(f)memory-full-oom-kill(f)kill-all-tasks(i)kill-all-tasks(i)thaw-filesystems(j)thaw-filesystems(j)sak(k)sak(k)show-backtrace-all-active-cpus(l)show-backtrace-all-active-cpus(l)show-memory-usage(m)show-memory-usage(m)nice-all-RT-tasks(n)nice-all-RT-tasks(n)poweroff(o)show-registers(p)poweroff(o)show-registers(p)show-all-timers(q)show-all-timers(q)unraw(r)sync(s)show-task-states(t)unraw(r)sync(s)show-task-states(t)unmount(u)force-fb(V)unmount(u)force-fb(V)show-blocked-tasks(w)show-blocked-tasks(w)dump-ftrace-buffer(z)dump-ftrace-buffer(z)
dmesg
-n/--console-level 控制kernel message console 輸出級(jí)別, 設(shè)置輸出level為debug(-n 8):
dmesg-n8
uboot中的netconsole
uboot下的netconsole類似于kernel下的telnet等網(wǎng)絡(luò)終端功能,將網(wǎng)絡(luò)作為輸入輸出的終端,這樣就便于我們?cè)赑C端通過(guò)網(wǎng)絡(luò)登錄設(shè)備uboot中運(yùn)行命令。
uboot下netconsole的實(shí)現(xiàn)在drivers/net/netconsole.c中,uboot開(kāi)啟netconsole只需要在配置文件configs/firefly-rk3399_defconfig加入CONFIG_NETCONSOLE=y 即可。重新編譯uboot,燒寫(xiě)到設(shè)備上。
設(shè)置環(huán)境變量nc,設(shè)置CONFIG_NETCONSOLE_BUFFER_SIZE覆蓋默認(rèn)緩沖區(qū)大小,設(shè)置環(huán)境變量ncip為通信對(duì)端ip,格式為
setenvipaddr192.168.137.110 setenvnc'setenvstdoutnc;setenvstdinnc' setenvncip192.168.137.100 saveenv runnc
uboot進(jìn)入netonsole模式,此時(shí)串口控制臺(tái)就沒(méi)有輸出了。
在服務(wù)器上執(zhí)行
./tools/netconsole192.168.137.110
就可以在PC端運(yùn)行uboot命令了。
審核編輯:劉清
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9024瀏覽量
85186 -
UDP協(xié)議
+關(guān)注
關(guān)注
0文章
69瀏覽量
12683 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28165 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21618 -
RK3399
+關(guān)注
關(guān)注
2文章
211瀏覽量
24778
原文標(biāo)題:【調(diào)試】netconsole的使用
文章出處:【微信號(hào):嵌入式與Linux那些事,微信公眾號(hào):嵌入式與Linux那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論