Linux でカーネルリングバッファがアクティブかどうかを確認する方法

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Linux でカーネルリングバッファがアクティブかどうかを確認する方法を学びます。カーネルリングバッファは、システムイベントの理解やトラブルシューティングに不可欠なコンポーネントです。バッファの内容にアクセスして調べる 3 つの方法を探ります。具体的には、dmesg コマンドを使用してバッファを直接表示する方法、/proc/kmsg ファイルを介してバッファの存在と内容を確認する方法、そして journalctl を使用して systemd ジャーナルによって管理されるカーネルログを調べる方法です。これらの手順を通じて、Linux システム上のカーネルメッセージを監視および分析する実践的なスキルを身につけることができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/less("File Paging") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/cat -.-> lab-558723{{"Linux でカーネルリングバッファがアクティブかどうかを確認する方法"}} linux/less -.-> lab-558723{{"Linux でカーネルリングバッファがアクティブかどうかを確認する方法"}} linux/grep -.-> lab-558723{{"Linux でカーネルリングバッファがアクティブかどうかを確認する方法"}} end

dmesg でバッファを確認する

このステップでは、dmesg コマンドを使用してカーネルリングバッファを表示する方法を学びます。カーネルリングバッファは、Linux カーネルがハードウェア、デバイスドライバ、およびシステムイベントに関するメッセージを格納するメモリ内の特別な領域です。これらのメッセージは、トラブルシューティングやシステムの低レベルでの動作を理解するために重要です。

カーネルリングバッファをカーネルのログ帳のようなものと考えてください。デバイスが検出されたり、エラーが発生したりするなど、何か重要なことが起こると、カーネルはこのバッファにメッセージを書き込みます。dmesg はこれらのメッセージを読み取るためのツールです。

ターミナルが開いていない場合は、開きます。デスクトップの左側にある Xfce Terminal アイコンをクリックすることで開くことができます。

次に、以下のコマンドを入力して Enter キーを押します。

dmesg

ターミナルに大量の出力がスクロール表示されます。これがカーネルリングバッファの内容です。出力は次のようになる場合があります(正確な内容はシステムや稼働時間によって異なります)。

[    0.000000] Linux version 5.15.0-xx-generic (buildd@lcy02-amd64-xx) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #xx-Ubuntu SMP Tue Feb 20 15:48:58 UTC 2024
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-xx-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro console=ttyS0,115200
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
...
[   10.123456] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[   10.567890] usb 1-1: New USB device found, idVendor=xxxx, idProduct=xxxx
[   10.567890] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
...

各行の先頭にあるタイムスタンプは、システム起動後の経過時間を示しています。

出力が非常に長くなることがあるため、dmesg の出力を lessmore などのページャにパイプすることが便利です。これにより、出力をページ単位でスクロールできます。

次のコマンドを試してみてください。

dmesg | less

これで矢印キーを使って上下にスクロールでき、q を押すと less を終了できます。

また、grep を使用して dmesg の出力をフィルタリングし、特定のキーワードを検索することもできます。たとえば、USB デバイスに関連するメッセージを表示するには、次のように使用できます。

dmesg | grep -i usb

-i オプションは、検索を大文字小文字を区別しないようにします。

dmesg を使用することは、Linux でハードウェアの問題を診断し、システムの起動プロセスを理解するための基本的なスキルです。

Continue をクリックして次のステップに進みます。

/proc/kmsg でバッファを確認する

前のステップでは、dmesg コマンドを使用してカーネルリングバッファを表示しました。では、dmesg が情報を取得する場所を探ってみましょう。カーネルリングバッファは、/proc ファイルシステム内の仮想ファイルとして公開されており、具体的には /proc/kmsg にあります。

/proc ファイルシステムは、Linux の特殊なファイルシステムで、プロセスやその他のシステム情報を提供します。これはカーネルがユーザー空間のプログラムと通信する手段です。/proc 内のファイルはディスク上の実際のファイルではなく、アクセスするときにカーネルによって動的に生成されます。

/proc/kmsg ファイルには、dmesg が表示するのと同じカーネルメッセージが含まれています。ただし、/proc/kmsg から直接読み取る方法は少し異なります。dmesg は出力を処理して整形し、読みやすくしますが、/proc/kmsg を直接読み取ると生のメッセージが得られます。

cat コマンドを使用して /proc/kmsg の内容を読み取ってみましょう。

ターミナルが開いていない場合は、開きます。

次のコマンドを入力して Enter キーを押します。

cat /proc/kmsg

何らかの出力が表示されるかもしれませんが、dmesg の出力ほど読みやすくない場合があります。また、新しいメッセージがないときは /proc/kmsg の読み取りがブロックされることがあり、すでに読み取られたメッセージが表示されることもあります。

<level>message
<level>message
...

<level> の部分は、メッセージのログレベル(例:重大、エラー、警告、情報、デバッグ)を示しています。

/proc/kmsg を直接読み取ることはできますが、dmesg はカーネルリングバッファを表示するための標準的で推奨されるツールです。なぜなら、より良い整形とフィルタリングオプションを提供するからです。/proc/kmsg が情報源であることを理解することで、dmesg が内部でどのように動作するかを理解するのに役立ちます。

ほとんどの実用的な目的では、/proc/kmsg を直接読み取るのではなく、dmesg を使用します。このステップは主に、dmesg 出力の根底にある情報源を示すためのものです。

Continue をクリックして次のステップに進みましょう。次のステップでは、より最新のロギングシステムを見ていきます。

journalctl でログを調査する

前のステップでは、カーネルリングバッファについて学び、dmesg を使ってその内容を表示する方法を学びました。dmesg はカーネルメッセージを表示するのに便利ですが、最新の Linux システムでは systemd-journald と呼ばれるより包括的なロギングシステムを使用しています。journalctl コマンドは、systemd-journald のジャーナルとやり取りするための主要なツールです。

systemd-journald は、カーネル(dmesg で見たメッセージのようなもの)、システムサービス、アプリケーション、さらにはプロセスの標準出力や標準エラーなど、様々なソースからログメッセージを収集します。これらのログは構造化された索引付きの形式で保存されるため、メッセージの検索やフィルタリングが容易になります。

journalctl コマンドを調べてみましょう。

ターミナルが開いていない場合は、開きます。

次のコマンドを入力して Enter キーを押します。

journalctl

このコマンドは、systemd-journald が収集したすべてのログメッセージを表示します。dmesg と同様に、出力は非常に長くなることがあり、通常は自動的に less などのページャにパイプされます。

-- Journal begins at Tue 2024-07-23 10:00:00 UTC, ends at Tue 2024-07-23 10:30:00 UTC. --
Jul 23 10:00:01 hostname systemd[1]: Starting Network Manager...
Jul 23 10:00:02 hostname kernel: Linux version 5.15.0-xx-generic (...)
Jul 23 10:00:03 hostname systemd[1]: Started Network Manager.
Jul 23 10:00:04 hostname systemd[1]: Starting OpenSSH server daemon...
...

矢印キーを使ってスクロールし、q を押してページャを終了できます。

journalctl には、ログをフィルタリングするための多くのオプションがあります。いくつかの例を紹介します。

カーネルメッセージのみを表示するには(dmesg と同様):

journalctl -k

特定のサービスのログを表示するには、たとえば SSH サービスの場合:

journalctl -u ssh.service

特定の時刻以降のログを表示するには、たとえば「今日」以降の場合:

journalctl --since "today"

最新のログを表示し、新しいメッセージが届くたびに追跡するには(tail -f のように):

journalctl -f

Ctrl+C を押して journalctl -f コマンドを終了します。

journalctl はシステム管理とトラブルシューティングに強力なツールです。ログを一元管理し、表示やフィルタリングするための柔軟なオプションを提供します。

ターミナルで journalctl のいくつかのオプションを試して、出力にどのような影響があるかを確認してみてください。

Continue をクリックしてこの実験を完了します。

まとめ

この実験では、Linux でカーネルリングバッファがアクティブかどうかを確認する方法を学びました。まず、dmesg コマンドを使用して、ハードウェア、デバイスドライバ、およびシステムイベントに関する重要なメッセージを格納するカーネルリングバッファの内容を表示しました。dmesg がこれらのメッセージをタイムスタンプ付きで表示し、システムアクティビティの低レベルのログを提供する方法を見ました。

また、dmesg の出力は大量になることがあり、それを lessmore などのページャにパイプすることが、出力をナビゲートするための有用な手法であることも学びました。この最初のステップでは、カーネルリングバッファの内容にアクセスする主要な方法と、システム監視およびトラブルシューティングにおけるその役割を理解することを実証しました。