hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

dmesgコマンドの使い方



1 dmesgコマンドとは?

Linuxカーネル起動時、カーネルやユーザプロセスが出力するメッセージはリングバッファに保存されます。dmesgコマンドは、このリングバッファに保存されているメッセージを表示するコマンドです。このリングバッファのサイズは上限が決まっていて、サイズを超えたら先頭から上書きされるリング構造になっています。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

dmesg コマンドの版数は以下のとおりです。

[root@server ~]# dmesg -V
dmesg from util-linux 2.23.2

3 オプション一覧

オプションは以下のとおりです。

[root@server ~]# dmesg -h

Usage:
 dmesg [options]

オプション:
 -C, --clear                 clear the kernel ring buffer
 -c, --read-clear            read and clear all messages
 -D, --console-off           disable printing messages to console
 -d, --show-delta            show time delta between printed messages
 -e, --reltime               show local time and time delta in readable format
 -E, --console-on            enable printing messages to console
 -F, --file <file>           use the file instead of the kernel log buffer
 -f, --facility <list>       restrict output to defined facilities
 -H, --human                 human readable output
 -k, --kernel                display kernel messages
 -L, --color                 colorize messages
 -l, --level <list>          restrict output to defined levels
 -n, --console-level <level> set level of messages printed to console
 -P, --nopager               do not pipe output into a pager
 -r, --raw                   print the raw message buffer
 -S, --syslog                force to use syslog(2) rather than /dev/kmsg
 -s, --buffer-size <size>    buffer size to query the kernel ring buffer
 -T, --ctime                 show human readable timestamp (could be
                               inaccurate if you have used SUSPEND/RESUME)
 -t, --notime                don't print messages timestamp
 -u, --userspace             display userspace messages
 -w, --follow                wait for new messages
 -x, --decode                decode facility and level to readable string

 -h, --help     display this help and exit
 -V, --version  output version information and exit

Supported log facilities:
    kern - kernel messages
    user - random user-level messages
    mail - mail system
  daemon - system daemons
    auth - security/authorization messages
  syslog - messages generated internally by syslogd
     lpr - line printer subsystem
    news - network news subsystem

Supported log levels (priorities):
   emerg - system is unusable
   alert - action must be taken immediately
    crit - critical conditions
     err - error conditions
    warn - warning conditions
  notice - normal but significant condition
    info - informational
   debug - debug-level messages


For more details see dmesg(q).

3 基本的な使い方

オプションなしで実行すると、カーネル起動時からのメッセージが表示されます。メッセージの左端は、カーネル起動時からの相対時刻が表示されます。最後のメッセージ(e1000)は、カーネルが起動されてから、約22秒で表示されていることがわかります。

[root@server ~]# dmesg
-snip-
[   16.810965] NET: Registered protocol family 40
[   20.673855] ip6_tables: (C) 2000-2006 Netfilter Core Team
[   21.010477] Ebtables v2.0 registered
[   21.195274] Netfilter messages via NETLINK v0.30.
[   21.260242] ip_set: protocol 7
[   21.657456] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready
[   21.668697] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
-snip-

4 時刻に関するオプションの使い方

4.1 人間が読みやすいかたちで表示する方法(-T)

人間が読みやすいかたちで時刻を表示します。manによると、表示される時刻は正確ではない可能性があるようです。

[root@server ~]# dmesg -T
-snip-
[木  2月 24 19:16:26 2022] NET: Registered protocol family 40
[木  2月 24 19:16:30 2022] ip6_tables: (C) 2000-2006 Netfilter Core Team
[木  2月 24 19:16:31 2022] Ebtables v2.0 registered
[木  2月 24 19:16:31 2022] Netfilter messages via NETLINK v0.30.
[木  2月 24 19:16:31 2022] ip_set: protocol 7
[木  2月 24 19:16:31 2022] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready
[木  2月 24 19:16:31 2022] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
-snip-

4.2 メッセージ出力時刻の差分を表示する方法(-d)

メッセージと次のメッセージ出力時刻の差分を表示します。左端はカーネル起動時からの相対時刻です。2列目が、直前のメッセージとの時刻の差分を表しています。

[root@server ~]# dmesg -d
-snip-
[   16.810965 <    1.320734>] NET: Registered protocol family 40
[   20.673855 <    3.862890>] ip6_tables: (C) 2000-2006 Netfilter Core Team
[   21.010477 <    0.336622>] Ebtables v2.0 registered
[   21.195274 <    0.184797>] Netfilter messages via NETLINK v0.30.
[   21.260242 <    0.064968>] ip_set: protocol 7
[   21.657456 <    0.397214>] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready
[   21.668697 <    0.011241>] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
-snip-

4.3 時刻を表示しない方法(-t)

[root@server ~]# dmesg -t
-snip-
NET: Registered protocol family 40
ip6_tables: (C) 2000-2006 Netfilter Core Team
Ebtables v2.0 registered
Netfilter messages via NETLINK v0.30.
ip_set: protocol 7
IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready
e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
-snip-

5 メッセージの出力元、重要度別に出力する方法

メッセージは、メッセージの出力元(facility)、および重要度(Level)に分類できます。メッセージ出力元は、以下のようなものがあります。

  • メッセージ出力元
    kern - kernel messages
    user - random user-level messages
    mail - mail system
  daemon - system daemons
    auth - security/authorization messages
  syslog - messages generated internally by syslogd
     lpr - line printer subsystem
    news - network news subsystem
  • メッセージの重要度

emergが一番緊急度が高いメッセージです。

   emerg - system is unusable
   alert - action must be taken immediately
    crit - critical conditions
     err - error conditions
    warn - warning conditions
  notice - normal but significant condition
    info - informational
   debug - debug-level messages

5.1 メッセージ出力元、重要度を表示する方法(-x)

メッセージ出力元、重要度は以下のフォーマットで表示されます。

<メッセージ出力元(facility)>:<重要度(level)>

以下の実行結果では、メッセージ出力元はkern,daemon,syslogであることがわかります。また、重要度がdebug,info,notice,errのメッセージが出力されていることがわかります。

[root@server ~]# dmesg -x
-snip-
kern  :debug : [    7.426760] SELinux:  Setting up existing superblocks.
kern  :notice: [    7.442885] type=1403 audit(1645697775.556:3): policy loaded auid=4294967295 ses=4294967295
daemon:info  : [    7.465689] systemd[1]: Successfully loaded SELinux policy in 397.286ms.
kern  :info  : [    7.921225] ip_tables: (C) 2000-2006 Netfilter Core Team
daemon:info  : [    7.921670] systemd[1]: Inserted module 'ip_tables'
daemon:info  : [    7.957822] systemd[1]: Relabelled /dev, /run and /sys/fs/cgroup in 31.279ms.
syslog:info  : [    9.669316] systemd-journald[397]: Received request to flush runtime journal from PID 1
kern  :err   : [   11.131201] piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
kern  :info  : [   11.150750] vmw_vmci 0000:00:07.7: Found VMCI PCI device at 0x11080, irq 16
kern  :info  : [   11.150925] vmw_vmci 0000:00:07.7: Using capabilities 0x8000001c
-snip-

5.2 カーネルが出力するメッセージを表示する方法(-k)

"-k"は、カーネルが出力するメッセージだけを表示するオプションです。5.1と同じ範囲のログを抽出してみると、daemonやsyslogが出力するメッセージが表示されていないことがわかります。

[root@server ~]# dmesg -k
-snip
[    7.426760] SELinux:  Setting up existing superblocks.
[    7.442885] type=1403 audit(1645697775.556:3): policy loaded auid=4294967295 ses=4294967295
[    7.921225] ip_tables: (C) 2000-2006 Netfilter Core Team
[   11.131201] piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
[   11.150750] vmw_vmci 0000:00:07.7: Found VMCI PCI device at 0x11080, irq 16
[   11.150925] vmw_vmci 0000:00:07.7: Using capabilities 0x8000001c
-snip-

5.3 ユーザプロセスが出力するメッセージを表示する方法(-u)

"-u"は、ユーザプロセスが出力するメッセージだけを表示するオプションです。

[root@server ~]# dmesg -u
-snip-
[    4.590218] systemd[1]: Started Journal Service.
[    6.512113] systemd-journald[106]: Received SIGTERM from PID 1 (systemd).
[    7.465689] systemd[1]: Successfully loaded SELinux policy in 397.286ms.
[    7.921670] systemd[1]: Inserted module 'ip_tables'
[    7.957822] systemd[1]: Relabelled /dev, /run and /sys/fs/cgroup in 31.279ms.

5.4 重要度を指定する方法(-l)

"-l"は重要度を指定するオプションです。"-l"のパラメータとしてerrを指定すると、重要度がerrのメッセージだけを表示することができます。

[root@server ~]# dmesg -l err
[    5.528244] sd 2:0:0:0: [sda] Assuming drive cache: write through
[   11.131201] piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!

パラメータとしてerrとwarnを指定すると、重要度がerrとwarnのメッセージだけを表示することができます。

[root@server ~]# dmesg -l err,warn
-snip-
[    5.528244] sd 2:0:0:0: [sda] Assuming drive cache: write through
[   11.131201] piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
[  116.547524] IPv6: MLD: clamping QRV from 1 to 2!
[  241.575763] IPv6: MLD: clamping QRV from 1 to 2!
-snip-

5.5 メッセージ出力元を指定する方法(-f)

"-f"は、メッセージの出力元を指定するオプションです。まず、syslogが出力したメッセージだけを表示してみます。

[root@server ~]# dmesg -f syslog
[    6.512113] systemd-journald[106]: Received SIGTERM from PID 1 (systemd).
[    9.669316] systemd-journald[397]: Received request to flush runtime journal from PID 1

次に、daemonが出力したメッセージだけを表示してみます。

[root@server ~]# dmesg -f daemon
[    4.403590] systemd[1]: Detected architecture x86-64.
-snip-

6 バッファーをクリアする方法(-C)

"-C"は、リングバッファのメッセージをクリアするオプションです。

[root@server ~]# dmesg -C

dmesgコマンドを実行します。バッファがクリアされているので、dmesgコマンドを実行してもメッセージは表示されません。

[root@server ~]# dmesg
[root@server ~]#

7 メッセージ出力を待つ方法(-w)

次のメッセージが出力されるのを待ちます。

[root@server ~]# dmesg -w

もう1つターミナルを開きます。ここでは、ip_setモジュールのアンインストール、インストールをしてみます。

[root@server ~]# rmmod ip_set
[root@server ~]# modprobe ip_set

モジュールをインストールすると、下記メッセージが出力されます。

[root@server ~]# dmesg -w
[ 2890.979858] ip_set: protocol 7

8 メッセージに色を付ける方法(-H)

”-H”は、色を付けてメッセージを表示するオプションです。ここでは、-Pオプションも指定して、ページャ機能を無効にしてみました。ページャ機能が有効の場合は、スペースキーを押下して、次のページを表示します。

[root@server ~]# dmesg -HP

メッセージに色を付けて、さらに、メッセージ出力元および重要度も一緒に表示してみます。

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ