Linuxでdmesgコマンドを使用する方法

  • dmesgコマンドを使用すると、Linuxリングバッファに格納されているメッセージを確認でき、ハードウェアエラーや起動時の問題を把握できます。
  • dmesgコマンドは、sudoの必要性を排除したり、カラー出力の強制、人間が読めるタイムスタンプの使用、ライブイベントの監視、最後のメッセージの取得、特定の用語の検索、ログレベルや設備カテゴリによるフィルタリングを行うことでカスタマイズできます。

dmesgコマンドを使用すると、Linuxの起動プロセスの隠された世界を覗くことができます。カーネル独自のリングバッファからハードウェアデバイスやドライバのメッセージを確認および監視し、「障害検出の友人」を活用しましょう。

Linuxのリングバッファのしくみ

LinuxやUnix系コンピュータでは、起動とスタートアップは、コンピュータの電源がオンになったときに発生するイベントシーケンスの2つの異なるフェーズです。

ブートプロセス(BIOSまたはUEFI、MBR、およびGRUB)は、システムの初期化を、カーネルがメモリにロードされ、初期ramdisk(initrdまたはinitramfs)に接続され、systemdが起動されるポイントまで実行します。

その後、スタートアッププロセスがバトンを受け取り、オペレーティングシステムの初期化を完了します。初期化の非常に初期段階では、syslogdやrsyslogdなどのロギングデーモンはまだ起動されていません。この初期化フェーズから注目すべきエラーメッセージや警告が失われないように、カーネルはリングバッファをメッセージストアとして使用します。

リングバッファは、メッセージ用に予約されたメモリ空間です。設計はシンプルで、サイズは固定されています。いっぱいになると、新しいメッセージが最も古いメッセージを上書きします。概念的には「循環バッファ」と考えることができます。

カーネルリングバッファには、デバイスドライバの初期化メッセージ、ハードウェアからのメッセージ、カーネルモジュールからのメッセージなどの情報が格納されます。これらの低レベルの起動メッセージが含まれているため、リングバッファはハードウェアエラーやその他の起動時の問題を調査するのに適した場所です。

そこで、dmesgコマンドの出番です。

dmesgコマンドとは

dmesgコマンドを使用すると、リングバッファに格納されているメッセージを確認できます。デフォルトでは、sudoを使用してdmesgを使用する必要があります。

sudo dmesg

リングバッファ内のすべてのメッセージがターミナルウィンドウに表示されます。

これは洪水でした。明らかに、必要なことはlessでパイプすることです:

sudo dmesg | less

これで、メッセージをスクロールして、興味のある項目を探すことができます。

less内の検索機能を使用して、興味のある項目や用語を見つけて強調表示することができます。lessでスラッシュキー「/」を押して検索機能を起動します。

sudoの必要性を排除する

dmesgを使用するたびにsudoを使用するのを避けたい場合は、このコマンドを使用できます。ただし、注意が必要です。コンピュータのユーザーアカウントを持つ人は誰でも、sudoを使用せずにdmesgを使用できるようになります。

sudo sysctl -w kernel.dmesg_restrict=0

カラー出力の強制

デフォルトでは、dmesgはおそらくカラー出力を生成するように構成されます。そうでない場合は、-L(カラー)オプションを使用してdmesgにその出力をカラー表示するように指示できます。

sudo dmesg -L

dmesgを常にカラー表示にデフォルトで設定するには、このコマンドを使用します:

sudo dmesg --color=always

人間が読めるタイムスタンプ

デフォルトでは、dmesgはカーネルが起動してから経過した秒とナノ秒のタイムスタンプ表記を使用します。これを人間がより理解しやすい形式でレンダリングするには、-H(人間)オプションを使用します。

sudo dmesg -H

これにより、2つのことが起こります。

  • 出力が自動的にlessに表示されます。
  • タイムスタンプには日付と時刻が記載され、分解能は分です。各分数で発生したメッセージには、その分の開始からの秒とナノ秒がラベルとして付けられます。

dmesgを使用した人間が読めるタイムスタンプ

ナノ秒の精度が必要ではなく、デフォルトよりも読みやすいタイムスタンプが必要な場合は、-T(人間が読める)オプションを使用します。(少し紛らわしいです。-Hは「人間」オプション、-Tは「人間が読める」オプションです。)

sudo dmesg -T

タイムスタンプは標準の日付と時刻としてレンダリングされますが、分解能は1分間に下げられます。

1分以内に発生したすべてのイベントは同じタイムスタンプになります。気になるのがイベントのシーケンスだけなら、これで十分です。また、コマンドプロンプトに戻されることに注意してください。このオプションはlessを自動的に呼び出しません。

dmesgを使用したライブイベントの監視

カーネルリングバッファに到着したメッセージを確認するには、--follow(メッセージを待つ)オプションを使用します。その文章は少し奇妙に思えるかもしれません。リングバッファは、起動シーケンス中に発生したイベントからのメッセージを格納するために使用される場合、コンピュータが起動して稼働したら、リングバッファにライブメッセージがどのように到着するのでしょうか?

コンピュータに接続されているハードウェアが変更されると、メッセージがカーネルリングバッファに送信されます。カーネルモジュールを更新または追加すると、それらの変更に関するリングバッファメッセージが表示されます。USBドライブを差し込んだり、Bluetoothデバイスを接続または切断したりすると、dmesgの出力にメッセージが表示されます。仮想ハードウェアでも、リングバッファに新しいメッセージが表示されます。仮想マシンを起動すると、リングバッファに新しい情報が到着します。

sudo dmesg --follow

コマンドプロンプトに戻らないことに注意してください。新しいメッセージが表示されると、dmesgによってターミナルウィンドウの下部に表示されます。

CD-ROMディスクをマウントすることさえ、変更と見なされます。これは、CD-ROMディスクの内容をディレクトリツリーに接ぎ木したためです。

リアルタイムフィードを終了するには、Ctrl+Cを押します。

最後の10個のメッセージを取得する

tailコマンドを使用して、最後の10個のカーネルリングバッファメッセージを取得します。もちろん、任意の数のメッセージを取得できます。10は単なる例です。

sudo dmesg | last -10

最後の10個のメッセージが取得され、ターミナルウィンドウに一覧表示されます。

特定の用語を検索する

dmesgからの出力をgrepにパイプして、特定の文字列やパターンを検索します。ここでは-i(大文字小文字を無視)オプションを使用しているため、一致する文字列の大文字小文字は無視されます。結果には「usb」と「USB」、およびその他の小文字と大文字の組み合わせが含まれます。

sudo dmesg | grep -i usb

強調表示された検索結果は、大文字と小文字です。

システムの最初のSCSIハードディスクsdaへの参照を含むメッセージを分離できます。(実際、sdaは今日では最初のSATAハードドライブとUSBドライブにも使用されています。)

sudo dmesg | grep -i sda

sdaが記載されているすべてのメッセージが取得され、ターミナルウィンドウに一覧表示されます。

grepで複数の用語を一度に検索するには、-E(正規表現を拡張)オプションを使用します。検索用語は、検索用語の間にパイプ「|」区切り記号が付いた引用符で囲まれた文字列内に指定する必要があります:

sudo dmesg | grep -E "memory|tty|dma"

検索用語のいずれかが記載されているメッセージはすべて、ターミナルウィンドウに一覧表示されます。

ログレベルの使用

カーネルリングバッファに記録されたすべてのメッセージにはレベルが関連付けられています。レベルは、メッセージ内の情報の重要性を表しています。レベルは次のとおりです:

  • emerg: システムが使用できません。
  • alert: すぐにアクションを起こす必要があります。
  • crit: 致命的な状況。
  • err: エラー状態。
  • warn: 警告状態。
  • notice: 通常の状態だが重要な状況。
  • info: 情報。
  • debug: デバッグレベルのメッセージ。

-l(レベル)オプションを使用して、特定のレベルに一致するメッセージをdmesgで抽出できます。また、コマンドラインパラメータとしてレベルの名前を渡します。「情報」レベルのメッセージのみを表示するには、次のコマンドを使用します:

sudo dmesg -l info

一覧表示されているメッセージはすべて、情報メッセージです。エラーや警告は含まれておらず、役立つ通知のみです。

複数のログレベルを1つのコマンドに組み合わせて、複数のログレベルのメッセージを取得します:

sudo dmesg -l debug,notice

dmesgの出力は、各ログレベルのメッセージのブレンドです:

設備カテゴリ

dmesgメッセージは、「設備」と呼ばれるカテゴリにグループ化されます。設備のリストは次のとおりです:

  • kern: カーネルメッセージ。
  • user: ユーザーレベルのメッセージ。
  • mail: メールシステム。
  • daemon: システムデーモン。
  • auth: セキュリティ/認証メッセージ。
  • syslog: 内部syslogdメッセージ。
  • lpr: 行プリンターサブシステム。
  • news: ネットワークニュースサブシステム。

特定の設備のメッセージのみを表示するようにdmesgにフィルター処理を要求できます。これを行うには、-f(設備)オプションを使用する必要があります:

sudo dmesg -f daemon

dmesgは、ターミナルウィンドウにデーモンに関連するすべてのメッセージを一覧表示します。

レベルで行ったように、dmesgに複数の設備からのメッセージを一度に一覧表示するように要求できます:

sudo dmesg -f syslog, daemon

出力は、syslogとデーモンのログメッセージが混在しています。

設備とレベルの組み合わせ

-x(デコード)オプションを使用すると、dmesgは設備とレベルを各行の先頭の人間が読めるプレフィックスとして表示します。

sudo dmesg -x

設備とレベルは、各行の先頭で確認できます:

最初にハイライトされたセクションは、「notice」レベルの「kernel」設備からのメッセージです。2番目にハイライトされたセクションは、「info」レベルの「kernel」設備からのメッセージです。

素晴らしいですが、なぜでしょうか?

一言で言えば、障害検出です。

ハードウェアが認識されない、または適切に動作しないという問題が発生している場合、dmesgがその問題を解決するヒントを提供してくれることがあります。

  • dmesgを使用して、最も高いレベルから各下のレベルまでメッセージを確認し、ハードウェアアイテムに言及しているエラーや警告、または問題に関連する可能性のあるエラーや警告を探します。
  • dmesgを使用して、適切な設備の言及を検索し、有用な情報が含まれているかどうかを確認します。
  • dmesggrepにパイプし、製品の製造元やモデル番号などの関連する文字列や識別子を探します。
  • dmesggrepにパイプし、「gpu」や「storage」などの一般的な用語、または「failure」、「failed」、または「unable」などの用語を探します。
  • --followオプションを使用して、リアルタイムでdmesgメッセージを監視します。

よい発見を祈ります。