Дебаг железа — 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 хранит только 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:1666 — vendor: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 не показывает. Идём по дереву:
-
dmesg | tail -50 — что говорит kernel?
- Видим “ata2: SATA link up” — железо обнаружено.
- Видим “Failed to handle ID 4: no response” — SATA-кабель плохой или диск умер.
- Ничего не видим — кабель не воткнут.
-
lspci — SATA-контроллер виден?
-
ls /sys/class/scsi_disk/ — какие SCSI-устройства зарегистрированы?
-
fdisk -l — видит диск как unallocated? Тогда создайте таблицу partitions.
-
smartctl -i /dev/sdX — что диск говорит сам про себя? Если “smartctl: device opened but…” — диск отвечает, но SMART отключён или диск битый.
-
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% или не монтируется