Hacker News Digest

02 сентября 2025 г. в 19:42 • dgross.ca • ⭐ 273 • 💬 96

OriginalHN

#linux#ubuntu#wake-on-lan#arp#raspberry-pi#cron#avahi#bash

Making a Linux home server sleep on idle and wake on demand (2023)

Краткое руководство

Цель:
Сервер Ubuntu засыпает при простое и просыпается по запросу любого устройства в сети (SSH, Time Machine и т.д.).

Что нужно:

  • Сервер с поддержкой Wake-on-LAN по unicast.
  • Постоянно включённый маломощный Linux-компьютер (например, Raspberry Pi).

На сервере

  1. Включить 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
  1. Автоматический сон по 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 -
  1. Отключить IPv6 (ARP не работает с IPv6):
sudo sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="ipv6.disable=1"/' /etc/default/grub
sudo update-grub && sudo reboot
  1. Остановить 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

  1. Установить ARP Stand-in
    Отвечает на ARP-запросы за спящий сервер.
    https://github.com/danielpgross/arp_standin

  2. Опубликовать 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.
  • Лишние пакеты могут случайно разбудить сервер.