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 | Атрибут | Что означает | Когда тревожиться |
|---|---|---|---|
| 5 | Reallocated_Sector_Ct | Сектора, переназначенные в резервную область | Любой рост; больше 0 — на контроль |
| 187 | Reported_Uncorrect | Ошибки, которые диск не смог исправить | Больше 0 |
| 188 | Command_Timeout | Команды, не завершившиеся вовремя | Рост за сутки |
| 197 | Current_Pending_Sector | Нестабильные сектора, ожидающие переназначения | Больше 0 — сразу |
| 198 | Offline_Uncorrectable | Сектора, не прочитанные при фоновой проверке | Больше 0 — сразу |
Отдельно — 199 UDMA_CRC_Error_Count. Это ошибки передачи между диском и контроллером. Сам диск обычно исправен: виноват кабель, разъём или корзина. Счётчик никогда не сбрасывается, поэтому важен не абсолют, а прирост. Растёт — меняйте кабель, а не диск.
9 Power_On_Hours и 194 Temperature_Celsius отказ не предсказывают, но полезны для планирования: диску в кассовом сервере, проработавшему 50 000 часов при 48 °C в шкафу без вентиляции, пора на пенсию даже с идеальными счётчиками.
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 WarningNVMe. - Рост атрибута 199 — меняем кабель, а не диск.
- Для каждого сервера есть запасной диск нужного типа — или известно, где его купить за день.
- И главное: SMART не отменяет резервных копий. Про них — в статье о схеме 3-2-1.