組み込み Linux (Angstrom ディストリビューション、Atmel 用) を実行しています。シャットダウン中にカーネルメッセージログを読みたいと思います.dmesgで取得するのと同じものです。基本的に、カーネルコードに printk() を挿入することでいくつかの問題を調査していますが、その出力を確認したいと思います。
システムの電源を入れたときにログが自動的に開始されず (どうすればよいですか?)、klogd コマンドで何も取得できません。
組み込み Linux (Angstrom ディストリビューション、Atmel 用) を実行しています。シャットダウン中にカーネルメッセージログを読みたいと思います.dmesgで取得するのと同じものです。基本的に、カーネルコードに printk() を挿入することでいくつかの問題を調査していますが、その出力を確認したいと思います。
システムの電源を入れたときにログが自動的に開始されず (どうすればよいですか?)、klogd コマンドで何も取得できません。
klogdの開始が遅すぎたり、停止が早すぎてメッセージが表示されない場合は、Netconsoleを試してみてください。
もちろん、組み込みボードへのネットワークアクセスがある場合。このモジュールは設定が簡単で、過去に数回使用しました。ブートプロセスの非常に早い段階/遅い段階で送信されるメッセージを表示できるようにする場合は、モジュールとしてではなく、カーネル内で(イーサネットドライバーを使用して)コンパイルする必要があることに注意してください。
また、デフォルトのログレベルを確認して、printk()を表示できるようにします(loglevel =カーネルブートパラメータ)
信頼できる RS232 シリアル コンソールは、このような状況ではおそらくあなたの味方です。
無効にするための措置を講じていない限り、カーネルログメッセージはほぼ確実にそこに到達します。
異なるディストリビューションでは、/proc/kmsg の出力を任意の物理ログ ファイルまたは仮想デバイス (/dev/xxx) にリダイレクトできます。ただし、カーネルは実際には fs/proc/kmsg.c 内でリング バッファー操作を実装しているため、「/proc/kmsg」はカーネル ログの元の最終的なソースです。
static const struct file_operations proc_kmsg_operations = {
.read = kmsg_read,
.poll = kmsg_poll,
.open = kmsg_open,
.release = kmsg_release,
.llseek = generic_file_llseek,
};
そして、ここに詳細があります:
したがって、出力は次のようになります。
sudo テール -f /proc/kmsg
また、このコマンドを発行した後に生成されたすべてのメッセージのみを表示できます。リング バッファー内の以前のメッセージはすべて出力されません。したがって、物理ファイルの出力を表示するには、「/proc/kmsg」のユーザーを検索できます。
sudo lsof |grep proc.kmsg
そして、私のマシンはこれを示しました:
rsyslogd 1743 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imuxso 1743 1755 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imklog 1743 1756 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
rs:main 1743 1757 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
これで pid 1743 になりました。1743 によって開かれたファイル fd を見てみましょう。
sudo ls -al /proc/1743/fd
lrwx------ 1 root root 64 Dec 11 08:36 0 -> socket:[14472]
l-wx------ 1 root root 64 Dec 11 08:36 1 -> /var/log/syslog
l-wx------ 1 root root 64 Dec 11 08:36 2 -> /var/log/kern.log
lr-x------ 1 root root 64 Dec 11 08:36 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 11 08:36 4 -> /var/log/auth.log
pid 1743 は rsyslogd であり、/proc/kmsg の出力を /var/log/syslog や /var/log/kern.log などのファイルにリダイレクトします。