Команда dmesg

Команда dmesg предназначена для задействования одноименной утилиты, осуществляющей вывод сообщений ядра ОС. В процессе загрузки и функционирования операционной системы ее ядро генерирует множество сообщений, которые позволяют диагностировать различные проблемы с аппаратным и программным обеспечением. Если говорить более предметно, ядро Linux записывает сообщения в кольцевой буфер (область памяти фиксированного размера, в которой осуществляется перезапись устаревших сообщений при добавлении новых), а утилита использует специальный файл /proc/kmesg для доступа к содержимому этого буфера. Данная команда может оказаться крайне полезной в процессе диагностики состояния устройств системы, поэтому ее стоит использовать в первую очередь при возникновении любых аппаратных сбоев.

Базовый синтаксис команды выглядит следующим образом:

$ dmesg [параметры]

Стоит отметить, что в некоторых дистрибутива команда может исполняться лишь от лица пользователя root (что вполне логично, ведь диагностика системы — дело системного администратора). Вообще, утилита может принимать большое количество различных параметров, но чаще всего используется без них. Наиболее полезными ее параметрами являются такие, как параметр -T, позволяющий выводить понятные человеку метки времени, параметры -k и -u, позволяющие выводить лишь сообщения, относящиеся к пространству ядра и пространству пользователя соответственно, параметр -c, позволяющий очистить содержимое кольцевого буфера ядра после вывода, параметр -w, позволяющий вместо завершения работы утилиты ожидать новые сообщения, а также параметры --level и --facility, позволяющие указать приоритет и источник интересующих пользователя сообщений.

В качестве приоритетов сообщений могут использоваться следующие идентификаторы:

Идентификатор Значение
emerg Сообщения о событиях, сделавших систему неработоспособной
alert Сообщения о событиях, на которые пользователь должен немедленно отреагировать
crit Сообщения о критических событиях
err Сообщения об ошибках
warn Предупреждения
notice Сообщения о важных событиях
info Информационные сообщения
debug Отладочные сообщения

В качестве источников сообщений — следующие идентификаторы:

Идентификатор Значение
kern Сообщения от ядра ОС
user Сообщения из пространства пользователя
mail Сообщения от подсистемы отправки электронной почты
daemon Сообщения от системных служб (демонов)
auth Сообщения от системы безопасности/авторизации
syslog Сообщения от службы системных журналов (для внутреннего использования)
lpr Сообщения от подсистемы печати
news Сообщения от подсистемы сетевых новостей

Также нередко для фильтрации вывода dmesg используются такие утилиты, как grep, head, tail, less и more поэтому для продуктивной работы с утилитой dmesg не помешает ознакомиться и с их функциями.

Примеры использования

Вывод всех сообщений ядра ОС

Для вывода всех сообщений ядра ОС может использоваться утилита dmesg без каких-либо параметров:

# dmesg
[ 0.000000] microcode: microcode updated early to revision 0xd0, date = 2010-09-30
[ 0.000000] Linux version 4.18.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 7.3.0 (Debian 7.3.0-29)) #1 SMP Debian 4.18.10-2 (2018-10-07)

Далее будет выведено большое количество системных сообщений, многие из которых могут представлять интерес, особенно в случае неполадок.

Если вам нужно постепенно изучить все сообщения, вы можете воспользоваться утилитами less и more:

# dmesg | more
[ 0.000000] microcode: microcode updated early to revision 0xd0, date = 2010-09-30
[ 0.000000] Linux version 4.18.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 7.3.0 (Debian 7.3.0-29)) #1 SMP Debian 4.18.10-2 (2018-10-07)

--More--

# dmesg | less
[ 0.000000] microcode: microcode updated early to revision 0xd0, date = 2010-09-30
[ 0.000000] Linux version 4.18.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 7.3.0 (Debian 7.3.0-29)) #1 SMP Debian 4.18.10-2 (2018-10-07)

:

Утилита less позволяет проматывать сообщения как вперед, так и назад, утилита more — только вперед.

Вывод важных сообщений

Для вывода исключительно важных сообщений следует использовать соответствующие приоритеты:

# dmesg --level=emerg,alert,crit,err,warn
[ 0.032000] core: PEBS disabled due to CPU errata
[ 0.036206] mtrr: your CPUs had inconsistent variable MTRR settings
[ 0.053809] pci 0000:00:01.0: ASPM: current common clock configuration is broken, reconfiguring
[ 0.088573] pci 0000:03:00.0: [Firmware Bug]: disabling VPD access (can't determine size of non-standard VPD format)

Очевидно, что теперь в выводе отражены лишь явные проблемы с аппаратным обеспечением, которые в моем случае были решены ядром самостоятельно.

Вывод сообщений, относящихся к определенным устройствам

Для вывода всех сообщений, относящихся к определенным устройствам, достаточно отфильтровать вывод утилиты с помощью утилиты grep:

# dmesg | grep dvb
[ 13.019352] dvbdev: DVB: registering new adapter (Mantis DVB adapter)
[ 13.143788] dvb-usb: found a 'Mygica T230 DVB-T/T2/C' in warm state.
[ 13.384098] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[ 13.384305] dvbdev: DVB: registering new adapter (Mygica T230 DVB-T/T2/C)
[ 13.944318] rc rc0: lirc_dev: driver dvb_usb_cxusb registered at minor = 0, scancode receiver, no transmitter
[ 13.944319] dvb-usb: schedule remote query interval to 100 msecs.
[ 13.944509] dvb-usb: Mygica T230 DVB-T/T2/C successfully initialized and connected.

Это информация обо всех подключенных к компьютеру DVB-картах. Аналогичным образом можно получить все сообщения, относящиеся к устройствам других типов.

Вывод всех сообщений из пространства пользователя

Для вывода всех сообщений из пространства пользователя достаточно воспользоваться параметром -u утилиты dmesg:

# dmesg -u
[ 7.483329] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
[ 7.500111] systemd[1]: Detected architecture x86-64.
[ 7.527333] systemd[1]: Set hostname to <debian>.

Очевидно, что это сообщения от менеджера инициализации systemd.