「サーバーが突然不安定になったけど、原因の手がかりをどこから探せばいいのか」
Linuxサーバーの運用で、ハードウェアやカーネルレベルの問題を調査する場面は必ず訪れます。
この記事では、Linuxの
dmesg コマンドの基本的な使い方から、-T による人間が読めるタイムスタンプ表示、-l によるログレベル指定、--follow によるリアルタイム監視、さらに journalctl -k との使い分けや、ディスク障害・OOM Killer・NIC認識の実務での調査方法まで解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・dmesg はカーネルのリングバッファからメッセージを表示するコマンド
・dmesg -T で人間が読める日時形式のタイムスタンプを表示できる
・dmesg -l err,warn でエラーと警告だけに絞り込める
・ディスク障害やOOM Killerの原因特定に欠かせない実務ツール
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
dmesgコマンドとは?カーネルのメッセージを確認する基本コマンド
dmesg(display message)コマンドは、Linuxカーネルが出力するメッセージ(カーネルリングバッファ)を表示するコマンドです。カーネルリングバッファには、以下のような情報が記録されています。
・起動時のハードウェア認識:CPU、メモリ、ディスク、NIC(ネットワークカード)などの検出結果
・デバイスドライバのロード:各デバイスドライバの初期化状況
・ハードウェアエラー:ディスクI/Oエラー、メモリエラーなどの異常
・カーネルの警告・エラー:OOM Killer(メモリ不足によるプロセス強制終了)の発動など
サーバーのトラブル調査では、まず
/var/log/messages や journalctl を確認しますが、ハードウェアレベルの問題を調べるには dmesg が不可欠です。dmesg はカーネルのバッファを直接読むため、syslogデーモンが起動する前のブート初期段階のメッセージも確認できます。dmesgの基本的な使い方
1. カーネルメッセージを全て表示する
オプションなしで実行すると、カーネルリングバッファに記録されている全メッセージが表示されます。# カーネルメッセージを全て表示する $ dmesg [ 0.000000] Linux version 5.14.0-362.24.1.el9_3.x86_64 ... [ 0.000003] BIOS-provided physical RAM map: [ 3.842156] EXT4-fs (sda1): mounted filesystem with ordered data mode. Quota mode: none. [ 4.102883] e1000: ens192 NIC Link is Up 10000 Mbps Full Duplex, Flow Control: None
2. ページャ付きで表示する(-H)
-H(human readable)オプションを付けると、出力が自動的にページャ(less 相当)で表示されます。タイムスタンプも相対時間で見やすく整形されます。# ページャ付きで見やすく表示する $ dmesg -H
q で終了です。大量のメッセージを確認するときは dmesg | less よりもこちらが便利です。3. 人間が読めるタイムスタンプで表示する(-T)
dmesg のデフォルト出力では、タイムスタンプが「起動からの経過秒数」で表示されます。# デフォルトのタイムスタンプ(起動からの経過秒数) [ 3.141592] e1000: eth0 NIC Link is Up 1000 Mbps
-T オプションを付けると、通常の日時形式で表示されます。# 人間が読める日時形式で表示する $ dmesg -T [Tue Apr 15 08:30:00 2026] e1000: eth0 NIC Link is Up 1000 Mbps
dmesg -T は最も頻繁に使うオプションです。※
-T のタイムスタンプはカーネルの起動時刻から逆算しているため、サーバーが長期間稼働している場合は数秒程度のズレが生じることがあります。厳密な時刻が必要な場合は journalctl -k を使ってください。4. 末尾のメッセージだけ表示する(tail との組み合わせ)
カーネルメッセージは数千行に及ぶことがあります。直近のメッセージだけ確認したい場合はtail と組み合わせます。# 直近20行を表示する $ dmesg -T | tail -20 [Tue Apr 15 14:22:31 2026] usb 2-1: new high-speed USB device number 3 using ehci-pci [Tue Apr 15 14:22:31 2026] usb 2-1: New USB device found, idVendor=0781, idProduct=5567 [Tue Apr 15 14:22:31 2026] usb 2-1: Product: Cruzer Blade [Tue Apr 15 14:22:31 2026] usb-storage 2-1:1.0: USB Mass Storage device detected [Tue Apr 15 14:22:32 2026] sd 6:0:0:0: [sdb] 30031872 512-byte logical blocks: (15.4 GB/14.3 GiB)
5. ログレベルを指定して絞り込む(-l)
dmesg の出力にはログレベル(優先度)があり、-l オプションでレベルを指定して絞り込むことができます。# エラーと警告だけを表示する $ dmesg -T -l err,warn # エラーだけを表示する $ dmesg -T -l err [Tue Apr 15 08:30:02 2026] sd 0:0:1:0: [sdb] Medium access timeout failure. Offlining disk! # 重大なエラー(crit以上)を表示する $ dmesg -T -l emerg,alert,crit
| レベル | 名前 | 意味 |
|---|---|---|
| 0 | emerg | システムが使用不能な状態 |
| 1 | alert | 直ちに対処が必要 |
| 2 | crit | 致命的な状態 |
| 3 | err | エラー |
| 4 | warn | 警告 |
| 5 | notice | 通常だが重要な情報 |
| 6 | info | 一般情報 |
| 7 | debug | デバッグ情報 |
err 以上(0~3)を最初に確認し、必要に応じて warn(4)まで範囲を広げるのが実務的な手順です。6. リアルタイムでカーネルメッセージを監視する(--follow)
--follow(短縮形:-w)オプションを付けると、tail -f のようにカーネルメッセージをリアルタイムで監視できます。# カーネルメッセージをリアルタイム監視する $ dmesg --follow # 日時形式+リアルタイム監視を組み合わせる $ dmesg -Tw [Tue Apr 15 14:30:00 2026] usb 2-1: USB disconnect, device number 3 [Tue Apr 15 14:30:05 2026] usb 2-1: new high-speed USB device number 4 using ehci-pci ... # エラーと警告だけをリアルタイム監視する $ dmesg -T -l err,warn --follow
Ctrl + C を押してください。7. カーネルリングバッファをクリアする(-c / -C)
-c オプションは、バッファの内容を表示した後にクリアします。-C は表示せずにクリアだけ行います。# 表示してからバッファをクリアする(root権限が必要) $ sudo dmesg -c # 表示せずにバッファをクリアする(root権限が必要) $ sudo dmesg -C
dmesg では確認できなくなります。本番サーバーでは、クリア前に必ずバックアップを取ってください。# クリア前にバックアップを取る $ dmesg -T > /tmp/dmesg_backup.txt
grepと組み合わせて特定のメッセージを検索する
dmesg の出力量は多いため、grep と組み合わせて必要な情報を絞り込むのが実務の基本です。# ディスク関連のメッセージを検索する $ dmesg -T | grep -i "sd[a-z]" # ネットワークインターフェース関連を検索する $ dmesg -T | grep -iE "eth|ens|enp" # エラーメッセージだけを検索する $ dmesg -T | grep -i "error" # メモリ関連のメッセージを検索する $ dmesg -T | grep -i "memory\|oom" # USB関連のメッセージを検索する $ dmesg -T | grep -i "usb"
-i オプションで大文字・小文字を区別しない検索にしておくと、取りこぼしを防げます。障害発生時は、エラーに関連しそうなキーワードをまとめて検索すると効率的です。
# エラー関連のキーワードを一括検索する $ dmesg -T | grep -iE "error|fail|fault|warn|timeout|unable|cannot" [Tue Apr 15 08:30:02 2026] sd 0:0:1:0: [sdb] Medium access timeout failure. Offlining disk! [Tue Apr 15 12:45:33 2026] EXT4-fs warning (device sda1): ext4_dx_add_entry:2085: Directory (ino: 131073) index full
journalctl -k との使い分け
RHEL 7 / CentOS 7 以降のsystemd環境では、journalctl -k(または journalctl --dmesg)でもカーネルメッセージを確認できます。# 今回の起動分のカーネルメッセージを表示する $ journalctl -k # 前回の起動分のカーネルメッセージを表示する $ journalctl -k -b -1 # 2回前の起動分のカーネルメッセージを表示する $ journalctl -k -b -2 # カーネルメッセージをリアルタイム監視する $ journalctl -k -f # エラー以上のカーネルメッセージだけを表示する $ journalctl -k -p err
dmesg と journalctl -k の違いは以下の通りです。・dmesg:カーネルリングバッファを直接参照する。バッファがいっぱいになると古いメッセージから消えていく。再起動すると全て消える
・journalctl -k:systemdのジャーナルに永続化されたカーネルメッセージを参照する。設定次第で過去の起動分も確認できる(
-b -1 で前回起動分、-b -2 で2回前の起動分)systemd環境では
journalctl -k の方が高機能ですが、dmesg はsystemdがない環境やレスキューモードでも使えるため、両方の使い方を覚えておくのが実務では重要です。「再起動したら直ったけど、再起動前に何が起きていたか知りたい」という場面では journalctl -k -b -1 が活きます。実務で役立つdmesgの活用パターン
8. ディスク障害の検出(I/Oエラー)
ディスクに物理的な故障や劣化が発生すると、カーネルがI/Oエラーを記録します。# ディスクのI/Oエラーを検索する $ dmesg -T | grep -i "I/O error\|medium error\|timeout\|offline" # 出力例(ディスク障害時) [Tue Apr 15 03:15:22 2026] sd 0:0:1:0: [sdb] tag#12 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [Tue Apr 15 03:15:22 2026] sd 0:0:1:0: [sdb] tag#12 Sense Key : Medium Error [current] [Tue Apr 15 03:15:22 2026] sd 0:0:1:0: [sdb] tag#12 Add. Sense: Unrecovered read error [Tue Apr 15 03:15:22 2026] blk_update_request: I/O error, dev sdb, sector 1048576 op 0x0:(READ)
Medium Error や I/O error が出力されている場合、ディスクの物理障害が疑われます。smartctl -a /dev/sdb でS.M.A.R.T.情報を確認し、早急にバックアップとディスク交換を検討してください。9. NIC(ネットワークカード)の認識確認
サーバーの初期セットアップやNICの増設時に、カーネルがネットワークインターフェースを正しく認識しているか確認できます。# NICの認識状態を確認する $ dmesg -T | grep -i "eth\|ens\|enp\|link is\|carrier" # 出力例 [Tue Apr 15 08:30:04 2026] e1000: ens192 NIC Link is Up 10000 Mbps Full Duplex, Flow Control: None [Tue Apr 15 11:22:15 2026] e1000: ens192 NIC Link is Down [Tue Apr 15 11:22:20 2026] e1000: ens192 NIC Link is Up 10000 Mbps Full Duplex, Flow Control: None
10. OOM Killer(メモリ不足によるプロセス強制終了)の検出
サーバーのメモリが不足すると、カーネルのOOM Killer(Out of Memory Killer)が自動的にプロセスを強制終了します。「プロセスが勝手に落ちた」という現象の原因がOOM Killerであるケースは非常に多いです。# OOM Killerの発動を検索する $ dmesg -T | grep -i "oom\|out of memory\|killed process" # 出力例 [Mon Apr 14 22:45:10 2026] httpd invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0 [Mon Apr 14 22:45:10 2026] Out of memory: Killed process 15234 (mysqld) total-vm:4521680kB, anon-rss:3845920kB
httpd がメモリを要求したタイミングで mysqld(MySQL)が強制終了されています。OOM Killerが発動した場合は、free -h でメモリ状況を確認し、メモリの増設やスワップの追加、メモリを大量消費しているプロセスの設定見直し(Apacheの MaxRequestWorkers など)を検討してください。11. USBデバイスの認識確認
USBメモリやUSBシリアルデバイスを接続した際に、カーネルが正しく認識しているか確認できます。# バッファをクリアしてからUSBデバイスを接続する $ sudo dmesg -C # USBデバイスを接続した後に確認する $ dmesg -T # 出力例 [Tue Apr 15 11:00:01 2026] usb 1-1: new high-speed USB device number 3 using xhci_hcd [Tue Apr 15 11:00:01 2026] usb-storage 1-1:1.0: USB Mass Storage device detected [Tue Apr 15 11:00:02 2026] sd 2:0:0:0: [sdb] 15633408 512-byte logical blocks
sdb)が表示されるので、mount コマンドでマウントする際の指定先が分かります。「dmesg: read kernel buffer failed: Operation not permitted」の対処法
一般ユーザーでdmesg を実行すると、以下のエラーが表示されることがあります。$ dmesg dmesg: read kernel buffer failed: Operation not permitted
kernel.dmesg_restrict が 1 に設定されているためです。セキュリティ上の理由から、カーネルメッセージの閲覧がroot権限に制限されています。# 現在の設定を確認する $ sysctl kernel.dmesg_restrict kernel.dmesg_restrict = 1
対処法1:sudoで実行する(推奨)
最もシンプルな方法です。$ sudo dmesg -T
対処法2:カーネルパラメータを変更する(一時的)
一時的に一般ユーザーでもdmesgを閲覧可能にする場合は、以下のコマンドを実行します。# 一時的に制限を解除する(再起動で元に戻る) $ sudo sysctl -w kernel.dmesg_restrict=0
対処法3:カーネルパラメータを永続化する
恒久的に設定する場合は、/etc/sysctl.conf または /etc/sysctl.d/ 配下に設定ファイルを作成します。# /etc/sysctl.d/99-dmesg.conf に設定を追加する $ echo "kernel.dmesg_restrict = 0" | sudo tee /etc/sysctl.d/99-dmesg.conf # 設定を即時反映する $ sudo sysctl -p /etc/sysctl.d/99-dmesg.conf
sudo で実行するのが推奨です。カーネルメッセージにはハードウェア構成やメモリレイアウトなど、攻撃者に悪用されうる情報が含まれているためです。本記事のまとめ
dmesg コマンドは、カーネルが検知したハードウェアの異常や起動時の問題を確認するための基本ツールです。障害対応の第一歩として「まず dmesg -T -l err,warn を確認する」を習慣にしてください。| やりたいこと | コマンド |
|---|---|
| カーネルメッセージを全て表示する | dmesg |
| ページャ付きで見やすく表示する | dmesg -H |
| 人間が読める日時形式で表示する | dmesg -T |
| 直近のメッセージだけ表示する | dmesg -T | tail -20 |
| エラーと警告だけを表示する | dmesg -T -l err,warn |
| リアルタイムで監視する | dmesg -Tw |
| エラーキーワードを一括検索する | dmesg -T | grep -iE "error|fail|timeout" |
| ディスクのI/Oエラーを検索する | dmesg -T | grep -i "I/O error" |
| OOM Killerの発動を検索する | dmesg -T | grep -i "oom" |
| NICのリンク状態を確認する | dmesg -T | grep -i "link is" |
| カーネルリングバッファをクリアする | sudo dmesg -C |
| 過去の起動分のカーネルメッセージを確認する | journalctl -k -b -1 |
dmesg が最初にシグナルを出します。ログファイルに記録される前の「カーネルの声」を直接聞けるのが、dmesg の最大の強みです。関連記事:
・Linuxのログファイルの種類と確認方法|/var/log配下の一覧とjournalctlの使い方
・iostatコマンドでディスクI/Oを確認する方法|%utilとawaitの読み方と高負荷時の対処も
dmesgの出力から、障害の原因を正確に読み取れますか?
dmesgはサーバー障害の調査で欠かせないコマンドですが、出力されるメッセージの意味を正しく理解するには、カーネルやハードウェアの基礎知識が必要です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:lastコマンドでログイン履歴を確認する方法|lastb・lastlogやセキュリティ調査も
- 前のページへ:LANカードの設定確認
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます