Learning Platform
Глоссарий Troubleshooting
Урок 14.04 · 20 мин
Начальный
dmesglsblklspcilsusbHardware debuggingsmartctl

Дебаг железа — dmesg, lsblk, lspci, lsusb

Junior звонит в saturday утром: “сервер не видит второй диск, ETL упал”. Что вы делаете? Не паникуете и идёте через стандартный workflow: посмотреть kernel-логи (dmesg), увидеть, какие block-устройства видны (lsblk), проверить, видит ли железо PCI-шина (lspci), не отвалился ли SATA-кабель. Это и есть hardware debugging — 90% работы DBA/DevOps с железом.

В этом уроке: пять инструментов, которыми вы пользуетесь регулярно для понимания “что у меня в машине, в каком оно состоянии и что про него сказал kernel”.


dmesg — голос kernel

dmesg показывает kernel ring buffer — круговой буфер сообщений, которые kernel пишет в процессе работы. Каждый раз, когда драйвер загружается, устройство подключается, происходит ошибка, OOM-killer убивает процесс — запись в этот буфер. Размер обычно 1-4 МБ; старые записи вытесняются новыми.

# Полный лог (огромный):
$ dmesg | wc -l
1284

# Последние 20 строк:
$ dmesg | tail -20

# С человеческим timestamp:
$ dmesg -T | tail
[Sun May 18 09:12:34 2026] usb 1-2: new high-speed USB device number 6
[Sun May 18 09:12:34 2026] usb 1-2: New USB device found, idVendor=0951
[Sun May 18 09:12:34 2026] usb-storage 1-2:1.0: USB Mass Storage device detected
[Sun May 18 09:12:35 2026] scsi 4:0:0:0: Direct-Access Kingston DataTraveler 3.0
[Sun May 18 09:12:35 2026] sd 4:0:0:0: [sdc] 15826944 512-byte logical blocks
[Sun May 18 09:12:35 2026] sd 4:0:0:0: [sdc] Attached SCSI removable disk

# Только ошибки (level err и выше):
$ dmesg -l err,crit,emerg

# Поиск по подстроке:
$ dmesg | grep -i 'oom\|killed\|error'
dmesg как timeline kernel events
BootBoot messages: kernel version, CPU detected, memory, initial drivers, root mount. Ценные сведения о hardware-составе системы
RuntimeUSB hotplug, drivers loaded/unloaded, network up/down, filesystem errors, IO errors, OOM-killer activity
ErrorsCritical events: panic, EDAC RAM errors, I/O errors (read failed), filesystem corruption, OOM killer выбрал процесс
Hardware faultsMCE (Machine Check Exceptions), PCIe AER errors -- если железо начинает умирать, первое предупреждение здесь

dmesg хранит только runtime-сообщения, которые не вытеснены. Для постоянного хранения logs идут в systemd-journal (отдельный урок 13.3). journalctl -k — те же kernel messages, но из persistent storage и с возможностью смотреть за несколько boot-ов: journalctl -k -b -1 — предыдущая загрузка.

Особо важные паттерны в dmesg:

  • oom-killer: Out of memory — OOM убил процесс, нужно увеличить память или поправить leak.
  • task X blocked for more than 120 seconds — процесс висит в D state (waiting IO), вероятно проблема с диском.
  • I/O error, dev sdc, sector ... — bad sector на диске. Срочно бэкап и замена.
  • EDAC MC0: 1 CE memory read error — ECC RAM словил ошибку. Один раз — норма, постоянно — меняйте плашку.
  • nvme nvme0: I/O X QID Y timeout, aborting — NVMe firmware-проблема или умирает.

lsblk — block devices в виде дерева

lsblk показывает все block devices иерархически:

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda           8:0    0   1.8T  0 disk
|-sda1        8:1    0   512M  0 part  /boot/efi
|-sda2        8:2    0   2G    0 part  /boot
`-sda3        8:3    0   1.8T  0 part
  `-vg-root 253:0    0   500G  0 lvm   /
nvme0n1     259:0    0   1.8T  0 disk
|-nvme0n1p1 259:1    0   500M  0 part  /boot/efi
`-nvme0n1p2 259:2    0   1.7T  0 part  /
sdb           8:16   0   3.6T  0 disk
`-sdb1        8:17   0   3.6T  0 part  /data
sdc           8:32   1  14.7G  0 disk
`-sdc1        8:33   1  14.7G  0 part  /media/lev/USB

Колонки:

  • NAME — имя в /dev (без /dev/ префикса).
  • MAJ:MIN — major:minor (для драйвер-диспатча).
  • RM — removable (1 для USB, 0 для встроенных).
  • SIZE — общий размер.
  • RO — read-only.
  • TYPE — disk / part / lvm / crypt / raid.
  • MOUNTPOINTS — куда смонтировано.

Полезные опции:

# С UUID, LABEL, FSTYPE -- удобно для fstab:
$ lsblk -f
NAME      FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
|-sda1    vfat   FAT32       2C25-6541                                          /boot/efi
|-sda2    ext4   1.0         abcdef-...                            1.5G   25%   /boot
nvme0n1
`-nvme0n1p2 ext4 1.0   /     5d3e0f4a-1234-5678-9abc-def012345678  1.2T   33%   /

# Только модели и серийник (полезно для inventarisation):
$ lsblk -d -o NAME,SIZE,MODEL,SERIAL,VENDOR
NAME    SIZE MODEL                    SERIAL          VENDOR
sda     1.8T Samsung SSD 870 EVO 1TB  S5RXNF0R...     ATA
nvme0n1 1.8T Samsung 990 PRO 2TB      S6Z2NJ0T...
sdb     3.6T WDC WD40EZAZ-00ZSCB0     WD-WC...        ATA

# Только смонтированные:
lsblk -p | grep MOUNT

lsblk -f — мой любимый, потому что показывает UUID и filesystem — то что нужно для /etc/fstab.


lspci — что воткнуто в PCIe

PCIe — основная шина для современных устройств: NVMe-диски, видеокарты, сетевые карты, USB-контроллеры. lspci показывает inventory:

$ lspci | head
00:00.0 Host bridge: Intel Corporation Device 9b53 (rev 03)
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics (rev 02)
00:14.0 USB controller: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller
00:17.0 SATA controller: Intel Corporation Cannon Lake PCH SATA AHCI Controller
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM981/PM983
02:00.0 Ethernet controller: Intel Corporation I219-V
03:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201

# Подробнее с verbose:
$ lspci -v -s 01:00.0
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller
        Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller
        Kernel driver in use: nvme
        Kernel modules: nvme

# Дерево с шинами:
$ lspci -t
-[0000:00]-+-00.0
           +-02.0
           +-14.0
           +-17.0
           +-1c.0-[01]----00.0
           +-1c.4-[02]----00.0
           +-1f.0
           +-1f.4

# Тип шины и скорости:
$ lspci -vv -s 01:00.0 | grep -i 'lnk\|speed'
        LnkCap: Port #0, Speed 8GT/s, Width x4, ASPM L1
        LnkSta: Speed 8GT/s, Width x4

Что важно:

  • Kernel driver in use — какой драйвер обслуживает устройство. Если нет — “Kernel modules:” подскажет какие подойдут.
  • LnkSta: Speed XGT/s, Width xN — актуальная скорость PCIe. Для NVMe Gen4 ожидаем 16 GT/s x4 — если получили 8 GT/s x2, что-то не так (BIOS bifurcation, кривой M.2 slot).

Формат 00:14.0 — bus:device.function (BDF). По нему можно жёстко привязать драйвер или искать в /sys/bus/pci/devices/0000:00:14.0/.


lsusb — что воткнуто в USB

$ lsusb
Bus 002 Device 002: ID 8087:8001 Intel Corp. Integrated Hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 046d:c534 Logitech, Inc. Unifying Receiver
Bus 001 Device 004: ID 0951:1666 Kingston Technology DataTraveler 100 G3
Bus 001 Device 002: ID 8087:8000 Intel Corp. Integrated Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

# Дерево с скоростями:
$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
    |__ Port 4: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 480M
    |__ Port 6: Dev 5, If 0, Class=HID, Driver=usbhid, 12M
    |__ Port 6: Dev 5, If 1, Class=HID, Driver=usbhid, 12M

# Подробно об устройстве:
$ lsusb -v -d 0951:1666 | head -40

Особенно полезно lsusb -t:

  • Driver= — какой драйвер обслуживает. Если нет драйвера — “No driver claimed”.
  • <число>M — скорость порта. 480M = USB 2.0 High Speed; 5000M = USB 3.0; 10000M = USB 3.1; 20000M = USB 3.2; 40000M = USB4.

Частая жалоба: “USB-флешка медленная”. Смотрим lsusb -t — если 480M вместо 5000M, флешка работает в USB 2.0 режиме. Возможно, она воткнута в USB 2.0 порт или в USB 3.0 порт через USB 2.0 хаб.

USB ID 0951:1666vendor:product. Эти ID есть в /usr/share/misc/usb.ids (база известных vendors).


fdisk и parted — таблицы разделов

# Информация о всех дисках:
$ sudo fdisk -l
Disk /dev/nvme0n1: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors
Disk model: Samsung SSD 990 PRO 2TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: ABCD1234-...

Device           Start        End    Sectors  Size Type
/dev/nvme0n1p1    2048    1050623    1048576  512M EFI System
/dev/nvme0n1p2 1050624 4000795647 3999745024  1.9T Linux filesystem

# Современная альтернатива:
$ sudo parted /dev/nvme0n1 print
Model: Samsung SSD 990 PRO 2TB (nvme)
Disk /dev/nvme0n1: 2048GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name                  Flags
 1      1049kB  538MB   537MB   fat32        EFI System Partition  boot, esp
 2      538MB   2048GB  2048GB  ext4

fdisk -l без аргументов — показывает все диски. Очень полезно когда не знаете названия. parted — современнее, поддерживает GPT (для дисков > 2 ТБ). Не используйте для записи на смонтированный диск.


smartctl — здоровье диска

Современные диски (HDD, SSD, NVMe) поддерживают SMART — self-monitoring и attributes. Это датчики внутри диска: температура, число reallocated sectors, total bytes written, час работы. smartctl (пакет smartmontools) их читает.

$ sudo smartctl -a /dev/nvme0n1
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.5.0-21-generic]
=== START OF INFORMATION SECTION ===
Model Number:                       Samsung SSD 990 PRO 2TB
Serial Number:                      S6Z2NJ0T...
Firmware Version:                   1B2QJXD7
PCI Vendor/Subsystem ID:            0x144d
Total NVM Capacity:                 2,000,398,934,016 [2.00 TB]
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02)
Critical Warning:                   0x00
Temperature:                        38 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    2%
Data Units Read:                    52,142,840 [26.6 TB]
Data Units Written:                 187,234,560 [95.8 TB]
Host Read Commands:                 423,118,234
Host Write Commands:                3,456,789,012
Controller Busy Time:               845
Power Cycles:                       42
Power On Hours:                     8,234
Unsafe Shutdowns:                   3
Media and Data Integrity Errors:    0
Error Information Log Entries:      0
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0

Что смотрим:

  • Available Spare — сколько резервных блоков осталось. Если менее 10% — SSD близко к концу.
  • Percentage Used — процент wear (для SSD). 100% значит ресурс исчерпан (но обычно работает дальше).
  • Critical Warning — ненулевое значит серьёзные проблемы (firmware говорит).
  • Data Units Written — сколько всего записано. Используется для оценки TBW (terabytes written endurance).
  • Media and Data Integrity Errors — ошибки чтения/записи. Должно быть 0.

Для HDD/SATA SSD атрибуты другие:

$ sudo smartctl -A /dev/sda
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   12345
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   234
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   0

Reallocated_Sector_Ct > 0 — диск встретил bad sector, переназначил резервный. Один-два — норма. Растущее — тревога.

# Запустить self-test:
sudo smartctl -t short /dev/sda   # 1-2 минуты
sudo smartctl -t long /dev/sda    # часы
# Посмотреть результат после:
sudo smartctl -l selftest /dev/sda

hdparm и nvme: спец-команды

# Скорость чтения диска:
sudo hdparm -t /dev/sda
/dev/sda: Timing buffered disk reads: 1428 MB in 3.00 seconds = 475.91 MB/sec

# Для NVMe -- свой инструмент:
sudo nvme list                              # список NVMe устройств
sudo nvme id-ctrl /dev/nvme0                # controller info
sudo nvme smart-log /dev/nvme0              # SMART-данные
sudo nvme ocp smart-add-log /dev/nvme0      # Open Compute SMART (если поддерживается)

nvme — утилита из пакета nvme-cli для специфичных NVMe-команд: management latency, namespaces, secure erase.


Workflow: диагностика “диск не виден”

Реальный сценарий: воткнули второй диск, lsblk не показывает. Идём по дереву:

  1. dmesg | tail -50 — что говорит kernel?

    • Видим “ata2: SATA link up” — железо обнаружено.
    • Видим “Failed to handle ID 4: no response” — SATA-кабель плохой или диск умер.
    • Ничего не видим — кабель не воткнут.
  2. lspci — SATA-контроллер виден?

  3. ls /sys/class/scsi_disk/ — какие SCSI-устройства зарегистрированы?

  4. fdisk -l — видит диск как unallocated? Тогда создайте таблицу partitions.

  5. smartctl -i /dev/sdX — что диск говорит сам про себя? Если “smartctl: device opened but…” — диск отвечает, но SMART отключён или диск битый.

  6. partprobe — если меняли таблицу разделов на смонтированном диске, kernel может не подхватить. partprobe /dev/sdb — сообщить kernel.


Попробуй сам

# 1. Свежие kernel-логи:
dmesg -T | tail -30

# 2. Все ошибки в kernel-логе:
dmesg -l err,crit,alert,emerg

# 3. Дерево всех block-устройств:
lsblk -p
# С UUID:
lsblk -f

# 4. PCIe-инвентарь:
lspci
# С драйверами:
lspci -k | grep -A2 'Ethernet\|Non-Volatile\|VGA'

# 5. USB-инвентарь с скоростями:
lsusb -t

# 6. Здоровье основного диска:
sudo smartctl -H /dev/sda 2>/dev/null || sudo smartctl -H /dev/nvme0n1
# Или для NVMe:
sudo nvme smart-log /dev/nvme0

# 7. Замерить скорость чтения:
sudo hdparm -t /dev/sda 2>/dev/null
# или (универсально):
sudo dd if=/dev/sda of=/dev/null bs=1M count=1000 status=progress

# 8. Полная инвентаризация системы в одну строку:
lscpu | head -10
free -h
lsblk -d -o NAME,SIZE,MODEL
lspci | grep -i 'ethernet\|nvme\|sata'
Disk emergency: что делать когда диск 100% или не монтируется
Проверка знанийKnowledge check
Production-сервер. Postgres внезапно стал медленным. iowait в top -- 60 процентов. Я подозреваю проблемы с диском. С чего начать диагностику hardware?
ОтветAnswer
Высокий iowait означает 'CPU ждёт IO от диска'. Источников может быть несколько: диск физически умирает, диск загружен (queue length), filesystem corruption, или просто workload растёт. Hardware-диагностика идёт так: 1. dmesg в первую очередь: dmesg -T | tail -100 Ищем: 'I/O error, dev sdc, sector ...', 'task X blocked for more than 120 seconds', 'EXT4-fs error', 'nvme: I/O QID timeout'. Если хоть что-то из этого видим -- диск умирает или умер. 2. SMART-проверка: sudo smartctl -H /dev/sda # overall health sudo smartctl -A /dev/sda # все attributes Смотрим: Reallocated_Sector_Ct (если > 0 и растёт -- bad sectors), Current_Pending_Sector (>0 -- sector подвис при чтении), Power_On_Hours (старый диск?), для SSD -- Wearout_Indicator или Percentage_Used. Для NVMe: sudo nvme smart-log /dev/nvme0 -- смотрим Critical Warning, Available Spare, Media and Data Integrity Errors. 3. iostat для понимания нагрузки: iostat -xz 2 Колонки: r/s (read req/s), w/s (write req/s), rkB/s (МБ чтения/с), wkB/s, await (среднее время ожидания), util%. Если util%=100% и await высокий -- диск перегружен. Если util% менее 50% но await высокий -- возможно sector seeks (плохо для HDD) или мелкие случайные I/O. Это даст контекст. 4. iotop -- кто конкретно ест IO: sudo iotop -o Если 90% IO от postgres -- ну хорошо, нормально. Если от какого-то backup-скрипта -- вот и причина деградации в момент его запуска. 5. dd для baseline: sudo hdparm -tT /dev/sda # cached и uncached read Сравните с обычным baseline. Если раньше выдавал 500 МБ/с, теперь 50 МБ/с -- что-то сломалось. 6. NVMe-специфика (если NVMe): sudo nvme id-ctrl /dev/nvme0 | grep -i 'tdp\|temp' Проверить thermal throttling: некоторые NVMe при перегреве уходят в slow mode. Сенсор: cat /sys/class/nvme/nvme0/device/hwmon*/temp1_input -- температура в милли-цельсиях. 7. Если SMART показал bad sectors -- срочно бэкап и замена. Bad sectors имеют свойство расти лавинообразно. На SSD -- если Available Spare < 10%, тоже срочно менять. 8. Если SMART OK, iowait высокий из-за реальной нагрузки -- значит time to scale: добавить диск, RAID 0/10, или мигрировать на NVMe. Первым делом -- dmesg и smartctl. Они отвечают 'у нас умирает диск или нет' в 2 минуты. Это ответ, который меняет всё дальнейшее.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 6. Что такое dmesg и в чём разница с journalctl -k?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4