С чего начать Первые шаги трек · 15 ступеней
Linux Labs

dmesg — сообщения ядра: OOM, ошибки диска и ФС, segfault

8 мин util-linux 2.39 · Linux 6.8 · Ubuntu 24.04

dmesg печатает кольцевой буфер ядра: сообщения о дисках, файловых системах, OOM, падениях программ и железе.

Шпаргалка

8 команд Версия для печати
  • sudo dmesg -T | tail -20 последние сообщения, со временем
  • sudo dmesg -l err,crit только ошибки
  • sudo dmesg -x | tail с уровнем каждой строки
  • sudo dmesg --since '-10min' за последние 10 минут
  • sudo dmesg -W ждать новых сообщений
  • sudo journalctl -k -b -p err ошибки ядра этой загрузки
  • sudo journalctl -k -b -1 ядро прошлой загрузки
  • sudo dmesg -T | grep -iE 'oom|error|segfault'

Обзор

dmesg печатает сообщения ядра: о найденном железе, дисках и файловых системах, о процессах, которые ядро завершило, о программах, которые упали. Программы пишут в свои журналы, ядро — сюда.

Кольцевой буфер

Ядро складывает сообщения в кольцевой буфер — кусок памяти фиксированного размера: когда он полон, новые строки вытесняют самые старые. Каждая строка начинается с секунд от загрузки:

text
student@ubuntu:~$ sudo dmesg | head -2
[    0.000000] Linux version 6.8.0-124-generic (buildd@lcy02-amd64-0…
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.8.0-124-generic …

-T переводит секунды в дату и время. dmesg --help предупреждает, что после сна (suspend) машины это время может врать; точное время — у journalctl -k.

Доступ: dmesg_restrict

В Ubuntu параметр ядра kernel.dmesg_restrict = 1, и читать буфер может только root:

text
student@ubuntu:~$ dmesg
dmesg: read kernel buffer failed: Operation not permitted

Без sudo journalctl -k у ученика печатает -- No entries -- и подсказку: журнал системы читают группы adm и systemd-journal, а student не в них.

Уровни

У каждого сообщения есть уровень важности. -x его показывает, -l отбирает:

Уровень Пример с машины тренажёра
crit EXT4-fs error (device loop0): ext4_lookup:1866: … deleted inode referenced: 12
crit EXT4-fs (loop0): Remounting filesystem read-only
err Aborting journal on device loop0-8.
err Memory cgroup out of memory: Killed process 1635 (tail) …
info python3[1260]: segfault at 0 ip … error 4 in libc.so.6[…]
info EXT4-fs (loop0): mounted filesystem … r/w with ordered data mode.

-x ставит в начало строки источник и уровень: kern :crit :, kern :err :. segfault — уровня info: фильтр -l err,crit его не покажет. Ищи такие строки grep'ом.

dmesg и journalctl -k

journald копирует сообщения ядра в журнал. journalctl -k показывает их с настоящим временем и хранит дольше буфера: на машине тренажёра журнал лежит на диске (/var/log/journal), поэтому видны и прошлые загрузки.

Нужно Команда
ядро этой загрузки sudo journalctl -k -b
ядро прошлой загрузки sudo journalctl -k -b -1
только ошибки и важнее sudo journalctl -k -p err
с точным временем ISO sudo journalctl -k -o short-iso
только текст, без префикса sudo journalctl -k -o cat

Ключи

10

Основные ключи — в таблице ниже, полный список — dmesg --help.

Ключ Что делает Пример
-T --ctime Время сообщений датой и часами вместо секунд с загрузки; после сна машины может врать. sudo dmesg -T | tail
-l --level LIST Только сообщения указанных уровней — emerg, alert, crit, err, warn, notice, info, debug; warn+ — этот и выше. sudo dmesg -l err,crit,alert,emerg
-x --decode Печатать источник и уровень каждой строки — kern :crit, kern :info. sudo dmesg -x | tail
-w --follow Напечатать буфер и ждать новых сообщений, как tail -f. sudo dmesg -w
-W --follow-new Ждать и печатать только новые сообщения, без старого буфера. sudo dmesg -W
--since TIME Сообщения начиная с момента — '-5min', '2026-10-21 00:30'. sudo dmesg --since '-10min'
-H --human Удобный для чтения вид — разница во времени между строками, цвета, пейджер. sudo dmesg -H
-J --json Вывод в JSON — для скриптов и jq. sudo dmesg -J | head
-C --clear Очистить кольцевой буфер ядра; journalctl -k сообщения сохранит, dmesg — нет. опасно sudo dmesg -C
-c --read-clear Напечатать буфер и очистить его. опасно sudo dmesg -c

Ничего не найдено. Попробуй запрос короче.

Рецепты

6

Ошибки ядра за эту загрузку

bash
sudo journalctl -k -b -p err -o short-iso
sudo dmesg -T -l err,crit,alert,emerg

Следить за сообщениями

bash
sudo dmesg -W                     # только новые строки
echo '<3>lab: test error' | sudo tee /dev/kmsg   # своя строка

-w сначала печатает весь буфер — сотни строк загрузки, — а потом ждёт. -W ждёт сразу. Строка, записанная в /dev/kmsg, попадает в буфер; <3> в начале — уровень err.

Падение программы: segfault

Программа обратилась к памяти, которая ей не принадлежит. Ядро завершает её сигналом SIGSEGV (номер 11), код завершения — 139 = 128 + 11 (см. exit-codes), а в буфере остаётся строка уровня info:

text
python3[1557]: segfault at 0 ip 00007de1a139429d sp 00007ffeed038a48
  error 4 in libc.so.6[7de1a1228000+188000] likely on CPU 0

python3[1557] — имя и PID, segfault at 0 — адрес, к которому обратились (0 — пустой указатель), in libc.so.6 — в какой библиотеке это случилось. Строку здесь перенесли для ширины. Если программы падают часто, ядро пропускает часть строк и пишет show_signal_msg: 61 callbacks suppressed.

Ошибка файловой системы ext4

text
EXT4-fs error (device loop0): ext4_lookup:1866: inode #2: comm cat:
  deleted inode referenced: 12
Aborting journal on device loop0-8.
EXT4-fs (loop0): Remounting filesystem read-only

ext4 нашла повреждение: каталог ссылается на удалённый inode. Программа получила Structure needs cleaning. Что ядро делает дальше, задаёт поведение при ошибке в суперблоке ФС (errors=): с remount-ro журнал обрывается, и запись в ФС отвечает Input/output error. Разбор и e2fsck — в filesystems.

OOM: процесс завершён из-за памяти

bash
sudo dmesg -T | grep -E 'invoked oom-killer|Killed process'

Строки Out of memory: Killed process и Memory cgroup out of memory: Killed process — работа oom-killer; там же — как читать весь отчёт.

Задача зависла в D

text
INFO: task touch:2147 blocked for more than 20 seconds.
      Not tainted 6.8.0-124-generic #124-Ubuntu
…
task:touch           state:D stack:0     pid:2147  tgid:2147  ppid:957

Процесс провёл в состоянии D дольше kernel.hung_task_timeout_secs (120 секунд в Ubuntu; здесь порог уменьшили до 20). Дальше идёт стек ядра — по нему видно, чего процесс ждёт (см. load-average).

Неполадки

5

read kernel buffer failed: Operation not permitted

kernel.dmesg_restrict = 1: буфер читает только root. sudo dmesg или sudo journalctl -k.

journalctl -k печатает -- No entries --

Без sudo пользователь вне групп adm и systemd-journal видит только свои записи. Повтори с sudo.

Буфер начинается не с загрузки или пуст

Буфер переполнился и старые строки вытеснены, или его очистили (dmesg -C). Полная история — sudo journalctl -k -b.

No journal boot entry found

text
student@ubuntu:~$ sudo journalctl -k -b -1
No journal boot entry found from the specified boot offset (-1).

Прошлой загрузки в журнале нет: машина загружалась один раз или журнал хранится только в памяти (/run/log/journal). Список загрузок — journalctl --list-boots.

Время в dmesg -T и в журнале расходится

-T считает время от момента загрузки и не учитывает сон машины. Время из journalctl -k записано в момент сообщения.

Опасно

1

dmesg -C и dmesg -c

Оба очищают буфер ядра. После sudo dmesg -C на машине тренажёра dmesg показал 0 строк, а journalctl -k -b — все 577. Не чисти буфер на сервере, который разбираешь: следующему, кто придёт, останется только журнал.

Термины

2
кольцевой буфер ядра kernel ring buffer
Память фиксированного размера, куда ядро пишет свои сообщения; когда она полна, новые строки вытесняют старые. Читает dmesg (в Ubuntu — только root), копию с точным временем хранит journalctl -k.
segfault (ошибка сегментации) segfault (segmentation fault)
Программа обратилась к памяти, которая ей не принадлежит; ядро завершает её сигналом SIGSEGV (11), код завершения — 139, в журнале ядра — строка «имя[PID]: segfault at адрес … in библиотека».

См. также

  • journalctl — журнал служб и ядра.
  • oom-killer — отчёт OOM в журнале ядра.
  • filesystems — ошибки ext4 и e2fsck.
  • load-average — состояние D и зависшие задачи.
  • exit-codes — коды 128+N: 137, 139.
  • kernel — ядро и его параметры загрузки.
  • kernel-modules — драйверы и их сообщения.
  • sysctl — kernel.dmesg_restrict и другие параметры.
Загрузка…