Диски втомлюються, як і люди 🙂 Тож краще дізнаватися про їхнє здоров’я завчасно. У цій інструкції я покажу, як ви можете увімкнути розумний Linux моніторинг S.M.A.R.T. для HDD/NVMe з smartmontools, експортувати метрики в Prometheus і отримувати алерти у Grafana. Працюємо у термінал Linux, пишемо невеликі bash скрипти і автоматизуємо запуск через cron та systemd timers.
Що таке S.M.A.R.T. і чому це важливо
S.M.A.R.T. — це вбудований у диск самодіагностичний моніторинг. Він показує температуру, кількість переназначених секторів, помилки CRC, попередження NVMe тощо. Коли один з атрибутів іде вгору, це ранній сигнал про ризик відмови. Задовго до того, як система почне падати, ви вже матимете алерт у Grafana і час на резервну копію й заміну накопичувача.
Встановлення smartmontools і базова перевірка
Спершу інсталюємо інструменти та перевіримо, що SMART увімкнений.
# Debian/Ubuntu
sudo apt update
sudo apt install -y smartmontools jq prometheus-node-exporter
# Fedora/RHEL/Alma/Rocky
sudo dnf install -y smartmontools jq
# Подивитися диски
lsblk -d -o NAME,SIZE,TYPE,MODEL
# Перевірити SMART для диска (пристосуйте /dev/sda або /dev/nvme0)
sudo smartctl -i /dev/sda
sudo smartctl -a --json /dev/sda | jq .
Опційно вмикаємо періодичні самотести та логи через smartd (сервіс із складу smartmontools):
# Резервна копія та мінімальна конфігурація smartd
sudo cp /etc/smartd.conf /etc/smartd.conf.bak
sudo bash -c 'cat > /etc/smartd.conf << "EOF"
DEVICESCAN -H -a -o on -S on -n standby,q -s (S/../.././03)
EOF'
# Запустити і в автозавантаження
sudo systemctl enable --now smartd
Експорт метрик SMART у Prometheus (через textfile collector)
Найпростіший шлях — не писати повноцінний експортер, а скласти метрики у файл, який прочитає node_exporter (textfile collector). Для цього створимо директорію та bash скрипт.
# Директорія для метрик textfile collector
sudo mkdir -p /var/lib/node_exporter/textfile_collector
# Скрипт експорту SMART->Prometheus
sudo bash -c 'cat > /usr/local/bin/smartmon_exporter.sh << "EOF"
#!/usr/bin/env bash
set -euo pipefail
OUT="/var/lib/node_exporter/textfile_collector/smartmon.prom"
TMP="$(mktemp)"
echo "# SMART metrics generated: $(date -u +%FT%TZ)" > "$TMP"
# Перелік блочних пристроїв типу disk
mapfile -t DISKS < <(lsblk -dn -o NAME,TYPE | awk '\''$2=="disk"{print "/dev/"$1}'\'')
for DEV in "${DISKS[@]}"; do
JSON=$(sudo smartctl -a -j "$DEV" 2>/dev/null || true)
if [[ -z "$JSON" ]] || ! echo "$JSON" | jq -e . >/dev/null 2>&1; then
continue
fi
echo "$JSON" | jq -r --arg dev "$DEV" '
def attr(id): (.ata_smart_attributes.table[]? | select(.id==id) | .raw.value) // 0;
{
dev: $dev,
model: (.model_name // .device.model_name // "unknown"),
serial: (.serial_number // "na"),
passed: (if .smart_status.passed==true then 1 else 0 end),
temp: (.temperature.current // .nvme_smart_health_information_log.temperature // 0),
realloc: attr(5),
pending: attr(197),
crc: attr(199),
poh: (.power_on_time.hours // .nvme_smart_health_information_log.power_on_hours // 0),
nvme_warn: (.nvme_smart_health_information_log.critical_warning // 0)
}
| "smartmon_device_smart_healthy{disk=\"\(.dev)\",model=\"\(.model)\",serial=\"\(.serial)\"} \(.passed)\n" +
"smartmon_temperature_celsius{disk=\"\(.dev)\"} \(.temp)\n" +
"smartmon_reallocated_sectors{disk=\"\(.dev)\"} \(.realloc)\n" +
"smartmon_pending_sectors{disk=\"\(.dev)\"} \(.pending)\n" +
"smartmon_crc_errors{disk=\"\(.dev)\"} \(.crc)\n" +
"smartmon_power_on_hours{disk=\"\(.dev)\"} \(.poh)\n" +
"smartmon_nvme_critical_warning{disk=\"\(.dev)\"} \(.nvme_warn)"
' >> "$TMP"
done
mv "$TMP" "$OUT"
EOF'
sudo chmod +x /usr/local/bin/smartmon_exporter.sh
# Пробний запуск і перегляд згенерованих метрик
sudo /usr/local/bin/smartmon_exporter.sh
sudo tail -n +1 /var/lib/node_exporter/textfile_collector/smartmon.prom
За потреби увімкніть textfile collector у вашому node_exporter і вкажіть директорію:
# Приклад: додаємо параметри запуску (для systemd unit може відрізнятися)
# Переконайтеся, що node_exporter стартує з опціями:
# --collector.textfile --collector.textfile.directory=/var/lib/node_exporter/textfile_collector
sudo systemctl restart prometheus-node-exporter
Автоматизація запуску скрипта (systemd timer)
Надійніше за cron — systemd-таймери. Створимо сервіс і таймер, що оновлює метрики кожні 5 хвилин.
# Сервіс, який виконує експорт
sudo bash -c 'cat > /etc/systemd/system/smartmon_exporter.service << "EOF"
[Unit]
Description=Export SMART metrics to Prometheus textfile
[Service]
Type=oneshot
ExecStart=/usr/local/bin/smartmon_exporter.sh
[Install]
WantedBy=multi-user.target
EOF'
# Таймер кожні 5 хвилин
sudo bash -c 'cat > /etc/systemd/system/smartmon_exporter.timer << "EOF"
[Unit]
Description=Run SMART exporter every 5 minutes
[Timer]
OnBootSec=2m
OnUnitActiveSec=5m
Unit=smartmon_exporter.service
[Install]
WantedBy=timers.target
EOF'
sudo systemctl daemon-reload
sudo systemctl enable --now smartmon_exporter.timer
systemctl list-timers | grep smartmon_exporter
Додавання в Prometheus
Переконайтеся, що Prometheus збирає метрики з вашого node_exporter. Приклад секції у /etc/prometheus/prometheus.yml:
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node1:9100'] # замініть на адресу вашого node_exporter
GUI-спосіб: дашборд і алерти в Grafana
Швидкий дашборд
У Grafana створіть панелі з такими PromQL-запитами:
# Температура дисків
smartmon_temperature_celsius
# Загальний статус SMART (0 = проблема)
smartmon_device_smart_healthy
# Погіршення атрибутів
smartmon_reallocated_sectors
smartmon_pending_sectors
smartmon_crc_errors
# NVMe критичні попередження
smartmon_nvme_critical_warning
Алерти (Managed Alerts у Grafana)
Створіть Contact point, Notification policy, а далі Alert rules з такими умовами:
# 1) Диск позначає SMART як не пройдений
smartmon_device_smart_healthy == 0
# 2) Занадто гаряче: понад 55°C протягом 10 хвилин
max by (disk) (smartmon_temperature_celsius) > 55
# 3) З’явилися нові переназначені або pending-сектори за 6 годин
increase(smartmon_reallocated_sectors[6h]) > 0 OR increase(smartmon_pending_sectors[6h]) > 0
# 4) NVMe critical warning
smartmon_nvme_critical_warning > 0
Порада: додайте лейбл disk у summary кожного правила, щоб в повідомленні було видно конкретний пристрій. Алерти краще «тиснути» через 5–10 хвилин, щоб уникнути шуму від випадкових сплесків.
Альтернативні способи
- smartd з email: smartd уміє надсилати листи при порогових значеннях без Prometheus/Grafana. Легко, але метрик і графіків менше.
- Готовий експортер: використайте smartctl_exporter від спільноти Prometheus (пакет/контейнер). Менше коду, але додаткова служба.
- Telegraf/InfluxDB/Grafana: якщо у вас стек Influx, є вбудований input smartctl.
FAQ
Чому метрики не з’являються?
Перевірте: 1) скрипт створює файл smartmon.prom; 2) node_exporter запущений з увімкненим textfile collector і правильною директорією; 3) Prometheus справді скрапає ваш node_exporter (Status → Targets). Переконайтеся, що права на файл дозволяють читання користувачу node_exporter.
SMART каже «непідтримувано» для USB-диска
Частина USB-контейнерів не пробрасывают SMART. Спробуйте інший бокс або пряме SATA/NVMe підключення. Для деяких адаптерів допомагає опція -d sat у smartctl.
RAID/апаратні контролери не показують атрибути
Потрібен доступ до фізичних дисків за допомогою утиліт конкретного контролера (megacli, storcli тощо) або passthrough. На віртуалізації — попросіть проброс пристрою.
NVMe-диск: де брати годинник роботи і попередження?
У нашому скрипті використовується .nvme_smart_health_information_log — там є power_on_hours, temperature, critical_warning. Для SATA значення беруться з атрибутів ATA (ID 5, 9, 197, 199).
Чи не розбудить це сплячі HDD?
У smartd використовуйте -n standby,q, а у власному скрипті — плануйте рідке опитування (наприклад, раз на 15 хв). Якщо диск заснув, smartctl намагатиметься читати обережно, але деякі моделі все одно прокидаються.
Чи можна зробити без root?
Читання SMART зазвичай вимагає root-доступу. Запускайте експортер як root, а файл метрик залишайте з правами читання для користувача node_exporter.
Порада від Kernelka
Не зволікайте з алертами про reallocated або pending сектори — навіть якщо все працює, це перший дзвіночок. Негайно зробіть резервну копію і замовте заміну диска. І ще: налаштуйте тихі, але помітні канали сповіщення в Grafana (Telegram/Email) — щоб не проспати важливе 😺
Підсумок
- Встановили smartmontools і перевірили S.M.A.R.T. статуст дисків.
- Зробили bash скрипти, що експортують ключові метрики у textfile collector.
- Автоматизували збір через cron та systemd timers (таймер systemd кожні 5 хвилин).
- Додали метрики в Prometheus і створили дашборд та алерти у Grafana.
- Передбачили альтернативи: smartd email, готові експортери, Telegraf.