星期日, 3月 25, 2007

netconsole & syslog-ng

最近我的筆電動不動就 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 傳來的訊息!

沒有留言: