カーネルレベルでのprintk()関数に関する簡単な質問です。これを呼び出すと、メッセージの出力先はどこですか(i386 ArchでUbuntuを使用し、最新のカーネルをダウンロードしています)。
どこにも見つからない
誰かがprintk()関数のある種のマニュアルについて正しい方向に私を向けることができればそれは素晴らしいでしょう!
dmesg
はprintk
メッセージを表示するはずです。
printk
メッセージは、システム構成に応じてさまざまな方法で公開できるカーネルログメッセージバッファーに送られます。シェルコマンドdmesg
はそれらを表示し、syslog
デーモンによって/var/log
内のファイルにもコピーされているはずです。それらをシリアルコンソールまたはテキストモードの仮想端末に記録させることは可能ですが、私はどのように手放せなかったか覚えていません。
カーネルモジュールにいくつかのprintk()
ステートメントを入れてデバッグし、それらが出力されるときに出力をキャプチャしようとした場合、探しているのはklogd
です。 man klogd
より多くの拘束とオプション。
これは、デバッグの苦痛を和らげるためにしばらく前にコーディングしたklogd
のラッパースクリプトです。
#!/bin/bash
function bashtrap()
{
echo
echo -n "[+] stopping klogd ... "
pids=`ps aux | grep klogd | awk '{print $2}'`
for pid in $pids
do
kill SIGTERM $pid 2> /dev/null
done
echo "done"
if [ $1 ]
then
exit;
fi
}
sync
bashtrap
klogd -x -f - -n -c 8 2>&1 1 | tee klog.txt & klog_pid=$!;
echo "[+] klogd started"
echo "[+] press ctrl+c to exit ... $klog_pid"
sync
trap "bashtrap 1" SIGINT
while [ 1 ]
do
sleep 3
echo -n "."
done
ps aux | grep klogd
printk(9)
のmanページにはveryの小さな情報があります。つまり、syslogデーモンがログバッファを取得して処理できるログバッファに送信されます。ログレベルが十分に高い場合は、コンソールにも送信されます(そのビットについてはdmesg(1)
を参照)。
探す /dev/kmsg
システム上。