Энергосберегающий режим для сервера Debian: автоматический сон по расписанию и пробуждение по WoL

В современных условиях, когда эффективность использования ресурсов становится приоритетом, многие администраторы сталкиваются с необходимостью оптимизации энергопотребления серверов. Особенно это актуально для тестовых стендов, систем резервного копирования или домашних серверов, которые не требуют круглосуточной работы. Однако задача усложняется, когда нужно поддерживать баланс между экономией энергии и сохранением доступа к системе. Как организовать сервер на Debian так, чтобы он автоматически уходил в сон в нерабочее время, просыпался по расписанию для выполнения задач и при этом мог быть разбужен для удалённого доступа по SSH? В этой статье мы рассмотрим практическое решение, которое превратит ваш сервер в «интеллектуальную» систему с гибким управлением режимами энергопотребления.

1. Установка необходимых пакетов

sudo apt update
sudo apt install ethtool wakeonlan rtcwake

2. Настройка Wake-on-LAN (WoL) для enp2s0

Проверьте поддерживает ли ваша сетевая карта WoL:

sudo ethtool enp2s0 | grep Wake-on

Включите WoL:

sudo ethtool -s enp2s0 wol g

Создайте сервис для сохранения настроек WoL:

Создайте файл /etc/systemd/system/wol-enp2s0.service:

[Unit]
Description=Configure Wake-on-LAN for enp2s0
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s enp2s0 wol g
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Включите сервис:

sudo systemctl enable wol-enp2s0.service
sudo systemctl start wol-enp2s0.service

3. Настройка автоматического пробуждения

Создайте скрипт /usr/local/bin/sleep_server.sh:

#!/bin/bash

# Активируем WoL перед сном
/sbin/ethtool -s enp2s0 wol g

# Устанавливаем следующее пробуждение на 3:00
rtcwake -m no -l -t $(date -d "tomorrow 03:00" +%s)

# Переводим сервер в сон (S3 - Suspend to RAM)
echo "Перевод сервера в сон до 3:00..." >> /var/log/sleep_server.log
date >> /var/log/sleep_server.log
systemctl suspend

Сделайте скрипт исполняемым:

sudo chmod +x /usr/local/bin/sleep_server.sh

4. Создайте скрипт для выполнения задач в 3:00

Создайте /usr/local/bin/daily_task.sh:

#!/bin/bash

# Логируем пробуждение
echo "$(date): Сервер проснулся по расписанию" >> /var/log/daily_tasks.log

# ВАШИ ЗАДАЧИ ЗДЕСЬ
# Например:
# - Резервное копирование
# - Обновление системы
# - Очистка логов
# - Запуск отчетов

# Пример задач:
echo "$(date): Начало выполнения задач" >> /var/log/daily_tasks.log

# Выполните команды которые нужны
# apt update && apt upgrade -y
# /путь/к/вашему/скрипту.sh

echo "$(date): Задачи выполнены, готовимся ко сну" >> /var/log/daily_tasks.log

# Активируем WoL снова
/sbin/ethtool -s enp2s0 wol g

# Планируем следующее пробуждение на 3:00 следующего дня
rtcwake -m no -l -t $(date -d "tomorrow 03:00" +%s)

# Возвращаемся в сон
systemctl suspend

Сделайте скрипт исполняемым:

sudo chmod +x /usr/local/bin/daily_task.sh

5. Настройка systemd для управления сном

Создайте сервис для перевода в сон /etc/systemd/system/go-to-sleep.service:

[Unit]
Description=Перевод сервера в сон
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/sleep_server.sh
RemainAfterExit=no
User=root

[Install]
WantedBy=multi-user.target

Создайте timer для ежедневного пробуждения /etc/systemd/system/wakeup.timer:

[Unit]
Description=Пробуждение сервера в 3:00

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

Создайте сервис для выполнения задач при пробуждении /etc/systemd/system/wakeup.service:

[Unit]
Description=Выполнение задач при пробуждении

[Service]
Type=oneshot
ExecStart=/usr/local/bin/daily_task.sh
User=root

Активируйте таймер:

sudo systemctl enable wakeup.timer
sudo systemctl start wakeup.timer

6. Настройка немедленного перехода в сон

Создайте скрипт /usr/local/bin/sleep_now.sh для ручного перевода в сон:

#!/bin/bash

echo "Активация WoL на enp2s0..."
/sbin/ethtool -s enp2s0 wol g

echo "Установка пробуждения на 3:00..."
rtcwake -m no -l -t $(date -d "tomorrow 03:00" +%s)

echo "Переход в сон..."
systemctl suspend

Сделайте исполняемым:

sudo chmod +x /usr/local/bin/sleep_now.sh

7. Настройка проверки активности SSH

Создайте скрипт /usr/local/bin/check_and_sleep.sh:

#!/bin/bash

# Текущий час
HOUR=$(date +%H)

# Если время между 3:01 и 23:59
if [ $HOUR -gt 3 ] && [ $HOUR -lt 24 ]; then
    # Проверяем активные SSH сессии
    ACTIVE_SSH=$(who | grep -c pts)
    
    if [ $ACTIVE_SSH -eq 0 ]; then
        # Нет активных SSH сессий - можно спать
        echo "$(date): Нет активных SSH сессий, переходим в сон" >> /var/log/sleep_check.log
        /usr/local/bin/sleep_now.sh
    else
        echo "$(date): Найдено активных SSH сессий: $ACTIVE_SSH" >> /var/log/sleep_check.log
    fi
fi

Добавьте в crontab (sudo crontab -e):

# Проверка каждые 5 минут, можно ли усыпить сервер
*/5 * * * * /usr/local/bin/check_and_sleep.sh

8. Настройка файла журнала

sudo touch /var/log/sleep_server.log
sudo touch /var/log/daily_tasks.log
sudo touch /var/log/sleep_check.log
sudo chmod 644 /var/log/sleep*.log /var/log/daily_tasks.log

9. Инструкция по пробуждению сервера по SSH

Для пробуждения сервера вам понадобится:

  • Другой компьютер в той же сети с установленным wakeonlan
  • MAC-адрес вашей сетевой карты enp2s0

Получите MAC-адрес:

ip link show enp2s0 | grep link/ether | awk '{print $2}'

Для пробуждения с другого компьютера:

# Установите wakeonlan на клиенте
sudo apt install wakeonlan

# Отправьте Magic Packet
wakeonlan MAC-ADDRESS
# или
wakeonlan -i IP-ADDRESS MAC-ADDRESS

10. Проверка и тестирование

Проверьте WoL:

# Статус WoL
sudo ethtool enp2s0 | grep -A5 Wake-on

# Тестовый сон на 1 минуту
sudo rtcwake -m mem -s 60

# Проверьте запланированное пробуждение
sudo cat /sys/class/rtc/rtc0/wakealarm

# Проверьте, что система поддерживает S3 sleep
cat /sys/power/state

Проверьте systemd таймеры:

# Статус таймеров
sudo systemctl list-timers --all

# Логи служб
sudo journalctl -u wakeup.service
sudo journalctl -u go-to-sleep.service

11. Полная команда для перевода в сон сейчас

sudo /usr/local/bin/sleep_now.sh

12. Важные настройки BIOS/UEFI

  • Войдите в BIOS/UEFI вашего сервера
  • Найдите настройки питания (Power Management)
  • Включите:
  • Wake-on-LAN
  • Resume by PCI-E Device
  • Power On By PME
  • Сохраните настройки и перезагрузитесь
  • Эта конфигурация обеспечит:
  • Автоматический переход в сон после 3:00
  • Пробуждение в 3:00 для выполнения задач
  • Возможность пробуждения по WoL для SSH доступа
  • Проверку активных SSH сессий перед сном

Реализация системы автоматического управления сном сервера на Debian — это не просто экономия электроэнергии, а шаг к созданию «умной» инфраструктуры, которая адаптируется к реальным потребностям. Предложенное решение демонстрирует, как современные технологии позволяют совмещать казалось бы несовместимое: энергоэффективность и доступность. Ваш сервер теперь будет работать только тогда, когда это действительно необходимо, самостоятельно просыпаясь для выполнения запланированных задач и готовый к пробуждению в любой момент по первому требованию администратора. Этот подход не только снижает эксплуатационные расходы, но и продлевает срок службы оборудования, уменьшает тепловыделение и шум, что особенно ценно для домашних лабораторий и небольших офисов. Начните внедрять эти практики уже сегодня, и вы увидите, как ваш серверный парк становится более экологичным, экономичным и в то же время — более отзывчивым к вашим задачам.