В современных условиях, когда эффективность использования ресурсов становится приоритетом, многие администраторы сталкиваются с необходимостью оптимизации энергопотребления серверов. Особенно это актуально для тестовых стендов, систем резервного копирования или домашних серверов, которые не требуют круглосуточной работы. Однако задача усложняется, когда нужно поддерживать баланс между экономией энергии и сохранением доступа к системе. Как организовать сервер на Debian так, чтобы он автоматически уходил в сон в нерабочее время, просыпался по расписанию для выполнения задач и при этом мог быть разбужен для удалённого доступа по SSH? В этой статье мы рассмотрим практическое решение, которое превратит ваш сервер в «интеллектуальную» систему с гибким управлением режимами энергопотребления.
1. Установка необходимых пакетов
sudo apt update
sudo apt install ethtool wakeonlan rtcwake2. Настройка 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.service3. Настройка автоматического пробуждения
Создайте скрипт /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.sh4. Создайте скрипт для выполнения задач в 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.sh5. Настройка 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.timer6. Настройка немедленного перехода в сон
Создайте скрипт /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.sh7. Настройка проверки активности 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.sh8. Настройка файла журнала
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.log9. Инструкция по пробуждению сервера по 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-ADDRESS10. Проверка и тестирование
Проверьте 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.service11. Полная команда для перевода в сон сейчас
sudo /usr/local/bin/sleep_now.sh12. Важные настройки 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 — это не просто экономия электроэнергии, а шаг к созданию «умной» инфраструктуры, которая адаптируется к реальным потребностям. Предложенное решение демонстрирует, как современные технологии позволяют совмещать казалось бы несовместимое: энергоэффективность и доступность. Ваш сервер теперь будет работать только тогда, когда это действительно необходимо, самостоятельно просыпаясь для выполнения запланированных задач и готовый к пробуждению в любой момент по первому требованию администратора. Этот подход не только снижает эксплуатационные расходы, но и продлевает срок службы оборудования, уменьшает тепловыделение и шум, что особенно ценно для домашних лабораторий и небольших офисов. Начните внедрять эти практики уже сегодня, и вы увидите, как ваш серверный парк становится более экологичным, экономичным и в то же время — более отзывчивым к вашим задачам.