The Linux kernel is the core of the operating system that controls access to the system resources, such as CPU, I/O devices, physical memory, and file systems. The kernel writes various messages to the kernel ring buffer during the boot process, and when the system is running. These messages include various information about the operation of the system.
The kernel ring buffer is a portion of the physical memory that holds the kernel’s log messages. It has a fixed size, which means once the buffer is full, the older logs records are overwritten.
The dmesg
command-line utility is used to print and control the kernel ring buffer in Linux and other Unix-like operating systems. It is useful for examining kernel boot messages and debugging hardware related issues.
In this tutorial, we’ll cover the basics of the dmesg
command.
Using the dmesg
Command
The syntax for the dmesg
command is as follows:
dmesg [OPTIONS]
When invoked without any options dmesg
writes all messages from the kernel ring buffer to the standard output:
dmesg
By default, all users can run the dmesg
command. However, on some systems, the access to dmesg
may be restricted for non-root users. In this situation, when invoking dmesg
you will get an error message like below:
dmesg: read kernel buffer failed: Operation not permitted
The kernel parameter kernel.dmesg_restrict
specifies whether unprivileged users can use dmesg
to view messages from the kernel’s log buffer. To remove the restrictions, set it to zero:
sudo sysctl -w kernel.dmesg_restrict=0
Usually, the output contains a lot of lines of information, so only the last part of the output is viewable. To see one page at a time, pipe the output to a pager utility such as less
or more
:
dmesg --color=always | less
The --color=always
is used to preserve the colored output.
If you want to filter the buffer messages, use grep
. For example, to view only the USB related messages, you would type:
dmesg | grep -i usb
dmesg
reads the messages generated by the kernel from the /proc/kmsg
virtual file. This file provides an interface to the kernel ring buffer and can be opened only by one process. If syslog
process is running on your system and you try to read the file with cat
, or less
, the command will hang.
The syslog
daemon dumps kernel messages to /var/log/dmesg
, so you can also use that log file:
cat /var/log/dmesg
Formating dmesg
Output
The dmesg
command provides a number of options that help you format and filter the output.
One of the most used options of dmesg
is -H
(--human
), which enables the human-readable output. This option pipe the command output into a pager:
dmesg -H
To print human-readable timestamps use the -T
(--ctime
) option:
dmesg -T
[Mon Oct 14 14:38:04 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
The timestamps format can also be set using the --time-format <format>
option, which can be ctime, reltime, delta, notime, or iso. For example to use the delta format you would type:
dmesg --time-format=delta
You can also combine two or more options:
dmesg -H -T
To watch the output of the dmesg
command in real-time use the -w
(--follow
) option:
dmesg --follow
Filtering dmesg
Output
You can restrict the dmesg
output to given facilities and levels.
The facility represents the process that created the message. dmesg
supports the following log facilities:
kern
– kernel messagesuser
– user-level messagesmail
– mail systemdaemon
– system daemonsauth
– security/authorization messagessyslog
– internal syslogd messageslpr
– line printer subsystemnews
– network news subsystem
The -f
(--facility <list>
) option allows you to limit the output to specific facilities. The option accepts one or more comma-separated facilities.
For example, to display only the kernel and system daemons messages you would use:
dmesg -f kern,daemon
Each log message is associated with a log level that shows the importance of the message. dmesg
supports the following log levels:
emerg
– system is unusablealert
– action must be taken immediatelycrit
– critical conditionserr
– error conditionswarn
– warning conditionsnotice
– normal but significant conditioninfo
– informationaldebug
– debug-level messages
The -l
(--level <list>
) option restricts the output to defined levels. The option accepts one or more comma-separated levels.
The following command displays only the error and critical messages:
dmesg -l err,crit
Clearing the Ring Buffer
The -C
(--clear
) option allows you to clear the ring buffer:
sudo dmesg -C
Only root or users with sudo privileges can clear the buffer.
To print the buffer contents before clearing use the -c
(--read-clear
) option:
sudo dmesg -c
If you want to save the current dmesg
logs in a file before clearing it, redirect the output to a file:
dmesg > dmesg_messages