Маршрутизация процессов в TrueNAS: пошаговое управление задачами и автоматизация в 2026 | AdminWiki

Маршрутизация процессов в TrueNAS: пошаговое управление задачами и автоматизация в 2026

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

Каждую ночь ваш TrueNAS выполняет десятки операций: создает снапшоты, проверяет целостность данных, отправляет отчеты. Если эти процессы не настроены, они не происходят. Результат - деградация производительности, риск потери данных и рост ручной нагрузки на администратора.

Встроенный планировщик cron, пользовательские скрипты и интеграция с внешними системами - три инструмента, которые превращают TrueNAS из пассивного хранилища в самоподдерживающуюся систему. Эта статья дает готовые, проверенные рецепты для каждого из них. Вы получите конкретные команды, шаблоны скриптов и методы отладки, которые можно применить сразу после прочтения.

Материал ориентирован на TrueNAS CORE и SCALE версий 2025-2026. Все примеры проверены на реальных инсталляциях. Если вам нужны основы работы с сетевым доступом, обратитесь к руководству по настройке SMB, NFS и FTP. Для глубокой автоматизации через API рекомендую полное руководство по TrueNAS SCALE REST API.

Зачем нужна маршрутизация процессов в TrueNAS

Ручное обслуживание хранилища - это постоянный источник ошибок. Администратор забывает создать снапшот перед обновлением. Пропускает еженедельный scrubbing. Не замечает заполнение пула до критического уровня. Каждый такой промах потенциально ведет к инциденту.

Автоматизация решает три задачи:

  • Сокращение ручного труда. Операции, которые занимают 15-20 минут в день, за год складываются в 90 часов. Cron-задачи выполняют их без участия человека.
  • Предотвращение ошибок. Скрипт не забудет передать флаг --recursive и не перепутает порядок аргументов. Человеческий фактор исключается.
  • Стандартизация. Когда у вас пять серверов TrueNAS, единый набор скриптов и расписаний гарантирует, что обслуживание везде выполняется одинаково. Это критически важно для надежной репликации данных между площадками.

TrueNAS предоставляет все необходимые инструменты внутри системы. Вам не нужны внешние оркестраторы вроде Jenkins или Rundeck для базовых задач. Встроенный cron покрывает 90% потребностей администратора. Для оставшихся 10% есть пользовательские скрипты и API.

Встроенный планировщик задач: cron в TrueNAS

Планировщик задач в TrueNAS находится в разделе Tasks → Cron Jobs. Он использует стандартный синтаксис cron, но работает в собственном окружении. Это ключевое отличие от Linux cron: переменные окружения, PATH и доступные команды могут отличаться от того, что вы видите в shell-сессии.

Всегда указывайте полные пути к исполняемым файлам. Вместо zpool пишите /sbin/zpool. Вместо python - /usr/local/bin/python3. Это устраняет класс ошибок, связанных с неопределенным PATH.

Логи выполнения cron-задач доступны через веб-интерфейс: Tasks → Cron Jobs → шестеренка (Run History). Там же можно посмотреть вывод команды и код возврата. Задача считается успешной только при коде возврата 0.

Создание простой cron-задачи: пошаговый пример

Настроим автоматический scrubbing пула tank каждое воскресенье в 03:00. Scrubbing проверяет контрольные суммы всех данных и исправляет обнаруженные ошибки. Это обязательная еженедельная процедура для любого пула ZFS.

  1. Перейдите в Tasks → Cron Jobs → Add.
  2. Заполните поля:
    • Description: Weekly scrub of tank pool
    • Command: /sbin/zpool scrub tank
    • Run as user: root
    • Schedule: 0 3 * * 0
    • Hide standard output: No
    • Hide standard error: No
    • Redirect output: оставьте пустым или укажите путь к лог-файлу
  3. Нажмите Save.
  4. Для проверки выделите задачу и нажмите Run Now.

Почему запуск от root? Команды управления пулами ZFS требуют привилегий суперпользователя. Запуск от обычного пользователя приведет к ошибке permission denied. В production-среде рассмотрите создание отдельного пользователя с делегированными правами ZFS, но для начала root - самый простой и надежный вариант.

Поле Redirect output полезно для длительно работающих задач. Укажите путь вроде /var/log/scrub_tank.log, и весь вывод команды будет сохраняться в этот файл. Без этого вывод виден только в Run History веб-интерфейса.

Расписание cron: тонкости и частые ошибки

Синтаксис cron-выражения состоит из пяти полей:

минуты часы день_месяца месяц день_недели

Примеры расписаний:

  • 0 2 * * * - каждый день в 02:00
  • 0 2 * * 1 - каждый понедельник в 02:00
  • 0 */4 * * * - каждые 4 часа
  • 30 3 1 * * - первого числа каждого месяца в 03:30

Главная ошибка - перекрытие ресурсоемких задач. Scrubbing пула нагружает диски на 100%. Если одновременно запустить scrubbing двух пулов на одном физическом массиве, производительность упадет вдвое, а время выполнения вырастет втрое. Разносите такие задачи минимум на 6 часов.

Вторая частая проблема - неверный расчет времени завершения. Scrubbing пула объемом 20 ТБ может идти 12-18 часов. Если он стартует в 3:00 воскресенья, а в 2:00 понедельника запускается репликация, задачи пересекутся. Проверяйте реальное время выполнения командой zpool status перед фиксацией расписания.

Пользовательские скрипты: расширяем возможности автоматизации

Одиночные cron-команды решают простые задачи. Когда требуется условная логика, обработка ошибок или цепочка действий, нужен скрипт. TrueNAS выполняет shell-скрипты так же, как и отдельные команды - через cron.

Рекомендуемое место хранения скриптов - отдельный датасет: /mnt/tank/scripts. Это гарантирует, что скрипты сохранятся при переустановке системы и будут доступны после импорта пула. Права на директорию:

chmod 700 /mnt/tank/scripts
chown root:wheel /mnt/tank/scripts

Каждый скрипт должен иметь права на выполнение: chmod +x /mnt/tank/scripts/backup_config.sh.

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

Конфигурация TrueNAS содержит все настройки: пользователей, шары, задачи cron, параметры сети. Ее потеря означает восстановление системы с нуля. Автоматический бэкап конфигурации - первая задача, которую нужно автоматизировать после установки.

Создайте файл /mnt/tank/scripts/backup_config.sh:

#!/bin/sh
# Бэкап конфигурации TrueNAS с ротацией старых копий

# Настройки
BACKUP_DIR="/mnt/tank/backups/config"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)

# Создаем директорию, если ее нет
mkdir -p "$BACKUP_DIR"

# Сохраняем конфигурацию через API (работает на SCALE и CORE)
# Для CORE используется вызов localhost, для SCALE - тот же механизм
midclt call config.save | cat > "$BACKUP_DIR/truenas_config_$DATE.db"

# Проверяем, что файл создан и не пуст
if [ ! -s "$BACKUP_DIR/truenas_config_$DATE.db" ]; then
    echo "ERROR: Backup file is empty or not created"
    exit 1
fi

# Ротация: удаляем файлы старше RETENTION_DAYS
find "$BACKUP_DIR" -name "truenas_config_*.db" -mtime +$RETENTION_DAYS -delete

echo "Config backup completed: truenas_config_$DATE.db"
exit 0

Разбор ключевых моментов:

  • midclt call config.save - встроенная команда TrueNAS для получения дампа конфигурации. Работает без дополнительной аутентификации при запуске от root.
  • Проверка [ ! -s ... ] гарантирует, что файл существует и не пуст. Без нее вы можете получить пустой файл и узнать об этом только при попытке восстановления.
  • Ротация через find -mtime предотвращает заполнение диска старыми бэкапами.

Перед добавлением в cron протестируйте скрипт вручную:

/mnt/tank/scripts/backup_config.sh
echo $?  # Должен вернуть 0

Затем создайте cron-задачу с командой /mnt/tank/scripts/backup_config.sh и расписанием 0 4 * * * (каждую ночь в 4:00).

Отладка скриптов: логирование и обработка ошибок

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

1. Трассировка выполнения. Добавьте в начало скрипта:

#!/bin/sh
set -e  # Прервать выполнение при любой ошибке
set -x  # Выводить каждую команду перед выполнением

set -e останавливает скрипт, если любая команда возвращает ненулевой код. Без нее скрипт продолжит выполняться после ошибки, что может привести к каскадным сбоям. set -x выводит в лог каждую команду с раскрытыми переменными - бесценно при поиске проблем с путями или подстановками.

2. Раздельный сбор stdout и stderr. В cron-задаче укажите:

Redirect output: /var/log/my_script.log
Redirect stderr: /var/log/my_script_error.log

Ошибки будут в отдельном файле, что упрощает диагностику.

Пример скрипта с проверкой доступности удаленного сервера перед репликацией:

#!/bin/sh
set -e

REMOTE_HOST="backup-server.local"
REMOTE_PORT=22

# Проверяем доступность удаленного сервера
if ! timeout 10 nc -z "$REMOTE_HOST" "$REMOTE_PORT"; then
    echo "ERROR: Remote host $REMOTE_HOST is not reachable on port $REMOTE_PORT"
    exit 1
fi

# Выполняем репликацию
/sbin/zfs send tank/data@snapshot | ssh backup-server /sbin/zfs receive backup/tank/data
echo "Replication completed successfully"
exit 0

Проверка доступности через nc -z с таймаутом 10 секунд предотвращает зависание скрипта на неопределенное время, если удаленный сервер недоступен.

Интеграция TrueNAS с внешними системами

Встроенные email-уведомления TrueNAS покрывают базовые события: сбой диска, проблемы с пулом, завершение scrubbing. Но для оперативного оповещения команды удобнее использовать мессенджеры. Интеграция строится на двух механизмах: webhook (прямой HTTP-запрос к API мессенджера) и скрипт-обертка, вызываемая после выполнения задачи.

Для корпоративных сред с централизованным мониторингом TrueNAS может отправлять метрики в Zabbix, Prometheus или любую систему, поддерживающую прием данных по HTTP или через командную строку.

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

Создайте бота в Telegram через @BotFather и получите токен. Затем узнайте chat_id вашего канала или личного чата с ботом. Скрипт отправки сообщения:

#!/bin/sh
# Отправка уведомления в Telegram

BOT_TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
CHAT_ID="-1001234567890"
MESSAGE="$1"

if [ -z "$MESSAGE" ]; then
    echo "Usage: $0 'message text'"
    exit 1
fi

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

if [ $? -eq 0 ]; then
    echo "Notification sent successfully"
else
    echo "ERROR: Failed to send notification"
    exit 1
fi

Интеграция в cron-задачу: после основной команды добавьте вызов скрипта с результатом. Например, для scrubbing:

/sbin/zpool scrub tank && /mnt/tank/scripts/telegram_notify.sh "✅ Scrubbing pool 'tank' completed successfully" || /mnt/tank/scripts/telegram_notify.sh "❌ Scrubbing pool 'tank' FAILED"

Конструкция && и || позволяет отправить разное сообщение в зависимости от кода возврата основной команды.

Мониторинг состояния пулов с выводом в Zabbix

Для отправки метрик в Zabbix используйте zabbix_sender. Установите его на сервер TrueNAS: pkg install zabbix6-agent (для CORE) или apt install zabbix-agent (для SCALE).

Скрипт сбора метрик пула:

#!/bin/sh
# Отправка метрик пула в Zabbix

ZABBIX_SERVER="zabbix.local"
ZABBIX_HOST="truenas-prod-01"
POOL_NAME="tank"

# Получаем данные о пуле
HEALTH=$(/sbin/zpool list -H -o health "$POOL_NAME" 2>/dev/null)
FREE=$(/sbin/zpool list -H -o free "$POOL_NAME" 2>/dev/null)
CAPACITY=$(/sbin/zpool list -H -o cap "$POOL_NAME" 2>/dev/null | tr -d '%')

# Отправляем в Zabbix через trapper
/usr/local/bin/zabbix_sender -z "$ZABBIX_SERVER" -s "$ZABBIX_HOST" \
    -k zpool.health["$POOL_NAME"] -o "$HEALTH" \
    -k zpool.free["$POOL_NAME"] -o "$FREE" \
    -k zpool.capacity["$POOL_NAME"] -o "$CAPACITY" \
    > /dev/null 2>&1

echo "Metrics sent for pool $POOL_NAME"
exit 0

В Zabbix создайте элементы данных типа Zabbix trapper с ключами zpool.health[tank], zpool.free[tank], zpool.capacity[tank]. Настройте триггер на состояние HEALTH != ONLINE и на заполнение пула более 80%.

Этот скрипт добавляется в cron с интервалом 5-15 минут. Чаще нет смысла: метрики пула меняются медленно, а частые вызовы zpool list создают лишнюю нагрузку.

Типичные ошибки и как их избежать

За годы работы с TrueNAS я собрал список ошибок, которые повторяются у большинства администраторов. Каждая из них приводила к инциденту хотя бы раз.

1. Неверный PATH. Команда работает в shell, но не работает в cron. Симптом: в Run History ошибка command not found. Решение: всегда используйте полные пути. Проверьте путь командой which zpool перед добавлением в cron.

2. Отсутствие прав на выполнение скрипта. Симптом: Permission denied в логах. Решение: chmod +x /path/to/script.sh. Проверяйте владельца: скрипт должен быть доступен пользователю, от которого запускается cron (обычно root).

3. Блокировка вывода. Включены опции Hide standard output и Hide standard error, а перенаправления в файл нет. Симптом: задача выполняется, но вы не видите ни результата, ни ошибок. Решение: всегда указывайте Redirect output для отлаживаемых задач или отключайте скрытие вывода.

4. Игнорирование кодов возврата. Скрипт продолжает выполняться после ошибки. Симптом: в логах видна ошибка на шаге 2, но скрипт доходит до шага 5 и завершается с кодом 0. Решение: set -e в начале каждого скрипта.

5. Перекрытие ресурсоемких задач. Симптом: ночные операции (scrub, репликация, снапшоты) стали выполняться в 2-3 раза дольше обычного. Решение: составьте карту расписания всех задач на неделю и убедитесь, что тяжелые операции не пересекаются.

6. Запуск скриптов из домашней директории пользователя. Симптом: после обновления или переустановки TrueNAS скрипты исчезли. Решение: храните скрипты только на датасетах пула (/mnt/tank/scripts), а не в системных директориях.

Стандартизация и масштабирование: лучшие практики

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

Стандартизация начинается с системы контроля версий. Храните все скрипты в Git-репозитории. Структура репозитория:

truenas-scripts/
├── common/
│   ├── backup_config.sh
│   ├── telegram_notify.sh
│   └── zabbix_metrics.sh
├── prod/
│   ├── tank_scrub.sh
│   └── replication.sh
├── staging/
│   └── test_env_setup.sh
└── README.md

Разделение на common (общие скрипты) и окружения (prod, staging) позволяет переиспользовать код. Скрипты из common параметризуются через переменные окружения или аргументы командной строки, а не через жестко заданные значения.

Для синхронизации скриптов между серверами используйте git pull по cron:

0 1 * * * cd /mnt/tank/scripts && /usr/local/bin/git pull origin main

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

Документируйте каждую cron-задачу прямо в описании поля Description. Вместо «scrub task» пишите «Weekly scrub of tank pool (8TB, ~6h runtime, do not overlap with replication at 10:00)». Это сэкономит часы при расследовании инцидента через полгода.

Для сложных сценариев автоматизации, выходящих за рамки cron, изучите практический гайд по автоматизации инфраструктуры. Там разобраны подходы с Ansible и Terraform, которые дополняют встроенные механизмы TrueNAS.

Автоматизация обслуживания TrueNAS - это не разовая настройка, а процесс. Начните с малого: бэкап конфигурации и еженедельный scrubbing. Добавляйте новые задачи по мере возникновения потребностей. Через месяц у вас будет самоподдерживающаяся система, которая требует вмешательства только в исключительных ситуациях.

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