Что такое 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: Определите тип и критичность ошибки
- Запустите
dmesg -T | grep -i -E "error|fail|critical"(ищите слова "error", "fail", "critical" без учёта регистра). - Обратите внимание на временные метки (
-T). Ошибки, произошедшие во время последней загрузки, часто указывают на проблемы с оборудованием или драйверами. - Определите уровень серьезности (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-ошибок)
- Физическая проверка: Убедитесь, что кабели (SATA, USB, Ethernet, HDMI) плотно подключены с обеих сторон. Попробуйте заменить кабель на заведомо рабочий.
- Попробуйте другой порт: Подключите устройство (например, диск) в другой порт на материнской плате или хабе.
- Проверьте питание: Для USB-устройств, требующих внешнее питание (жесткие диски, док-станции), убедитесь, что блок питания подключен и исправен.
- Тест на другом компьютере: Если возможно, подключите проблемное устройство к другому ПК. Если ошибка повторяется — проблема в устройстве. Если нет — проблема в исходном компьютере (материнская плата, драйвер).
Шаг 4: Обновите драйверы и прошивки
- Обновите ядро: Установите последнее стабильное ядро из репозиториев вашего дистрибутива. Часто новые ядра содержат исправления для драйверов.
# Для Ubuntu/Debian sudo apt update && sudo apt install linux-generic # Для RHEL/CentOS/Fedora sudo dnf install kernel - Обновите пакеты драйверов и микрокода:
# Ubuntu/Debian: обновить все, включая драйверы sudo apt update && sudo apt full-upgrade # Установить/обновить микрокод Intel/AMD sudo apt install intel-microcode amd64-microcode - Установите проприетарные драйверы (для NVIDIA, Wi-Fi Broadcom и т.д.) через менеджер драйверов (
ubuntu-drivers autoinstall) или с сайта производителя. - Обновите прошивку (firmware) оборудования. Для этого установите пакет
linux-firmwareили конкретный пакет прошивки (например,firmware-linux-nonfreeв Debian).
Шаг 5: Проверьте и исправьте файловую систему
Если dmesg указывает на ошибки чтения/записи на разделе (sda1, nvme0n1p2):
- Не монтируйте раздел! Если система автоматически перемонтировала его в режиме
read-only, не пытайтесь записывать. - Загрузитесь с LiveCD/USB (например, Ubuntu Live).
- Запустите проверку файловой системы:
# Для 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 не нашёл ошибок! - После проверки попробуйте смонтировать раздел и скопировать важные данные на другой носитель. Возможно, диск approaching end-of-life.
Шаг 6: Перезагрузите систему и проанализируйте снова
После внесения изменений (обновление драйверов, замена кабеля) перезагрузите компьютер. Сразу после загрузки выполните:
dmesg -T | grep -i -E "error|fail|critical|warn"
Убедитесь, что старые ошибки исчезли и не появились новые.
Профилактика и мониторинг
Чтобы не ловить критические ошибки "на горячую", настройте постоянное логирование.
Настройка регулярного логирования
Ядро по умолчанию пишет в системный журнал systemd-journald. Для сохранения логов между перезагрузками:
- Убедитесь, что служба
systemd-journaldактивна:sudo systemctl status systemd-journald - Настройте его для хранения логов на диске (а не только в памяти). Отредактируйте
/etc/systemd/journald.conf:[Journal] Storage=persistent # Максимальный размер журнала (например, 500M) SystemMaxUse=500M - Перезапустите службу:
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.