Автоматический мониторинг дисков с уведомлениями в Telegram и email: пошаговое руководство | AdminWiki

Автоматический мониторинг дисков с уведомлениями в Telegram и email: пошаговое руководство

24 июля 2026 10 мин. чтения

Отказ диска без предупреждения - это потеря данных и простой сервиса. Автоматический мониторинг решает эту проблему: вы получаете сообщение в Telegram или email до того, как деградация накопителя приведёт к аварии. В этом руководстве мы настроим связку smartd, Zabbix и Grafana, которая отслеживает заполнение пространства, температуру и SMART-атрибуты, и отправляет оповещения без участия человека.

Вы получите готовые конфигурационные файлы и скрипты. Их можно скопировать и адаптировать под свою инфраструктуру за один-два часа. Система предупредит о росте числа переназначенных секторов, превышении порога температуры или заполнении раздела раньше, чем это заметит пользователь.

Если вам нужен более широкий взгляд на инструменты мониторинга дискового пространства, обратитесь к сравнению Zabbix, Prometheus и альтернатив. Там разобраны сильные стороны каждого решения и критерии выбора под конкретную нагрузку.

Зачем нужен автоматический мониторинг дисков

Исследование Google, опубликованное в FAST'07, показало: после первого сообщения о сбое SMART у диска остаётся в среднем 36 часов до полного отказа. Ручная проверка логов раз в сутки пропускает это окно. Автоматический мониторинг сжимает время реакции до минут.

Типичный сценарий без мониторинга: администратор узнаёт о проблеме, когда приложение падает с ошибкой «No space left on device» или клиенты сообщают о недоступности сервиса. К этому моменту файловая система может быть повреждена, а восстановление занимает часы.

Проактивный подход меняет картину. Система фиксирует рост температуры с 38°C до 55°C за час, проверяет SMART-атрибут Reallocated_Sector_Ct и отправляет предупреждение. Администратор успевает заменить диск в плановом режиме, без аварийной остановки. Именно такую цепочку мы построим.

Компоненты, которые будут задействованы:

  • smartd - демон из пакета smartmontools, читает SMART-атрибуты напрямую с контроллера диска и запускает тесты.
  • Zabbix - агрегирует метрики со всех серверов, хранит историю и триггерит оповещения по пороговым значениям.
  • Grafana - строит дашборды для визуального анализа трендов: скорость роста занятого места, динамика температуры, изменение SMART-показателей.
  • Telegram и email - каналы доставки уведомлений. Telegram даёт мгновенную реакцию, email служит резервным каналом и хранит историю инцидентов.

Архитектура системы мониторинга

Поток данных выглядит так: smartd опрашивает диски каждые 30 минут и пишет результаты в лог. Пользовательский скрипт на bash или Python парсит этот лог, извлекает значения атрибутов и отправляет их в Zabbix через zabbix_sender. Zabbix сравнивает полученные значения с порогами, заданными в триггерах, и при нарушении запускает действие (action). Действие передаёт сообщение в скрипт уведомлений, который отправляет его в Telegram-бота и на email.

Параллельно Zabbix собирает стандартные метрики файловых систем через Zabbix Agent: занятое место в процентах, свободные inode. Grafana подключается к API Zabbix и отображает все метрики на едином дашборде.

Эта архитектура не привязана к конкретному вендору. Вы можете заменить Zabbix на Prometheus, а Grafana оставить для визуализации - принцип останется тем же. Если вы ещё не выбрали стек, посмотрите руководство по настройке Prometheus и Grafana с нуля - там описана альтернативная связка с node_exporter и Alertmanager.

Установка и настройка smartd для мониторинга SMART

Установите smartmontools. Пакет есть во всех основных дистрибутивах:

# Debian/Ubuntu
apt install smartmontools

# RHEL/CentOS/Rocky
dnf install smartmontools

После установки демон smartd запускается автоматически. Проверьте статус:

systemctl status smartd

Базовая конфигурация находится в /etc/smartd.conf. По умолчанию файл содержит только комментарии. Добавьте строку для каждого диска, который нужно отслеживать.

Конфигурация smartd: ключевые параметры

Синтаксис директивы: DEVICE [options] -m email. Разберём на примере:

/dev/sda -a -o on -S on -s (S/../.././02|L/../../7/03) -m admin@example.com -M test
  • -a - включить мониторинг всех критичных SMART-атрибутов. Эквивалент -H -f -t -l error -l selftest -C 197 -U 198.
  • -o on - включить автоматические офлайн-тесты. Диск выполняет самодиагностику в простое.
  • -S on - включить сохранение атрибутов между перезагрузками.
  • -s (S/../.././02|L/../../7/03) - расписание тестов: короткий self-test каждый день в 02:00, длинный каждый седьмой день недели в 03:00.
  • -m admin@example.com - адрес для экстренных уведомлений от самого smartd (до интеграции с Zabbix).
  • -M test - отправить тестовое письмо при старте демона, чтобы проверить работу почты.

Для NVMe-дисков используйте ключ -d nvme:

/dev/nvme0 -d nvme -a -o on -S on -m admin@example.com

После изменения конфигурации перезапустите smartd и проверьте логи:

systemctl restart smartd
journalctl -u smartd -f

Убедитесь, что демон видит все диски и не выдаёт ошибок. Команда smartctl -a /dev/sda покажет полную таблицу SMART-атрибутов - сверьтесь с ней при настройке порогов в Zabbix.

Интеграция smartd с Zabbix

Zabbix не умеет читать SMART напрямую. Потребуется скрипт-посредник, который будет запускаться по расписанию и отправлять данные через zabbix_sender. Создайте файл /etc/zabbix/scripts/smart_sender.sh:

#!/bin/bash
ZBX_SERVER="127.0.0.1"
HOSTNAME=$(hostname)

for disk in /dev/sd[a-z]; do
    if [ -e "$disk" ]; then
        TEMP=$(smartctl -A "$disk" | grep Temperature_Celsius | awk '{print $10}')
        REALLOC=$(smartctl -A "$disk" | grep Reallocated_Sector_Ct | awk '{print $10}')
        HOURS=$(smartctl -A "$disk" | grep Power_On_Hours | awk '{print $10}')
        DISK_NAME=$(basename "$disk")

        zabbix_sender -z "$ZBX_SERVER" -s "$HOSTNAME" \
            -k "smart.temp[$DISK_NAME]" -o "$TEMP" &>/dev/null
        zabbix_sender -z "$ZBX_SERVER" -s "$HOSTNAME" \
            -k "smart.realloc[$DISK_NAME]" -o "$REALLOC" &>/dev/null
        zabbix_sender -z "$ZBX_SERVER" -s "$HOSTNAME" \
            -k "smart.hours[$DISK_NAME]" -o "$HOURS" &>/dev/null
    fi
done

Сделайте скрипт исполняемым и добавьте в cron с интервалом 10 минут:

chmod +x /etc/zabbix/scripts/smart_sender.sh
crontab -e
# Добавьте строку:
*/10 * * * * /etc/zabbix/scripts/smart_sender.sh

На стороне Zabbix создайте элементы данных типа «Zabbix trapper» с ключами smart.temp[sda], smart.realloc[sda], smart.hours[sda]. Для каждого диска - свой набор. Триггер для температуры: last(/host/smart.temp[sda])>50, для переназначенных секторов: last(/host/smart.realloc[sda])>0.

Если вы работаете с TrueNAS, настройка оповещений о SMART и ZFS-пулах описана в отдельном руководстве по алертингу в TrueNAS. Там разобраны webhook-интеграции и пользовательские скрипты для этой платформы.

Мониторинг дискового пространства в Zabbix

Zabbix Agent из коробки собирает метрики файловых систем. Подключите шаблон «Linux filesystems by Zabbix agent» к узлу сети - и вы получите данные о занятом месте и inode для всех смонтированных разделов. Шаблон использует низкоуровневое обнаружение (LLD), поэтому новые разделы подхватываются автоматически.

Создание триггера заполнения диска

Стандартный триггер срабатывает при 80% заполнения. Для критичных систем порог стоит снизить до 70%, чтобы оставалось время на реакцию. Выражение триггера:

last(/host/vfs.fs.size[/,pused])>80

Настройте severity: «Warning» для 80%, «High» для 90%, «Disaster» для 95%. Добавьте теги событий - они пригодятся при маршрутизации уведомлений в действия (actions). Например, тег component:disk и severity:warning позволят фильтровать алерты и отправлять критические сообщения в Telegram, а предупреждения - только в email.

Макросы делают пороги гибкими. Вместо жёстко заданного числа 80 используйте {$DISK.WARN.PUSED}. Значение макроса задаётся на уровне шаблона или узла сети. Это позволяет переопределить порог для конкретного сервера, не меняя сам триггер.

Мониторинг inode

Исчерпание inode - редкая, но фатальная проблема. Файловая система может иметь гигабайты свободного места, но отказывать в создании новых файлов. Такое случается на серверах с миллионами мелких файлов: почтовых хранилищах, кеширующих прокси, системах логирования.

Элемент данных для inode уже есть в стандартном шаблоне: vfs.fs.inode[/,pfree]. Создайте триггер:

last(/host/vfs.fs.inode[/,pfree])<10

Он сработает, когда свободных inode останется меньше 10%. Для разделов с большим количеством мелких файлов поднимите порог до 20%.

Настройка уведомлений в Telegram и email

Это ключевой блок. Без надёжной доставки оповещений мониторинг теряет смысл. Настроим два канала: Telegram для мгновенных пушей и email как резервный.

Интеграция Zabbix с Telegram

Создайте бота через @BotFather в Telegram. Вы получите токен вида 123456:ABC-DEF1234ghikl-zyx57W2v1u123ew11. Затем получите chat_id - идентификатор чата, куда бот будет слать сообщения. Самый простой способ: напишите боту любое сообщение и выполните запрос:

curl -s "https://api.telegram.org/bot<ТОКЕН>/getUpdates" | jq .

В ответе найдите "chat":{"id":123456789}. Это ваш chat_id.

Создайте скрипт отправки /etc/zabbix/scripts/telegram.sh:

#!/bin/bash
TOKEN="123456:ABC-DEF1234ghikl-zyx57W2v1u123ew11"
CHAT_ID="123456789"
MESSAGE="$1"

curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
    -d chat_id="${CHAT_ID}" \
    -d text="${MESSAGE}" \
    -d parse_mode="HTML" &>/dev/null

В Zabbix перейдите в «Administration → Media types», создайте новый тип «Telegram». Тип - «Script», параметры:

  • Script name: telegram.sh
  • Параметры скрипта: {ALERT.MESSAGE}

Привяжите media type к пользователю: «Administration → Users», выберите пользователя, вкладка «Media», добавьте «Telegram» и укажите {ALERT.SENDTO} в поле «Send to» (можно оставить пустым, если chat_id зашит в скрипте).

Настройка email-оповещений

Zabbix поддерживает SMTP-аутентификацию из коробки. Перейдите в «Administration → Media types → Email» и заполните поля:

  • SMTP server: smtp.example.com
  • SMTP server port: 587
  • SMTP helo: zabbix.example.com
  • SMTP email: zabbix@example.com
  • Connection security: STARTTLS
  • Authentication: Username and password

Для серверов без внешнего SMTP-релея можно поднять локальный Postfix в режиме send-only. Он будет принимать письма от Zabbix и отправлять их адресату напрямую через MX-записи домена получателя.

Действия (Actions) и эскалации

Действие связывает триггер с каналом оповещения. Создайте action в «Configuration → Actions»:

  • Conditions: тег component:disk.
  • Operations: отправка сообщения через Telegram пользователю Admin.
  • Шаг эскалации 1 (через 5 минут): повторная отправка, если проблема не закрыта.
  • Шаг эскалации 2 (через 15 минут): отправка на email и уведомление резервному администратору.

Текст сообщения настраивается через макросы. Пример шаблона:

Проблема: {TRIGGER.NAME}
Узел: {HOST.NAME}
Значение: {ITEM.LASTVALUE}
Время: {EVENT.TIME}
Ссылка: https://zabbix.example.com/tr_events.php?eventid={EVENT.ID}

Ссылка на событие в Zabbix позволяет администратору сразу перейти к графикам и истории проблемы прямо из Telegram-сообщения.

Визуализация метрик в Grafana

Grafana даёт наглядную картину поверх данных Zabbix. Подключите источник данных: «Configuration → Data Sources → Add data source → Zabbix». Укажите URL API Zabbix (http://zabbix.example.com/api_jsonrpc.php) и учётные данные.

Быстрый старт с готовым дашбордом

На портале community.grafana.com опубликованы десятки дашбордов для мониторинга дисков. Импортируйте дашборд по ID через «Dashboards → Import». После импорта привяжите его к вашему источнику данных Zabbix и укажите переменные: группу узлов и имена хостов.

Основные панели, которые стоит включить:

  • График свободного места по всем разделам с линией тренда.
  • Тепловая карта температуры дисков за последние 24 часа.
  • Таблица SMART-атрибутов с цветовой индикацией: зелёный - норма, жёлтый - внимание, красный - превышение порога.
  • График скорости роста занятого пространства (ГБ/день) для прогнозирования даты заполнения.

Если вам нужна более детальная визуализация с прогнозированием на основе скользящего среднего, обратитесь к руководству по мониторингу загрузки файлов на сервер. Там разобраны методы диагностики узких мест и построения кастомных панелей.

Готовые скрипты и конфигурации для быстрого развертывания

Все файлы, упомянутые в статье, собраны в единый архив. Состав комплекта:

  • smartd.conf - готовая конфигурация для SATA и NVMe дисков с расписанием тестов.
  • smart_sender.sh - скрипт отправки SMART-атрибутов в Zabbix.
  • telegram.sh - скрипт уведомлений в Telegram.
  • zabbix_template_disk.yaml - шаблон Zabbix с элементами данных, триггерами и макросами.
  • install.sh - скрипт автоматической установки: копирует файлы, выставляет права, добавляет cron-задачу.

Порядок быстрого развёртывания:

# Скачайте архив и распакуйте
wget https://admin-wiki.ru/files/disk-monitoring-kit.tar.gz
tar xzf disk-monitoring-kit.tar.gz
cd disk-monitoring-kit

# Отредактируйте переменные в config.env (токен бота, chat_id, email)
vi config.env

# Запустите установку
bash install.sh

Скрипт установки проверит наличие необходимых пакетов, скопирует конфигурации, добавит cron-задачу и выведет инструкцию по импорту шаблона в Zabbix. Весь процесс занимает около 10 минут.

Для серверов, где требуется мониторинг не только дисков, но и резервных копий, рекомендуем готовые скрипты автоматизации бэкапов. Там же описана интеграция с Zabbix и Jira для полного цикла: от обнаружения проблемы до тикета в трекинговой системе.

Типовые проблемы и их решение

smartd не видит диски. Проверьте, что диски не подключены через RAID-контроллер в режиме аппаратного RAID. smartmontools работает с дисками напрямую. Для аппаратных RAID используйте утилиты производителя контроллера (megacli, storcli) и передавайте данные в Zabbix через пользовательские скрипты.

Zabbix не получает данные SMART. Выполните zabbix_sender вручную с флагом -vv и проверьте вывод. Частая причина - несовпадение имени хоста в скрипте и в Zabbix. Имя чувствительно к регистру. Вторая причина - брандмауэр блокирует порт 10051 (траппер Zabbix).

Уведомления не приходят в Telegram. Проверьте токен и chat_id прямым вызовом curl из командной строки. Если бот не может отправить сообщение, убедитесь, что вы инициировали диалог с ботом (отправили команду /start). Боты не могут писать первыми.

Триггер заполнения диска срабатывает ложно. Временные файлы или снапшоты могут кратковременно занимать место. Увеличьте период оценки триггера: вместо last() используйте avg(15m), чтобы триггер срабатывал только при устойчивом заполнении в течение 15 минут.

Grafana показывает «No data». Проверьте права пользователя Zabbix, под которым Grafana подключается к API. Пользователь должен иметь доступ к узлам сети, для которых запрашиваются данные. В логах Grafana (/var/log/grafana/grafana.log) ищите ошибки плагина Zabbix.

Настроенная по этому руководству система мониторинга предупредит вас о проблеме с диском за часы или дни до отказа. Это время, которое вы тратите не на аварийное восстановление, а на плановую замену накопителя.

Поделиться:
Сохранить гайд? В закладки браузера