web-dev-qa-db-ja.com

printk()はどこに出力しますか?

カーネルレベルでのprintk()関数に関する簡単な質問です。これを呼び出すと、メッセージの出力先はどこですか(i386 ArchでUbuntuを使用し、最新のカーネルをダウンロードしています)。

どこにも見つからない

誰かがprintk()関数のある種のマニュアルについて正しい方向に私を向けることができればそれは素晴らしいでしょう!

29
molleman

dmesgprintkメッセージを表示するはずです。

32

printkメッセージは、システム構成に応じてさまざまな方法で公開できるカーネルログメッセージバッファーに送られます。シェルコマンドdmesgはそれらを表示し、syslogデーモンによって/var/log内のファイルにもコピーされているはずです。それらをシリアルコンソールまたはテキストモードの仮想端末に記録させることは可能ですが、私はどのように手放せなかったか覚えていません。

13
zwol

カーネルモジュールにいくつかの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
3
gsbabil

printk(9)のmanページにはveryの小さな情報があります。つまり、syslogデーモンがログバッファを取得して処理できるログバッファに送信されます。ログレベルが十分に高い場合は、コンソールにも送信されます(そのビットについてはdmesg(1)を参照)。

探す /dev/kmsgシステム上。

2
ichabod