# dmesg - kernel ring buffer _Команды · LinuxLab Knowledge Base_ **TL;DR:** dmesg - сообщения ядра из ring buffer (фиксированный размер, старое затирается). `-T` человеческие даты, `-w` follow, `-l err,crit` фильтр. Источник правды для драйверов и OOM-killer'а. ## Зачем 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. Размер можно посмотреть: ```bash cat /proc/sys/kernel/printk_ratelimit_burst dmesg -s 1048576 # запросить 1 MiB чтения (можно > буфера) ``` ## Базовый вызов ```bash 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 | ```bash dmesg -l err,crit,alert,emerg # только ≤ err dmesg -l warn+ # warn и выше dmesg --facility=daemon # только daemon-сообщения ``` ## Поиск конкретных событий ```bash 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](/kb/oom-killer.md). ### 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` - разыменование nullptr - `error 6` - бит-маска: write + user-mode ## Фильтр по facility | Facility | Что | |----------|-----| | kern | сообщения ядра (default) | | user | от userspace через `/dev/kmsg` | | mail | mail subsystem | | daemon | системные демоны | | auth | аутентификация | | syslog | сам syslogd | В современном Linux большинство приходит как `kern`. ## dmesg vs journalctl -k ```bash 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 Юзерспейс может писать сам: ```bash echo "marker before deploy" | sudo tee /dev/kmsg ``` Это попадёт в dmesg как `kern.notice`. Полезно для **маркеров** в логах перед/после операций. ## Очистка буфера ```bash 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`). ## Команды ```bash dmesg -T | tail -50 ``` Последние 50 событий ядра с человеческими датами ```bash dmesg -Tw ``` Follow в реальном времени - удобно при отладке загрузки/драйвера ```bash dmesg -T -l err,crit ``` Только ошибки и критика - быстрый health-check ```bash dmesg -T | grep -i oom ``` Все срабатывания OOM-killer'а - кого ядро убило за память ```bash dmesg -T | grep -iE 'sd[a-z]: ' ``` Сообщения о SCSI-дисках - I/O ошибки, медленные команды ```bash echo 'before deploy' | sudo tee /dev/kmsg ``` Поставить маркер в kernel log - удобно как анчор для grep ```bash sudo dmesg -C ``` Очистить ring buffer - перед воспроизведением бага, чтобы dmesg был чистый ## См. также - [OOM killer](/kb/oom-killer.md) - [journalctl - журнал systemd](/kb/cmd-journalctl.md) - [Kernel modules - LKM, modprobe, signing, DKMS](/kb/kernel-modules.md) - [lsblk и blkid - block-устройства и UUID](/kb/cmd-lsblk-blkid.md) - [Block devices - диски в Linux](/kb/block-devices.md)