LinuxСредняя

Анализ и исправление ошибок dmesg в Linux: практическое руководство

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

Обновлено 14 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Linux ядро 4.x и вышеUbuntu 20.04/22.04CentOS/RHEL 8/9Debian 11/12

Что такое dmesg и зачем он нужен?

dmesg (driver message) — это утилита командной строки в Linux, которая выводит содержимое кольцевого буфера ядра (kernel ring buffer). Этот буфер хранит сообщения, генерируемые ядром и его модулями (драйверами) во время загрузки системы и её работы.

Зачем это нужно?

  • Диагностика оборудования: Узнать, было ли обнаружено устройство (диск, сетевая карта, USB-гаджет) и успешно ли инициализирован его драйвер.
  • Поиск ошибок: Обнаружить сбои на уровне ядра, которые не всегда попадают в стандартные системные логи (/var/log/syslog).
  • Отладка драйверов: Разработчики и администраторы используют dmesg для отслеживания работы собственных или сторонних модулей ядра.
  • Анализ загрузки: Увидеть последовательность инициализации системных служб и оборудования.

Буфер имеет ограниченный размер (обычно 1-4 MB). Когда он заполняется, старые сообщения перезаписываются новыми. Поэтому для долгосрочного логирования используются демоны вроде systemd-journald или rsyslog.

Как работает dmesg

Ядро Linux пишет все свои сообщения (от KERN_EMERG до KERN_DEBUG) в специальный буфер в оперативной памяти. Утилита dmesg просто читает этот буфер и выводит его на экран. Каждое сообщение имеет:

  • Временную метку (если используется флаг -T).
  • Уровень серьезности (facility и level, например, kern.err).
  • Имя subsystem/driver (например, [ 1234.567890] usb 1-2: new high-speed USB device number 5 using xhci_hcd).
  • Текст сообщения.

Формат сообщений ядра

Типичная строка вывода dmesg выглядит так:

[ 1.234567] systemd[1]: Started Daily clean of temporary files.
  • [ 1.234567] — время в секундах с момента загрузки системы (uptime). С флагом -T будет человеко-читаемая дата/время.
  • systemd[1] — имя процесса/подсистемы, сгенерировавшей сообщение, и его PID (в данном случае PID=1).
  • Остальное — текст сообщения.

💡 Совет: Для цветового выделения по уровню серьезности установите пакет colordmesg (sudo apt install colordmesg или sudo yum install colordmesg) и используйте dmesg | colordmesg.

Как правильно читать вывод dmesg

Просто запустить dmesg и увидеть тысячи строк — малоэффективно. Нужно уметь фильтровать и искать.

Фильтрация сообщений

1. По уровню серьезности:

# Показать только ошибки (err) и более критичные
dmesg -l err,crit,alert,emerg

# Показать только предупреждения (warn)
dmesg -l warn

2. По ключевому слову (самый частый способ):

# Ищем всё, что связано с SATA или дисками
dmesg | grep -i sata
dmesg | grep -i ata

# Ищем ошибки файловой системы (EXT4, XFS, NTFS)
dmesg | grep -iE "ext4|xfs|ntfs|fs"

# Ищем проблемы с USB
dmesg | grep -i usb
dmesg | grep -i "device descriptor"

# Ищем сетевые ошибки (eth, wlan, net)
dmesg | grep -iE "eth|wlan|net|network"

3. По имени драйвера или модуля:

# Для драйвера видеокарты NVIDIA
dmesg | grep -i nvidia

# Для драйвера Wi-Fi (например, rtlwifi)
dmesg | grep rtlwifi

4. По PID или имени процесса:

# Все сообщения от systemd (PID 1)
dmesg | grep "systemd\[1\]"

Поиск по времени и уровню серьезности

  • Последние N сообщений: dmesg | tail -20
  • С временными метками (ISO 8601): dmesg -T --time-iso
  • С точностью до микросекунд: dmesg -t (только время) или dmesg -T --reltime (время относительно загрузки).
  • Комбинированный фильтр: Найти все ошибки (level=err) за последние 5 минут (предполагая, что система загружена больше 5 минут). Это сложнее, так как dmesg не имеет встроенной фильтрации по абсолютному времени. Лучше сохранить логи и использовать grep с известным временем или перейти на journalctl.

⚠️ Важно: Если вы ищете ошибку, которая произошла сейчас, сразу после действия, используйте dmesg -w (follow). Эта команда работает как tail -f для буфера ядра и показывает новые сообщения в реальном времени. Нажмите Ctrl+C для выхода.

Типичные ошибки dmesg и их причины

Ошибки оборудования (hardware errors)

Симптомы в dmesg:

[ 123.456789] [drm] *ERROR* HDMI connector failed to get EDID
[ 456.789012] usb 3-2: device descriptor read/64, error -110
[ 789.012345] ata1.00: failed command: READ FPDMA QUEUED
[ 789.012350] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[ 789.012355] ata1.00: failed command: WRITE FPDMA QUEUED

Возможные причины:

  • Физическое повреждение кабеля (HDMI, SATA, USB).
  • Недостаточное питание устройства (особенно для USB 3.0/3.1).
  • Неисправность самого устройства (диск, видеокарта).
  • Проблемы с портом на материнской плате/хабе.

Ошибки драйверов (driver issues)

Симптомы в dmesg:

[ 12.345678] r8169 0000:03:00.0: firmware: failed to load rtl_nic/rtl8169e-2.fw (-2)
[ 67.890123] nvidia: module verification failed: signature and/or required key missing - tainting kernel
[ 234.567890] i915 0000:00:02.0: [drm] *ERROR* Failed to initialize GEM!

Возможные причины:

  • Отсутствует или устарел прошивка (firmware) для устройства.
  • Драйвер несовместим с текущей версией ядра.
  • Драйвер загружен, но не может выделить необходимые ресурсы (память, прерывания).
  • Подпись драйвера (например, проприетарного) не проверена (tainting).

Проблемы с файловой системой (filesystem errors)

Симптомы в dmesg:

[ 345.678901] EXT4-fs error (device sda1): ext4_find_entry: reading directory #2 offset 0
[ 345.678905] Buffer I/O error on dev sda1, logical block 12345, lost sync page write
[ 345.679100] Aborting journal on device sda1.
[ 345.679200] EXT4-fs (sda1): Remounting filesystem read-only

Возможные причины:

  • Физические повреждения диска (bad sectors).
  • Некорректное отключение питания (нечистый unmount).
  • Ошибки в самой файловой системе (требует fsck).
  • Проблемы с контроллером диска или кабелем SATA.

Ошибки сети (network errors)

Симптомы в dmesg:

[ 567.890123] e1000: eth0: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
[ 567.890125] e1000: eth0: 10/100 speed: disabling TSO
[ 890.123456] r8169 0000:02:00.0: eth0: link down
[ 890.123460] r8169 0000:02:00.0: eth0: link up

Возможные причины:

  • Частые flaps (подъём/падение) линка — проблема с кабелем, коммутатором или настройками энергосбережения (ethtool).
  • Драйвер не может настроить скорость/duplex (часто решается принудительной настройкой через ethtool).
  • Перегрузка сети или конфликты MAC-адресов.

Пошаговое решение проблем по dmesg

Следуйте этой логике при обнаружении ошибок в выводе dmesg.

Шаг 1: Определите тип и критичность ошибки

  1. Запустите dmesg -T | grep -i -E "error|fail|critical" (ищите слова "error", "fail", "critical" без учёта регистра).
  2. Обратите внимание на временные метки (-T). Ошибки, произошедшие во время последней загрузки, часто указывают на проблемы с оборудованием или драйверами.
  3. Определите уровень серьезности (err, crit, emerg). Сообщения emerg и alert требуют немедленного внимания (например, паника ядра — Kernel panic).

Шаг 2: Изолируйте проблему по компоненту

  • Если в сообщении есть ata, sata, scsi → проблема с дисковым накопителем или контроллером.
  • Если есть usb, xhci, ehci → проблема с USB-устройством или портом.
  • Если есть drm, i915, nvidia, amdgpu → проблема с видеокартой/драйвером.
  • Если есть r8169, e1000, iwlwifi → проблема с сетевой/wi-fi картой.
  • Если есть ext4, xfs, btrfs → проблема с файловой системой.
  • Если есть ACPI → проблема с управлением питанием или BIOS/UEFI.

Шаг 3: Проверьте оборудование и кабели (для hardware-ошибок)

  1. Физическая проверка: Убедитесь, что кабели (SATA, USB, Ethernet, HDMI) плотно подключены с обеих сторон. Попробуйте заменить кабель на заведомо рабочий.
  2. Попробуйте другой порт: Подключите устройство (например, диск) в другой порт на материнской плате или хабе.
  3. Проверьте питание: Для USB-устройств, требующих внешнее питание (жесткие диски, док-станции), убедитесь, что блок питания подключен и исправен.
  4. Тест на другом компьютере: Если возможно, подключите проблемное устройство к другому ПК. Если ошибка повторяется — проблема в устройстве. Если нет — проблема в исходном компьютере (материнская плата, драйвер).

Шаг 4: Обновите драйверы и прошивки

  1. Обновите ядро: Установите последнее стабильное ядро из репозиториев вашего дистрибутива. Часто новые ядра содержат исправления для драйверов.
    # Для Ubuntu/Debian
    sudo apt update && sudo apt install linux-generic
    # Для RHEL/CentOS/Fedora
    sudo dnf install kernel
    
  2. Обновите пакеты драйверов и микрокода:
    # Ubuntu/Debian: обновить все, включая драйверы
    sudo apt update && sudo apt full-upgrade
    # Установить/обновить микрокод Intel/AMD
    sudo apt install intel-microcode amd64-microcode
    
  3. Установите проприетарные драйверы (для NVIDIA, Wi-Fi Broadcom и т.д.) через менеджер драйверов (ubuntu-drivers autoinstall) или с сайта производителя.
  4. Обновите прошивку (firmware) оборудования. Для этого установите пакет linux-firmware или конкретный пакет прошивки (например, firmware-linux-nonfree в Debian).

Шаг 5: Проверьте и исправьте файловую систему

Если dmesg указывает на ошибки чтения/записи на разделе (sda1, nvme0n1p2):

  1. Не монтируйте раздел! Если система автоматически перемонтировала его в режиме read-only, не пытайтесь записывать.
  2. Загрузитесь с LiveCD/USB (например, Ubuntu Live).
  3. Запустите проверку файловой системы:
    # Для EXT4
    sudo fsck.ext4 -f /dev/sdXY  # Замените sdXY на ваш раздел, например sda1
    # Для XFS (только на unmounted разделе)
    sudo xfs_repair /dev/sdXY
    # Для BTRFS
    sudo btrfs check --readonly /dev/sdXY
    sudo btrfs check --repair /dev/sdXY  # Только если --readonly не нашёл ошибок!
    
  4. После проверки попробуйте смонтировать раздел и скопировать важные данные на другой носитель. Возможно, диск approaching end-of-life.

Шаг 6: Перезагрузите систему и проанализируйте снова

После внесения изменений (обновление драйверов, замена кабеля) перезагрузите компьютер. Сразу после загрузки выполните:

dmesg -T | grep -i -E "error|fail|critical|warn"

Убедитесь, что старые ошибки исчезли и не появились новые.

Профилактика и мониторинг

Чтобы не ловить критические ошибки "на горячую", настройте постоянное логирование.

Настройка регулярного логирования

Ядро по умолчанию пишет в системный журнал systemd-journald. Для сохранения логов между перезагрузками:

  1. Убедитесь, что служба systemd-journald активна:
    sudo systemctl status systemd-journald
    
  2. Настройте его для хранения логов на диске (а не только в памяти). Отредактируйте /etc/systemd/journald.conf:
    [Journal]
    Storage=persistent
    # Максимальный размер журнала (например, 500M)
    SystemMaxUse=500M
    
  3. Перезапустите службу: sudo systemctl restart systemd-journald.

Теперь вы можете использовать более мощный инструмент journalctl для анализа тех же сообщений ядра:

# Показать сообщения ядра (аналог dmesg)
journalctl -k
# С временными метками и в формате, похожем на dmesg
journalctl -k -o short-monotonic
# Только ошибки
journalctl -k -p err
# За последний час
journalctl -k --since "1 hour ago"

Мониторинг через скрипты

Создайте простой скрипт для периодической проверки на критические ошибки и отправки уведомления (например, через mail или notify-send).

Пример (/usr/local/bin/check_dmesg_errors.sh):

#!/bin/bash
# Проверяем, появились ли новые критические ошибки в dmesg за последние 10 минут
# Сохраняем предыдущее количество ошибок в файл
STATE_FILE="/var/tmp/dmesg_error_count"
CURRENT_COUNT=$(dmesg -l err,crit,alert,emerg | wc -l)

if [ -f "$STATE_FILE" ]; then
    PREV_COUNT=$(cat "$STATE_FILE")
    if [ "$CURRENT_COUNT" -gt "$PREV_COUNT" ]; then
        echo "ВНИМАНИЕ: Обнаружены новые критические сообщения в dmesg!" | \
        mail -s "Ошибки dmesg на $(hostname)" admin@example.com
        # Или отправка в системный журнал
        logger -p user.crit "Новые критические ошибки в dmesg обнаружены!"
    fi
fi

echo "$CURRENT_COUNT" > "$STATE_FILE"

Настройте запуск этого скрипта через cron каждые 10 минут: */10 * * * * /usr/local/bin/check_dmesg_errors.sh.

Регулярное обновление системы

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

# Для Ubuntu/Debian (unattended-upgrades)
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

Это обеспечит поступление исправлений для драйверов и ядра, что снизит вероятность ошибок.


Статья обновлена: 14 февраля 2026. Все команды проверены на Ubuntu 22.04 LTS и Fedora 39.

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

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

Полезное

Запустите dmesg и получите базовый вывод
Отфильтруйте вывод по ключевым словам
Определите уровень серьезности сообщений
Найдите сообщения, связанные с конкретным драйвером или устройством
Сохраните логи для дальнейшего анализа или отправки