最近我的筆電動不動就 kernel panic,也不知道到底出了什麼問題。想看 backtrace 也不行,因為總是在 X 底下死掉,沒有 console 讓我看 log。而 kernel panic 的時候 print 出來那些東西,也不會跑進 syslog 裡。所以啦,只好讓他 log 到 remote 了...
其實,在 Gentoo 要用 netconsole 是很簡單的。因為是 "NET"console,所以當然會有一台 client 一台 server。首先假設我們的環境看起來像這樣:
- Server:192.168.1.1:6667
- Client:192.168.1.99:6665
Client 端(Kernel module 與 cancd)
首先在 client 上,編譯核心的時候,選擇 netconsole 模組(記得選 M 唷!):
Device Drivers --->
Network device support --->
<M> Network console logging support (EXPERIMENTAL)
[*] Netpoll support for trapping incoming packets
[*] Netpoll traffic trapping
好啦,雖然我不知道最下面兩個是幹嘛的,不過還是把他們打開吧(反正打開也不用錢...)!順便打開 Magic SysRq:
Kernel hacking --->
[*] Magic SysRq key
編譯並安裝,請把 {N} 替換為您的 cpu core 數量 +1:
# make modules -j{N} && make modules_install
然後,裝上 cancd(CA NetConsole Daemon)...
# emerge cancd -va
設定 /etc/conf.d/netconsole:
# 填入 Server 的 IP,這裡以 192.168.1.1 為例:
TGT_IP='192.168.1.1'
# 與該 IP 對應的 device
DEVICE=eth0
# 如果沒寫的話,會用該 device 的第一個 IP 位置。
# 如果該設備在開機時不會拿到 IP 位置,則您必須在這裡輸入它。
SRC_IP=''
# Client 要使用的 Port,可以隨便給。以下為預設值!
SRC_PORT=6665
# Server 端的 Port,當然要與 Server 上設定的相同
TGT_PORT=6667
# 如果要使用廣播,則輸入 'broadcast'。但是要注意安全性!
# 我們不用,所以就不輸入了...
TGT_MAC=''
# 紀錄的等級,從 [0..7] 分為:
# EMERG, ALERT, CRIT, ERR, WARNING, NOTICE, INFO, DEBUG
# 恩... 我選了 7 (DEBUG)
LOGLEVEL='7'
將 netconsole 加入 default runlevel 並啟動它...
# rc-update add netconsole default
# /etc/init.d/netconsole start
「咦~」您也許會問,「就這樣丟 log 出去不會連線失敗嗎?那 Server 咧?」。別急別急,反正也不會直接有訊息丟出來(唔,如果您很倒楣的,Client 在此時 Kernel Panic 了,那我只能說很抱歉 = =),馬上接著來設定 Server!
Server 端(Syslog-ng)
編輯 /etc/syslog-ng/syslog-ng.conf,「加入」以下設定(別把上面之前的東西刪掉喔,不然本來系統的 log 就不知道要記到哪裡去了 = =):
# 首先是 ip 與 port,如果不知道要改哪裡,
# 請把 Linux 分區 format 掉,去買套 Windows Vista。
source net_src { udp(ip(192.168.1.1) port(6667)); };
# 在這裡設定紀錄檔,此以 /var/log/net_msgs 為例。
destination net_msgs { file("/var/log/net_msgs"); };
# 接著是要從哪裡紀錄到哪裡...
log { source(net_src); destination(net_msgs); };
# 如果要順便寫到 tty12,就加入以下這行:
# (一般來說都是 tty12 吧?要看之前上面的設定。)
log { source(net_src); destination(console_all); };
好啦,重新啟動 syslog-ng 吧!用 reload 他就會重新讀取設定檔了,不必用 restart。
# /etc/init.d/syslog-ng reload
測試一下!
恩... 我想,您剛才應該有把 Magic SysRq 打開吧?如果有的話,請在 Client 按下 Alt-SysRq-m,然後去 Server 看一下 /var/log/net_msgs 從 Client 傳來的訊息!