SMART: как заметить умирающий диск за месяц до отказа

За 2025 год мы заменили у клиентов 23 диска. Двадцать из них — заранее, по сигналу мониторинга, в плановое окно. Три отказали внезапно. Рассказываем, на что смотреть, чтобы соотношение было таким же или лучше.

Что такое SMART и чего он не умеет

SMART (Self-Monitoring, Analysis and Reporting Technology) — набор счётчиков, которые диск ведёт сам о себе: сколько секторов пришлось переназначить, сколько было ошибок чтения, сколько часов он проработал, какая температура. Читать их в Linux удобнее всего утилитой smartctl из пакета smartmontools.

sudo apt install smartmontools
sudo smartctl -i /dev/sda      # модель, серийный номер, поддержка SMART
sudo smartctl -H /dev/sda      # итоговый вердикт: PASSED / FAILED
sudo smartctl -A /dev/sda      # таблица атрибутов

Главное, что нужно знать: вердикт PASSED почти ничего не значит. Производитель выставляет пороги так, что диск «проваливает» самотест уже в агонии. Исследования крупных хранилищ показывают, что заметная доля дисков отказывает вообще без предупреждающих атрибутов. Поэтому SMART — это ранний сигнал для части отказов, а не замена резервным копиям и RAID.

Атрибуты, которые действительно важны

В выводе smartctl -A смотрите на колонку RAW_VALUE, а не на нормализованные VALUE и THRESH. Для жёстких дисков и SATA SSD нас интересуют пять счётчиков:

IDАтрибутЧто означаетКогда тревожиться
5Reallocated_Sector_CtСектора, переназначенные в резервную областьЛюбой рост; больше 0 — на контроль
187Reported_UncorrectОшибки, которые диск не смог исправитьБольше 0
188Command_TimeoutКоманды, не завершившиеся вовремяРост за сутки
197Current_Pending_SectorНестабильные сектора, ожидающие переназначенияБольше 0 — сразу
198Offline_UncorrectableСектора, не прочитанные при фоновой проверкеБольше 0 — сразу

Отдельно — 199 UDMA_CRC_Error_Count. Это ошибки передачи между диском и контроллером. Сам диск обычно исправен: виноват кабель, разъём или корзина. Счётчик никогда не сбрасывается, поэтому важен не абсолют, а прирост. Растёт — меняйте кабель, а не диск.

9 Power_On_Hours и 194 Temperature_Celsius отказ не предсказывают, но полезны для планирования: диску в кассовом сервере, проработавшему 50 000 часов при 48 °C в шкафу без вентиляции, пора на пенсию даже с идеальными счётчиками.

0 40 80 120 первое оповещение отказ неделя 1 неделя 10
Типичная картина из нашего мониторинга: Reallocated_Sector_Ct начал расти за шесть недель до отказа

NVMe: другие названия, тот же смысл

У NVMe-накопителей нет таблицы атрибутов с ID. Вместо неё — стандартный журнал здоровья:

sudo smartctl -a /dev/nvme0
...
Critical Warning:                   0x00
Temperature:                        41 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    7%
Media and Data Integrity Errors:    0
Error Information Log Entries:      12
Unsafe Shutdowns:                   38
  • Critical Warning — битовая маска; любое значение, кроме 0x00, — повод действовать сегодня.
  • Available Spare — остаток резервных ячеек. Падение к порогу (Available Spare Threshold) означает скорый переход в режим только чтения.
  • Percentage Used — оценка износа по ресурсу записи. 100 % не означает смерть, но гарантия закончилась; планируйте замену с 80 %.
  • Media and Data Integrity Errors — аналог неисправимых ошибок. Должно быть 0.
  • Error Information Log Entries часто растёт из-за безобидных запросов драйвера — смотрите на него в последнюю очередь.
  • Unsafe Shutdowns — сколько раз пропадало питание без корректного выключения. Если растёт — проверьте ИБП.

Настройка smartd

Демон smartd из того же пакета регулярно опрашивает диски, запускает самотесты и сообщает об изменениях. Минимальный рабочий конфиг /etc/smartd.conf:

# Все найденные диски: следить за всеми атрибутами (-a),
# включить автосохранение атрибутов (-S on) и фоновую проверку (-o on),
# не будить спящие диски (-n standby),
# короткий тест каждый день в 02:00, длинный — по субботам в 03:00,
# температура: сообщать о скачке на 4 °C, предупреждение с 45, тревога с 55.
DEVICESCAN -a -o on -S on -n standby,q \
  -s (S/../.././02|L/../../6/03) \
  -W 4,45,55 \
  -m root -M exec /usr/local/sbin/smart-notify

Скрипт из -M exec получает текст события в стандартный ввод и переменные окружения SMARTD_DEVICE, SMARTD_FAILTYPE, SMARTD_MESSAGE. Мы пересылаем их в систему мониторинга, но для начала хватит и почты:

#!/bin/sh
# /usr/local/sbin/smart-notify
{
  echo "Хост: $(hostname -f)"
  echo "Диск: $SMARTD_DEVICE ($SMARTD_DEVICETYPE)"
  echo "Тип:  $SMARTD_FAILTYPE"
  echo
  cat
} | mail -s "SMART: $SMARTD_FAILTYPE на $(hostname -s)" admin@example.org
sudo chmod +x /usr/local/sbin/smart-notify
sudo systemctl restart smartmontools    # в Debian/Ubuntu служба называется так
sudo journalctl -u smartmontools -n 30  # убедиться, что все диски подхвачены

Проверить, что оповещения доходят, можно, временно добавив в строку конфига ключ -M test: при запуске smartd отправит тестовое сообщение по каждому диску.

Диски за RAID-контроллером

Аппаратный RAID показывает системе один логический том, и smartctl -a /dev/sda вернёт данные контроллера, а не дисков. Каждый физический диск нужно опрашивать через тип устройства:

# Контроллеры на базе LSI/Broadcom MegaRAID: диски с номерами 0, 1, 2...
sudo smartctl -a -d megaraid,0 /dev/sda
# HP Smart Array
sudo smartctl -a -d cciss,0 /dev/sg0
# Найти всё, что видит smartctl
sudo smartctl --scan-open

В smartd.conf такие диски описываются отдельными строками вместо DEVICESCAN, по строке на каждый физический диск. Программный RAID (mdadm) и ZFS этого не требуют: каждый диск виден системе напрямую.

Пороги оповещений

Если вы собираете метрики в Prometheus через smartctl_exporter, вот правила, с которыми мы живём у клиентов. Они намеренно чувствительные: ложная тревога стоит пятнадцать минут инженера, пропущенный отказ — выходных.

groups:
- name: disks
  rules:
  - alert: DiskSectorsReallocatedGrowing
    expr: increase(smartctl_device_attribute{attribute_name="Reallocated_Sector_Ct",attribute_value_type="raw"}[7d]) > 0
    labels: {severity: warning}
    annotations:
      summary: "{{ $labels.device }}: растёт число переназначенных секторов"
  - alert: DiskPendingSectors
    expr: smartctl_device_attribute{attribute_name=~"Current_Pending_Sector|Offline_Uncorrectable",attribute_value_type="raw"} > 0
    for: 1h
    labels: {severity: critical}
  - alert: NvmeSpareLow
    expr: smartctl_device_available_spare < 30
    labels: {severity: warning}
  - alert: DiskTooHot
    expr: smartctl_device_temperature > 55
    for: 15m
    labels: {severity: warning}

Имена метрик зависят от версии экспортёра — сверьте их со своим выводом /metrics перед применением.

Короткий чек-лист

  • На каждом сервере стоит smartmontools, служба запущена, все диски видны в журнале.
  • Короткий самотест — ежедневно, длинный — еженедельно, ночью.
  • Оповещение на любой рост атрибутов 5, 187, 197, 198 и на Critical Warning NVMe.
  • Рост атрибута 199 — меняем кабель, а не диск.
  • Для каждого сервера есть запасной диск нужного типа — или известно, где его купить за день.
  • И главное: SMART не отменяет резервных копий. Про них — в статье о схеме 3-2-1.