Wake-on-LAN voor de homeserver

nerd alertMijn homeserver hoeft niet altijd aan te staan, maar alleen als ik hem nodig heb. Moet ik dan eerst naar huis bellen om te vragen of ze de computer aanzetten? Nee, aanzetten kan hij zichzelf: dat heet Wake-on-LAN.

Stap 1: BIOS

De eerste stap is WoL aanzetten in de BIOS van de homeserver. Ik gebruik WoL op de Shuttle PC en hier zie je de instellingen:

BIOS instelling voor Wake-on-LAN
BIOS instelling voor Wake-on-LAN

Stap 2: Magic Packet

De computer zal vanaf nu vanzelf inschakelen, als hij via de netwerkpoort een Magic Packet ontvangt. Dat is een packet waar z’n eigen MAC adres in staat. Uiteindelijk vond ik de gemakkelijkste oplossing om dat Magic Packet te versturen, door het de FRITZ!Box te laten doen. Dat doe je met een instelling die te vinden is in het menu Home Network Overview:

FRITZ!Box verstuurt Magic Packet
FRITZ!Box verstuurt Magic Packet

Dit werkt natuurlijk alleen goed, als de FRITZ!Box het apparaat al een keer gezien heeft en daardoor het MAC adres van het apparaat kent. Met de knop Start Computer kan je controleren of het werkt.

Als het voorgaande goed geconfigureerd is, dan zal de computer netjes uit stand-by komen, als hij benaderd wordt vanaf internet. Via het lokale IP adres van de computer werkt het dus niet, je zult de computer moeten benaderen via je publieke internetadres en dus ook een port-forwarding regel die je daarvoor hebt ingesteld. Gebruik bijvoorbeeld een port-forwarding naar poort 22, zodat je de computer via SSH kunt benaderen.

Stap 3: en weer uit

Als je de computer gebruikt hebt en je bent weer uitgelogd, dan mag de computer weer in de stand-by stand. Het liefst automatisch, maar niet zolang ik nog ingelogd ben. Om dat te bereiken, draai ik op de homeserver het script dat je hieronder ziet. Dit script controleert regelmatig (om de 5 minuten) of er nog iemand ingelogd is en als iedereen uitgelogd is, zet het script de computer in stand-by.

Dit script werkt voor alle oplossingen waarbij je op Unix-niveau moet inloggen op de machine om een applicatie te gebruiken, bijvoorbeeld voor No-machine en voor SSH, maar ook als je SSH gebruikt voor het opzetten van een tunnel, of als je een tmux sessie hebt draaien. Dat laatste dient dan een dubbel doel: doordat tmux draait blijft je proces doordraaien als de verbinding verbroken wordt en bovendien zal de computer zichzelf niet uitschakelen.

Om het script automatisch te draaien, heb ik deze entry in sudo crontab -e gemaakt:

*/5 * * * * /usr/local/sbin/powercron.sh

En dit is de inhoud van het bestand /usr/local/sbin/powercron.sh :

#!/bin/bash

# Zet de machine op 'suspend' als niemand is ingelogd

logfile=/home/root/$(date +\%C\%y-\%m-\%d).log
suspend=/usr/sbin/pm-suspend

# Koptekst in de logfile
echo >>$logfile
/usr/bin/uptime >>$logfile

# Controleer of iemand is ingelogd
#last -i -F | grep 'still logged in' >>$logfile
who -q | grep 'users=[^0]'
if [ $? -eq 0 ] ; then
 who >>$logfile
 echo Er is nog iemand ingelogd
 exit
fi

# Wacht een minuut voor het geval iemand net bezig is met inloggen
echo Misschien is er iemand bezig met inloggen?
sleep 60

# Controleer de tweede keer
#last -i -F | grep 'still logged in' >>$logfile
who -q | grep 'users=[^0]'
if [ $? -eq 0 ] ; then
 who >>$logfile
 echo Intussen is iemand ingelogd >>$logfile
 exit
fi

echo Iedereen is uitgelogd
echo $suspend >>$logfile
sleep 2
$suspend

NB: als je dit script copy-paste, vervang daarna dan » door >> .

Er zijn 4 commando’s waarmee je kunt opvragen wie er momenteel ingelogd is: w, who, last en users. Het nadeel van last is, dat deze bij elke maandovergang zijn lijst van ingelogde gebruikers een keer verliest, vandaar dat je ziet dat ik in het script last door who heb vervangen.

Advertenties

3 gedachtes over “Wake-on-LAN voor de homeserver

  1. Voor wake-on-LAN moet in de BIOS de instelling “Wake-Up by PCI card” op Enabled staan, ook als je de netwerkaansluiting op het moederbord gebruikt. Om de computer zichzelf in slaap te kunnen laten zetten, moet je (op datzelfde scherm) de instelling S1+S3 sleep activeren.

  2. In FRITZ!OS versie 06.83, dat is de huidige versie, is het automatisch wakker maken via WOL helaas stuk. AVM weet dit en zal het probleem in de volgende release oplossen.

    -update-
    Het is intussen 2018 — meer dan een half jaar later — en het probleem is nog niet opgelost.

  3. Om lokaal een computer op het netwerk wakker te maken, kan je het commando etherwake gebruiken. Als argument gebruik je het MAC adres van de computer die wakker moet worden. Wanneer je een bestand met de naam /etc/ethers aanmaakt, dan kan je in plaats hiervan ook het IP-adres als parameter gebruiken. Meer info over dit bestand met: man ethers

    Voor etherwake is het handig als je netwerkaansluiting gewoon eth0 heet. In de nieuwste Ubuntu versie is dat niet meer het geval, maar dit kan je aanpassen,
    zie: https://askubuntu.com/a/785442
    In plaats daarvan kan je natuurlijk ook een alias voor etherwake toevoegen aan ~/.bashrc
    bijvoorbeeld met: alias etherwake='etherwake -i eno1' voor een Intel NUC.

    Als je het volgende commando draait op de achtergrond, dan worden alle systemen op het LAN automatisch wakkergemaakt zodra je ze gebruikt:

    interface=eth0; \
    tcpdump -i $interface -n -l arp \
    | grep 'who-has \b([0-9]{1,3}\.){3}[0-9]{1,3}\b' --line-buffered -ohE \
    | gawk '{print $2; fflush()}' \
    | xargs -l1 \
     etherwake -D -i $interface

    Voorwaarde is dat je de MAC adressen en de IP adressen bekend moet maken in /etc/ethers .

    -update-

    Er zijn nog een paar alternatieven voor wat ik in de blog schreef.
    Een andere manier om de computer uit te schakelen als er geen andere gebruikers meer ingelogd zijn, is met een (if-)statement in het bestand .bash_logout, of als trap op deze manier: trap "beep -f 1300 -l 200" EXIT .

Vertel jouw mening

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit /  Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit /  Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit /  Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit /  Bijwerken )

w

Verbinden met %s