LinuxСредняя

Ошибки dmesg в Linux: как читать, фильтровать и исправлять

Статья объясняет, что такое dmesg, как правильно интерпретировать его вывод и устранять типичные ошибки ядра Linux. Вы научитесь фильтровать логи, сохранять их в файл и настраивать уровень сообщений.

Обновлено 8 апреля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 22.04+Debian 11+CentOS 8+Арбитраные дистрибутивы Linux с systemd

Что означает ошибка dmesg

dmesg (display message) — это команда Linux для вывода буфера кольцевого сообщений ядра. Она не показывает "ошибки" в традиционном смысле (как код возврата), а отображает все события ядра: загрузку драйверов, обнаружение оборудования, предупреждения о ресурсах, сбои.

Типичный вывод строки ошибки:

[ 1234.567890] usb 1-2: device descriptor read/64, error -71
  • [ 1234.567890] — время в секундах с момента загрузки (с dmesg -T будет человеко-читаемая дата).
  • usb 1-2 — устройство (шинa USB, порт 1-2).
  • error -71 — код ошибки (здесь -71 = EPROTO, протокольный сбой).

Симптомы проблемы: внезапные падения устройств (USB, сеть), ошибки ввода-вывода, паники ядра (Kernel Panic), неработающие драйверы. Часто dmesgпервый источник информации при диагностике аппаратных или драйверных сбоев.

Причины возникновения

  1. Аппаратные сбои или несовместимость — дефектное оборудование (USB-кабель, диск), неправильная инициализация устройств.
  2. Проблемы с драйверами — устаревший, повреждённый или конфликтующий модуль ядра (например, драйвер видеокарты или сетевой карты).
  3. Переполнение буфера сообщений ядра — буфер имеет фиксированный размер (по умолчанию ~16 КБ на CPU). При высокой нагрузке старые сообщения перезаписываются, и вы теряете историю.
  4. Ошибки конфигурации ядра или параметров загрузки — неверные параметры в grub (например, nomodeset), конфликты модулей.
  5. Проблемы с правами доступа — в современных дистрибутивах доступ к dmesg может быть ограничен (требуются права root или настройка kernel.dmesg_restrict).
  6. Сбои в работе подсистемы ядра — утечки памяти, тайм-ауты (timeout) на шинах (I2C, SPI), ошибки прерываний (IRQ).

Способы решения

Способ 1: Базовый анализ и фильтрация логов

Самый частый сценарий — нужно найти конкретное сообщение об ошибке среди тысяч строк.

  1. Просмотрите последние сообщения (после загрузки или события):
    # Показать последние 100 строк с удобными временными метками
    sudo dmesg -T | tail -n 100
    
  2. Фильтруйте по уровню серьезности (только ошибки и выше):
    # Показать сообщения уровня error, crit, alert, emerg
    sudo dmesg -l err,crit,alert,emerg
    
  3. Ищите по ключевому слову (например, по имени устройства или драйвера):
    # Поиск без учета регистра по слову 'fail' или 'error'
    sudo dmesg | grep -i -E 'fail|error'
    # Пример: поиск ошибок, связанных с USB
    sudo dmesg | grep -i usb
    
  4. Используйте цветовой вывод (если поддерживается):
    sudo dmesg --color=always | less -R
    

Способ 2: Сохранение полного лога для глубокого анализа

Если проблема периодическая, нужно сохранить полный контекст.

  1. Экспортируйте весь буфер в файл сразу после возникновения проблемы:
    # Сохранить полный лог с временными метками в домашнюю директорию
    sudo dmesg -T > ~/dmesg_issue_$(date +%Y-%m-%d_%H-%M-%S).log
    
  2. Для длительного мониторинга используйте tee или перенаправление:
    # Записывать новые сообщения в файл в реальном времени (Ctrl+C для остановки)
    sudo dmesg -w | tee ~/dmesg_live.log
    
  3. Анализируйте сохранённый файл с помощью grep, awk или текстовых редакторов. Ищите упоминания вашего устройства, коды ошибок (например, -71, -110), слова Oops, BUG, WARNING.

Способ 3: Увеличение размера буфера dmesg

По умолчанию буфер может быть слишком мал, и старые сообщения (где началась проблема) теряются.

  1. Временно увеличьте буфер (действует до перезагрузки):
    # Установить размер буфера 4 МБ (значение в килобайтах)
    sudo sysctl -w kernel.dmesg_restrict=0  # Снять ограничение доступа, если есть
    sudo sysctl -w kernel.printk=7 4 1 7    # Настроить уровни вывода (console, default, minimum)
    

    Параметр kernel.printk управляет, какие сообщения ядра попадают в буфер и на консоль. Формат: console_loglevel default_message_loglevel minimum_console_loglevel default_console_loglevel. Значения: 8 (debug) ... 1 (emergency). Установка 7 4 1 7 — хороший баланс для отладки.
  2. Постоянно увеличьте буфер (через /etc/sysctl.conf или файл в /etc/sysctl.d/):
    # Отредактируйте конфиг
    sudo nano /etc/sysctl.d/99-dmesg.conf
    

    Добавьте строки:
    # Размер буфера dmesg в килобайтах (4 МБ = 4096 КБ)
    kernel.dmesg_restrict = 0
    kernel.printk = 7 4 1 7
    

    Примените: sudo sysctl -p /etc/sysctl.d/99-dmesg.conf.

Способ 4: Использование journalctl для расширенного анализа (systemd)

Если в системе используется systemd, journalctl — более мощная альтернатива, хранящая логи с метками времени и дополнительными полями.

  1. Просмотрите сообщения ядра (аналог dmesg):
    # Показать все сообщения ядра (флаг -k)
    sudo journalctl -k
    # Последние 50 сообщений ядра
    sudo journalctl -k -n 50
    
  2. Фильтруйте по времени, приоритету или подсистеме:
    # Ошибки ядра за последний час
    sudo journalctl -k -p err --since "1 hour ago"
    # Сообщения от конкретного драйвера (например, nvidia)
    sudo journalctl -k | grep -i nvidia
    
  3. Экспортируйте в файл для отправки в техподдержку:
    # Сохранить логи ядра с полными метками времени в файл
    sudo journalctl -k --since "2026-04-08 09:00:00" --until "2026-04-08 10:00:00" > ~/kernel_logs.txt
    

Способ 5: Диагностика конкретных типов ошибок

  • Ошибки USB (-71, -110, timeout): Проверьте кабель, порт, подключите устройство в другой порт (особенно USB 3.0 vs 2.0). Обновите BIOS/UEFI. Проверьте питание: lsusb -t.
    # Подробный лог по USB
    sudo dmesg | grep -i usb
    
  • Ошибки дисков (I/O error, sense key): Проверьте здоровье диска: sudo smartctl -a /dev/sda. Проверьте кабели SATA/питания. Возможно, failing hardware.
    # Логи по SCSI/дискам
    sudo dmesg | grep -i -E 'sd|scsi|ata|sense'
    
  • Ошибки сети (link down, tx timeout): Проверьте драйвер: ethtool -i eth0. Обновите прошивку карты или драйвер. Проверьте кабель/коммутатор.
    # Логи по сетевому интерфейсу (замените eth0 на ваш)
    sudo dmesg | grep -i eth0
    
  • Ошибки памяти (MCE, CPU): Могут указывать на аппаратные сбои CPU/RAM. Проверьте: sudo mcelog --file /dev/mcelog. Обновите BIOS. Запустите тест памяти (memtest86+).
    # Поиск Machine Check Exceptions
    sudo dmesg | grep -i mce
    

Профилактика

  • Регулярно мониторьте логи при установке нового оборудования или ПО. Используйте sudo dmesg -w в отдельном терминале.
  • Настройте ротацию логов ядра. Хотя dmesg — это кольцевой буфер в памяти, его содержимое может быть перенаправлено в syslog (например, rsyslog). Убедитесь, что в /etc/rsyslog.conf есть строка kern.* и настроена ротация через logrotate для /var/log/kern.log.
  • Держите систему обновлённой (sudo apt update && sudo apt upgrade или dnf update), особенно ядро и драйверы.
  • Избегайте "сырых" драйверов из ненадёжных источников. Используйте официальные репозитории дистрибутива или драйверы от производителя оборудования.
  • При проблемах с конкретным устройством — изолируйте его: отключите другие USB-устройства, попробуйте другой порт, проверьте питание.
  • При частых переполнениях буфера увеличьте его размер (см. Способ 3) и/или настройте более агрессивную фильтрацию ненужных сообщений через kernel.printk.

Часто задаваемые вопросы

Как правильно читать вывод dmesg? Что означают квадратные скобки и временные метки?
Что делать, если буфер dmesg переполнен и я теряю старые сообщения?
Почему в dmesg много сообщений от конкретного драйвера (например, nvidia)? Это ошибка?
Можно ли отслеживать dmesg в реальном времени? Как?

Полезное

Просмотр последних сообщений ядра
Фильтрация ошибок по уровню серьезности
Сохранение полного лога в файл для анализа
Очистка буфера dmesg (осторожно!)
Настройка уровня вывода сообщений ядра