Зачем dmesg
Когда что-то «отвалилось на уровне ядра» - драйвер, диск, USB,
out-of-memory, segfault - ядро пишет в kernel ring buffer.
dmesg показывает этот буфер.
Тут видно:
- Загрузку драйверов и устройств при boot'е
- I/O-ошибки на диске и SATA-link timeouts
- [[oom-killer|OOM-killer]] (кто кого убил и почему)
- Сегфолты userspace-процессов с адресом
- Проблемы с USB / network-карты / Wi-Fi
- Сообщения от netfilter и audit
- Watchdog и soft-lockup
Это не systemd journal, хотя journald тоже копит kernel-сообщения.
На systemd-системе journalctl -k = эквивалент dmesg.
Где живёт буфер
Память ядра, размер CONFIG_LOG_BUF_SHIFT (обычно 1-2 MiB). Когда
переполняется - старые записи затираются. На загруженной системе
буфер живёт минуты-часы, не дни. Для долгого хранения - journald
или syslog.
Размер можно посмотреть:
cat /proc/sys/kernel/printk_ratelimit_burst
dmesg -s 1048576 # запросить 1 MiB чтения (можно > буфера)
Базовый вызов
dmesg # весь буфер - сырой вывод
dmesg | tail -50 # последние строки
sudo dmesg # с Linux 4.0 нужен root (kptr restrict)
dmesg -T # человеческие даты
dmesg -w # tail -f - ждать новых
dmesg -W # follow без show-existing
dmesg -H # human - цвет, страничный (less)
dmesg --color=always | less -R
-T - даты человеку
По дефолту dmesg показывает uptime:
[ 12.345678] usb 1-2: USB disconnect
Это секунды от boot'а - бесполезно когда смотришь спустя сутки.
-T конвертирует в локальное время:
[Fri May 2 14:23:11 2026] usb 1-2: USB disconnect
Trade-off: -T неточно при большом сдвиге времени (NTP-jump'ы).
Уровни логирования
Сообщения помечены syslog priority (RFC 5424):
| Число | Имя | Что |
|---|---|---|
| 0 | emerg | system unusable |
| 1 | alert | требуется немедленное действие |
| 2 | crit | critical conditions |
| 3 | err | ошибка |
| 4 | warn | warning |
| 5 | notice | важно, но не warning |
| 6 | info | informational |
| 7 | debug | debug-only |
dmesg -l err,crit,alert,emerg # только ≤ err
dmesg -l warn+ # warn и выше
dmesg --facility=daemon # только daemon-сообщения
Поиск конкретных событий
dmesg -T | grep -i 'oom\|killed' # OOM-killer
dmesg -T | grep -i 'segfault\|fault' # segfaults
dmesg -T | grep -iE 'i/o error|sd[a-z]: ' # ошибки диска
dmesg -T | grep -iE 'eth0|enp|wlp' # сеть
dmesg -T | grep nf_conntrack # conntrack table full
dmesg -T | grep TCP # ядро жалуется на TCP-стек
OOM-killer - типичный вывод
[Fri May 2 14:00:00 2026] Out of memory: Killed process 12345 (java) total-vm:8000000kB, anon-rss:7800000kB, file-rss:0kB
Покажет также oom_score и стек вызовов из ядра. Подробнее в oom-killer.
segfault
[Fri May 2 14:00:00 2026] python[3456]: segfault at 0 ip 00007fff... sp 00007ffd... error 6 in libfoo.so.1
at 0- разыменование nullptrerror 6- бит-маска: write + user-mode
Фильтр по facility
| Facility | Что |
|---|---|
| kern | сообщения ядра (default) |
| user | от userspace через /dev/kmsg |
| mail subsystem | |
| daemon | системные демоны |
| auth | аутентификация |
| syslog | сам syslogd |
В современном Linux большинство приходит как kern.
dmesg vs journalctl -k
journalctl -k # эквивалент dmesg
journalctl -k --since '1 hour ago'
journalctl -k -p err -b # с этой загрузки
journalctl -k -f # follow
Преимущество journalctl: персистентен (если Storage=persistent),
фильтр по boot (-b -1 предыдущая загрузка). Преимущество dmesg:
работает там где нет journald (initramfs, контейнер, старые
системы), и быстрее.
Запись в kernel ring buffer
Юзерспейс может писать сам:
echo "marker before deploy" | sudo tee /dev/kmsg
Это попадёт в dmesg как kern.notice. Полезно для маркеров в
логах перед/после операций.
Очистка буфера
sudo dmesg -C # clear, видно только новое
sudo dmesg -c # clear AND print текущее
Опасно: всё, что было, потеряно навсегда. На проде клир - редкая операция (для теста, перед воспроизведением бага).
Когда что-то пошло не так
dmesg: read kernel buffer failed: Operation not permitted-kernel.dmesg_restrict=1, нужен root илиcap_syslog.- Буфер переполняется быстро - драйвер бьётся в логи каждые 100ms.
Найди источник через
dmesg | awk '{print $5}' | sort | uniq -c, отключи verbose в драйвере (sysfs или modprobe-параметр). -Tпоказывает неправильное время - был NTP-step, dmesg использует monotonic clock + текущее wall-time как baseline. Лекарство:journalctl -k, у него настоящие timestamps.- Нет dmesg вообще -
dmesg-restrict=1или контейнер без/dev/kmsg(docker run --cap-add=SYSLOG).