Making a Linux home server sleep on idle and wake on demand (2023)
Краткое руководство
Цель:
Сервер Ubuntu засыпает при простое и просыпается по запросу любого устройства в сети (SSH, Time Machine и т.д.).
Что нужно:
- Сервер с поддержкой Wake-on-LAN по unicast.
- Постоянно включённый маломощный Linux-компьютер (например, Raspberry Pi).
На сервере
- Включить Wake-on-LAN (unicast):
sudo ethtool -s eno1 wol ug
sudo tee /etc/networkd-dispatcher/configuring.d/wol <<'EOF'
#!/usr/bin/env bash
ethtool -s eno1 wol ug || true
EOF
sudo chmod 755 /etc/networkd-dispatcher/configuring.d/wol
- Автоматический сон по cron (каждые 10 мин):
cat >/home/ubuntu/auto-sleep.sh <<'EOF'
#!/bin/bash
users=$(who | wc -l)
afp=$(lsof -i:548 | wc -l)
[[ $users -eq 0 && $afp -lt 3 ]] && systemctl suspend
EOF
chmod +x /home/ubuntu/auto-sleep.sh
(crontab -l 2>/dev/null; echo "*/10 * * * * /home/ubuntu/auto-sleep.sh | logger -t autosuspend") | crontab -
- Отключить IPv6 (ARP не работает с IPv6):
sudo sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="ipv6.disable=1"/' /etc/default/grub
sudo update-grub && sudo reboot
- Остановить Netatalk перед сном (по желанию):
sudo tee /etc/systemd/system/netatalk-sleep.service <<'EOF'
[Unit]
Description=Netatalk sleep hook
Before=sleep.target
[Service]
Type=oneshot
ExecStart=-/usr/bin/systemctl stop netatalk
ExecStop=-/usr/bin/systemctl start netatalk
[Install]
WantedBy=sleep.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable netatalk-sleep.service
На Raspberry Pi
-
Установить ARP Stand-in
Отвечает на ARP-запросы за спящий сервер.
https://github.com/danielpgross/arp_standin -
Опубликовать mDNS-записи (по желанию):
sudo apt install avahi-daemon
sudo tee /etc/systemd/system/avahi-publish.service <<'EOF'
[Unit]
Description=Publish custom Avahi records
After=network.target avahi-daemon.service
[Service]
ExecStart=/usr/bin/avahi-publish -s homeserver _afpovertcp._tcp 548 -H homeserver.local
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now avahi-publish.service
Ограничения:
- Сетевая карта сервера должна поддерживать Wake-on-LAN по unicast.
- Лишние пакеты могут случайно разбудить сервер.