Что такое SMART Exporter и зачем он нужен
Технология S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) встроена в каждый современный HDD и SSD. Она собирает десятки атрибутов: температуру, количество ошибок чтения, число переназначенных секторов, степень износа ячеек SSD. Проблема в том, что эти данные бесполезны, пока вы их не видите. Диски умирают внезапно - так кажется, если не следить за их состоянием.
SMART Exporter решает эту задачу. Это скрипт, который запускает утилиту smartctl, извлекает ключевые атрибуты и отдаёт их в формате, понятном Prometheus. Метрики попадают в общий поток данных через textfile collector, встроенный в node_exporter. Вы получаете централизованный сбор показателей всех дисков на всех серверах без установки дополнительных агентов.
Какие метрики критически важны:
- Температура - рост выше 50°C для HDD и 70°C для SSD сигнализирует о проблемах с охлаждением.
- Reallocated Sectors Count - появление переназначенных секторов на HDD указывает на деградацию поверхности. Любое значение выше нуля - повод для пристального наблюдения.
- Wear Leveling Count / Media Wearout Indicator - для SSD показывает остаточный ресурс. Падение ниже 10% означает, что накопитель выработал свой срок.
- Raw Read Error Rate и Seek Error Rate - рост этих показателей предшествует механическим отказам.
Без мониторинга S.M.A.R.T. вы рискуете потерять данные и столкнуться с внезапным отказом сервера. Экспортер даёт время на плановую замену диска до того, как он выйдет из строя. Это не теория - это практика, проверенная на сотнях серверов. Если вы уже используете стек Prometheus, добавление SMART Exporter займёт 15 минут. Если только начинаете - начните с развёртывания стека мониторинга Prometheus и Grafana, а затем вернитесь к этой инструкции.
Подготовка сервера и установка необходимых пакетов
Для работы SMART Exporter требуется Linux-сервер с установленным node_exporter. Если node_exporter ещё не настроен, воспользуйтесь руководством по мониторингу Linux-сервера с Node Exporter - там описан процесс за 5 минут. Предполагаем, что Prometheus уже собирает метрики с этого хоста.
Первый шаг - установка пакета smartmontools, который содержит утилиту smartctl:
apt update && apt install smartmontools -y
Для CentOS/RHEL:
yum install smartmontools -y
После установки проверяем, что утилита доступна:
smartctl --version
Проверка поддержки S.M.A.R.T. на ваших дисках
Не все диски имеют S.M.A.R.T., и не на всех он включен. Проверяем каждый накопитель:
smartctl -i /dev/sda
В выводе ищите строки:
SMART support is: Available- устройство поддерживает технологию.SMART support is: Enabled- технология активна.
Если видите SMART support is: Disabled, включаем командой:
smartctl -s on /dev/sda
Если S.M.A.R.T. не поддерживается на уровне устройства - мониторинг невозможен. Такое встречается на старых HDD и некоторых виртуальных дисках. Для виртуальных машин мониторинг дисков имеет смысл только на уровне хостовой системы.
Проверьте все диски, которые планируете мониторить: /dev/sda, /dev/sdb, /dev/nvme0n1 и так далее. Для NVMe-дисков используется команда smartctl -i /dev/nvme0 (без указания раздела).
Установка и настройка SMART Exporter
SMART Exporter - это скрипт на bash или python, который вызывает smartctl, парсит вывод и формирует метрики в формате Prometheus. Мы используем проверенный вариант - bash-скрипт, который легко читается и не требует дополнительных зависимостей.
Скачиваем скрипт и размещаем его в системной директории:
curl -o /usr/local/bin/smart_exporter.sh https://raw.githubusercontent.com/.../smart_exporter.sh
chmod +x /usr/local/bin/smart_exporter.sh
Скрипт должен запускаться с правами, достаточными для выполнения smartctl. Утилите smartctl нужен доступ к устройству - либо через sudo, либо через добавление пользователя в группу disk:
usermod -aG disk prometheus
Где prometheus - пользователь, от которого работает node_exporter. После добавления в группу потребуется перелогин или перезапуск сервиса.
Проверяем работу скрипта вручную:
/usr/local/bin/smart_exporter.sh
Вывод должен содержать строки вида:
smart_device_health{device="/dev/sda",model="WDC WD40EFRX"} 1
smart_temperature_celsius{device="/dev/sda"} 34
smart_reallocated_sectors{device="/dev/sda"} 0
Настройка cron или systemd таймера для регулярного сбора метрик
Метрики S.M.A.R.T. меняются медленно - опрос раз в 5 минут более чем достаточен. Настраиваем cron:
*/5 * * * * /usr/local/bin/smart_exporter.sh > /var/lib/node_exporter/textfile_collector/smart.prom
Откройте редактор crontab:
crontab -e
Добавьте строку выше и сохраните. Убедитесь, что директория /var/lib/node_exporter/textfile_collector существует:
mkdir -p /var/lib/node_exporter/textfile_collector
chown prometheus:prometheus /var/lib/node_exporter/textfile_collector
Альтернативный вариант - systemd-таймер. Создайте файл сервиса /etc/systemd/system/smart-exporter.service:
[Unit]
Description=SMART Exporter for Prometheus
[Service]
Type=oneshot
User=prometheus
ExecStart=/usr/local/bin/smart_exporter.sh
StandardOutput=file:/var/lib/node_exporter/textfile_collector/smart.prom
И таймер /etc/systemd/system/smart-exporter.timer:
[Unit]
Description=Run SMART Exporter every 5 minutes
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target
Активируем таймер:
systemctl daemon-reload
systemctl enable smart-exporter.timer
systemctl start smart-exporter.timer
Проверяем, что файл метрик обновляется:
ls -la /var/lib/node_exporter/textfile_collector/smart.prom
cat /var/lib/node_exporter/textfile_collector/smart.prom
Интеграция с node_exporter через textfile collector
Node_exporter должен знать, откуда забирать метрики. При запуске ему передаётся аргумент:
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
Если вы устанавливали node_exporter по нашему руководству, этот параметр уже настроен. Проверьте конфигурацию systemd-юнита node_exporter:
systemctl cat node_exporter | grep textfile
Если параметра нет - добавьте его в ExecStart юнита и перезапустите сервис:
systemctl daemon-reload
systemctl restart node_exporter
Проверяем, что метрики отдаются:
curl -s http://localhost:9100/metrics | grep smart_
Вы должны увидеть те же строки, что и при ручном запуске скрипта. Node_exporter подхватывает все файлы с расширением .prom из указанной директории и добавляет их содержимое к своим метрикам.
Добавление SMART Exporter в конфигурацию Prometheus
Поскольку метрики отдаёт node_exporter, отдельный job в Prometheus не нужен. Данные S.M.A.R.T. уже включены в эндпоинт /metrics вашего node_exporter. Проверяем, что хост добавлен в prometheus.yml:
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.1.10:9100']
Если вы настраивали мониторинг по инструкции по развёртыванию стека мониторинга, этот шаг уже выполнен. Перезагружаем Prometheus для применения изменений:
systemctl reload prometheus
Открываем веб-интерфейс Prometheus (http://prometheus:9090/targets) и убеждаемся, что цель node_exporter в состоянии UP. Переходим в Graph и выполняем запрос:
smart_temperature_celsius
Если данные отображаются - интеграция работает.
Визуализация метрик S.M.A.R.T. в Grafana
Сырые метрики полезны для алертов, но для быстрой оценки состояния дисков нужен дашборд. Создайте новый дашборд в Grafana и добавьте панели для ключевых метрик.
Пример дашборда для мониторинга HDD
Для жестких дисков критичны механические показатели. Основные панели:
- Температура - запрос
smart_temperature_celsius{instance="$host", device="$disk"}. Порог - 50°C. - Reallocated Sectors Count - запрос
smart_reallocated_sectors{instance="$host", device="$disk"}. Любое значение выше 0 - повод для проверки. - Raw Read Error Rate - запрос
smart_raw_read_error_rate{instance="$host", device="$disk"}. Резкий рост за час - предвестник отказа. - Spin Retry Count - запрос
smart_spin_retry_count{instance="$host", device="$disk"}. Показывает проблемы с раскруткой шпинделя.
JSON-модель панели температуры для HDD:
{
"datasource": "Prometheus",
"targets": [{
"expr": "smart_temperature_celsius{instance=~\"$host\", device=~\"$disk\"}",
"legendFormat": "{{device}} - {{model}}"
}],
"title": "Температура HDD",
"type": "gauge",
"fieldConfig": {
"defaults": {
"thresholds": {
"steps": [
{ "color": "green", "value": null },
{ "color": "yellow", "value": 45 },
{ "color": "red", "value": 50 }
]
}
}
}
}
Пример дашборда для мониторинга SSD
Твердотельные накопители требуют других метрик - износ ячеек важнее механических ошибок:
- Wear Leveling Count - запрос
smart_wear_leveling_count{instance="$host", device="$disk"}. Показывает процент износа. Значение ниже 10 - диск под замену. - Media Wearout Indicator - аналог Wear Leveling для некоторых производителей. Запрос:
smart_media_wearout_indicator{instance="$host", device="$disk"}. - Used Reserved Block Count - запрос
smart_used_reserved_block_count{instance="$host", device="$disk"}. Рост указывает на исчерпание резервных блоков. - Program Fail Count - запрос
smart_program_fail_count{instance="$host", device="$disk"}. Ошибки записи - прямой путь к отказу.
Для обоих типов дисков настройте переменные дашборда: $host для выбора сервера и $disk для выбора конкретного накопителя. Это позволит использовать один дашборд для всего парка серверов.
Готовые дашборды можно импортировать через JSON-модель. Если вы работаете с дисковым пространством и inode, посмотрите также руководство по мониторингу дисков и inode через Netdata и Grafana - там описан альтернативный подход с прогнозированием заполнения.
Настройка алертов для критических ошибок дисков
Дашборд показывает текущее состояние, но реагировать на проблемы нужно автоматически. Создайте файл правил алертинга, например /etc/prometheus/rules/smart_alerts.yml:
groups:
- name: smart_alerts
rules:
- alert: DiskHighTemperature
expr: smart_temperature_celsius > 55
for: 5m
labels:
severity: warning
annotations:
summary: "Высокая температура диска {{ $labels.device }} на {{ $labels.instance }}"
description: "Температура {{ $value }}°C превышает порог 55°C"
- alert: DiskReallocatedSectors
expr: smart_reallocated_sectors > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Переназначенные сектора на {{ $labels.device }} ({{ $labels.instance }})"
description: "Обнаружено {{ $value }} переназначенных секторов. Диск деградирует."
- alert: DiskWearLevelLow
expr: smart_wear_leveling_count < 10
for: 5m
labels:
severity: critical
annotations:
summary: "Критический износ SSD {{ $labels.device }} на {{ $labels.instance }}"
description: "Остаточный ресурс {{ $value }}%. Немедленно замените накопитель."
- alert: DiskReallocatedSectorsIncrease
expr: rate(smart_reallocated_sectors[1h]) > 0
for: 10m
labels:
severity: critical
annotations:
summary: "Рост переназначенных секторов на {{ $labels.device }}"
description: "За последний час появились новые переназначенные сектора. Скорость: {{ $value }}/сек"
Подключите файл правил в prometheus.yml:
rule_files:
- "/etc/prometheus/rules/smart_alerts.yml"
Перезагрузите Prometheus и проверьте, что правила появились в разделе Alerts веб-интерфейса. Для отправки оповещений настройте Alertmanager - процесс описан в руководстве по настройке оповещений Prometheus.
Пороговые значения подбирайте под свою инфраструктуру. Для серверов в холодном дата-центре температура 55°C - уже критично. Для офисного помещения - допустимо. Алерт на переназначенные сектора должен срабатывать при любом значении выше нуля - появление даже одного такого сектора означает, что диск начал разрушаться.
Типичные проблемы и их решение
smartctl: command not found. Пакет smartmontools не установлен. Выполните apt install smartmontools или yum install smartmontools.
Permission denied при запуске smartctl. Пользователь, от которого работает скрипт, не имеет доступа к устройству. Добавьте его в группу disk: usermod -aG disk prometheus. После этого перезапустите сервис node_exporter или выполните перелогин.
Метрики не появляются в Prometheus. Проверьте цепочку: файл .prom создаётся? ls -la /var/lib/node_exporter/textfile_collector/. Node_exporter видит файл? curl -s http://localhost:9100/metrics | grep smart_. Prometheus достукивается до node_exporter? Проверьте Targets в веб-интерфейсе.
Файл метрик пустой или содержит ошибки. Запустите скрипт вручную и смотрите вывод. Частая причина - неправильный путь к устройствам в конфигурации скрипта. Укажите точный список дисков, исключив CD-ROM и виртуальные устройства.
Метрики есть, но Grafana показывает "No data". Проверьте datasource и переменные дашборда. Убедитесь, что в запросе правильно указаны instance и device. Регистр и спецсимволы в именах дисков должны совпадать с метриками.
NVMe-диски не отображаются. Для NVMe используется другой синтаксис: smartctl -a /dev/nvme0. Убедитесь, что скрипт экспортера поддерживает NVMe и правильно парсит их атрибуты.