Wake On Lan e risparmio energetico

Fare qualcosa per l’ambiente e per i portafoglio è possibile. Ci sono diverse aziende di piccole e medie dimensioni, come anche liberi professionisti e piccoli uffici, in cui la tecnologia non ha una presenza molto invasiva.
A volte ad esempio, i servizi di stampa, condivisione file, accesso ad Internet non sono necessari 24 ore su 24. Alcune periferiche vanno in stand-by dopo qualche minuto ma altre restano attive fino al loro spegnimento.

Mi è capitato di vedere spesso negli uffici, computer che restano accesi molte ore perchè “qualcuno potrebbe avere bisogno di prelevare un file”. Forse questo articolo può essere utile a chi vuole sfruttare la moderna tecnologia per risparmiare sui consumi energetici salvaguardando l’ambiente.

Da diversi anni ormai, molte periferiche connesse alle rete locale, come ad esempio: stampanti di rete, computer, modem adsl,… supportano il Wake On Lan (WOL); uno standard ethernet in grado di attivare le periferiche on demand (a richiesta) mediante l’invio di un pacchetto di dati detto “Magic Packet”.
Mediante questo standard è possibile ad esempio avviare un computer in remoto, senza doversi recare fisicamente sul posto. WOL funziona anche attraverso Internet, quindi è possibile accendere in computer da qualunque parte del mondo, purchè il computer “dormiente” sia connesso alla rete mediante una periferica compatibile con lo standard.

Nell’esempio che seguirà, ipotizziamo di avere tre server ed uno o più client interconnessi alla medesima rete locale. Per comodità supponiamo che la rete abbia il seguente range di indirizzi IP:

192.168.0.1/24

Per chi non avesse dimestichezza con quanto indicato sopra, in questo esempio supponiamo che gli indirizzi della rete locale varino da 192.168.0.1 a 192.168.0.254.

Cosa fondamentale per utilizzare WOL è la conoscenza degli “indirizzi fisici” assegnati alle periferiche di rete. Questi indirizzi si chiamano MAC Address (Media Access Control Address) e servono ad identificare univocamente l’hardware connesso alla rete.
In effetti, un indirizzo IP viene assegnato al computer dal sistema operativo in uso, ma la consegna effettiva a livello hardware (chiamato strato fisico) avviene tramite il MAC address. Ad esmpio, ogni volta che un computer invia un pacchetto all’indirizzo 192.168.0.1, lo switch (o altra periferica dedicata alla consegna del pacchetto) controlla in una apposita tabella a quale indirizzo fisico corrisponde l’indirizzo 192.168.0.1.

Identificare il MAC address di un computer è cosa molto semplice. Per gli utilizzatori di Windows è sufficiente impartire il seguente comamdo dal prompt dos:

ipconfig /all

Dovreste ottenere un output simile a questo:

Configurazione IP di Windows
Nome host . . . . . . . . . . . . . . : WORKSTATION_1
Suffisso DNS primario . . . . . . . : retelocale.loc
Tipo nodo . . . . . . . . . . . . . . : Ibrido
Routing IP abilitato. . . . . . . . . : No
Proxy WINS abilitato . . . . . . . . : No
Elenco di ricerca suffissi DNS. . . . : retelocale.loc

Scheda Ethernet Connessione alla rete locale (LAN):
Suffisso DNS specifico per connessione: retelocale.loc
Descrizione . . . . . . . . . . . . . : Broadcom NetLink (TM) Gigabit Ethernet
Indirizzo fisico. . . . . . . . . . . : 00-17-18-4C-22-D0
DHCP abilitato. . . . . . . . . . . . : Sì
Configurazione automatica abilitata : Sì
Indirizzo IP. . . . . . . . . . . . . : 191.168.0.2
Subnet mask . . . . . . . . . . . . . : 255.255.255.0
Gateway predefinito . . . . . . . . . : 191.168.0.1
Server DHCP . . . . . . . . . . . . . : 191.168.0.1
Server DNS . . . . . . . . . . . . . : 191.168.0.1
Lease ottenuto. . . . . . . . . . . . : mercoledì 10 ottobre 2009 9.27.34
Scadenza lease . . . . . . . . . . . : giovedì 23 ottobre 2009 9.27.34

Scheda Ethernet Connessione rete senza fili:
Stato supporto . . . . . . . . . . . : Supporto disconnesso
Descrizione . . . . . . . . . . . . . : Intel(R) PRO/Wireless 3945ABG Network Connection
Indirizzo fisico. . . . . . . . . . . : 00-20-D3-66-D9-E5

Per gli utenti di Linux esiste un comando simile:

ifconfig

Con un output del tutto simile a questo:

eth0 Link encap:Ethernet HWaddr 00:20:C5:2E:F2:33
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2238 errors:0 dropped:0 overruns:0 frame:0
TX packets:740 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:208462 (203.5 KB) TX bytes:233284 (227.8 KB)
Interrupt:7 Base address:0xf00

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:58 errors:0 dropped:0 overruns:0 frame:0
TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5663 (5.5 KB) TX bytes:5663 (5.5 KB)

Abilitare WOL
Tutte le moderne schede madri (mainboard) offrono il supporto a WOL, specie se la scheda di rete è integrata. Che io ricordi anche alcuni Pentium II sono dotati di questo supporto.

Il fatto che il computer supporti lo standard non vuol dire però che questo sia attivo. Per verificare/attivare questa opzione è necessario accedere al BIOS (fare riferimento al manuale della scheda madre oppure lasciare un post su questo articolo). Una volta abilitato il WOL è necessario verificare che il sistema operativo gestisca correttamente lo spegnimento delle periferiche durante lo shutdown. Se il sistema operativo dovesse spegnere completamente il computer, questi non risponderebbe al magic packet anche se nel bios l’opzione WOL fosse attiva. E’ come staccare la presa di alimentazione lasciando il PC senza corrente.

Gli utenti di Windows non devono preoccuparsi perchè, che io sappia, tutte le moderne versioni del sistema operativo di Microsoft consentono alla scheda madre di tenere “accese” le schede di rete qual tanto che basta per ricevere il magic packet.

Per gli utenti Linux bisogna fare un po’ di attenzione. Il kernel di solito è compatibile con il WOL ma le impostazioni necessarie per istruire il kernel di “alimentare la scheda di rete anche dopo lo shutdown” si perdono ad ogni riavvio.
Per questo motivo è necessario istruire il kernel prima di spegnere la macchina. Il parametro che attiva il WOL su linux è il seguente:

/sbin/ethtool -s eth0 wol g

Il parametro “g” serve proprio ad istruire il kernel.
Per fare in modo che questa opzione resti attiva dopo ogni riavvio, io consiglio di inserire il comando precedente dentro il file “/etc/rc.local” così ogni volta che linux fa il boot il kernel viene istruito.

Sfruttare WOL
Al fondo di questo articolo ho inserito i link a due programmi liberamente utilizzabili (uno per Windows e l’altro per Linux) con i quali è possibile sfruttare il WOL.
Gli utenti Windows posso usare il programma mc-wol.exe

mc-wol 11:11:11:11:11:11

Mentre gli amanti del pinguino possono fare uso di ether-wake:

./ether-wake 11:11:11:11:11:11

In entrambi i casi “11:11:11:11:11:11″ è il MAC address della macchina che si intente “svegliare”.

Automatizzare WOL
I comandi elencati in precedenza sono utili per accendere un Pc ma se i PC sono diversi allora può diventare un problema ricordare a memoria tutti gli indirizzi fisici.
Di seguito riporto uno script utile per accendere diverse macchine in base loro nome piuttosto che il MAC address.

Per i client Windows:

@echo off
if (%1) == (tizio) mc-wol 11:11:11:11:11:11 > nul & goto fine
if (%1) == (caio) mc-wol 22:22:22:22:22:22 > nul & goto fine
if (%1) == (sempronio) mc-wol 33:33:33:33:33:33 > nul & goto fine
if (z%1) == (z) echo Usage: %0 servername & exit /B 0

echo Server not found.
echo Usage: %0 servername
exit /B 2

:fine
echo done.
exit /B 0

Per i client Linux:

#!/bin/sh

# do it
case “$1″ in
tizio)
/sbin/ether-wake 11:11:11:11:11:11
;;

caio)
/sbin/ether-wake 22:22:22:22:22:22
;;

sempronio)
/sbin/ether-wake 33:33:33:33:33:33
;;

–help)
echo “Usage: $0 servername”
exit 0
;;

*)
echo “Server not found.”
echo “Usage: $0 servername” >&2
exit 2
esac
echo “done.”
exit 0

Spegnere le periferiche
Abbiamo visto come sia facile accendere un componente di rete con WOL ma senza un processo in grado di spegnere le risorse quando non servono più l’idea di risparmiare viene meno. Penso che nessuno abbia voglia di spegnere manualmente le periferiche prima di uscire dall’ufficio, specie se come me non gode di una memoria di ferro.
L’idea in questo caso è quella di fare in modo che tutte le risorse “on demand” vadano giù se nessun client è attivo sulla rete.

Ci serve uno script che possa essere eseguito ad intervalli regolari su un server per garantire i servizi solo quando necessitano:

#!/bin/sh
#script staying_alive.sh

myfiledeny=”/root/astutami.dont”

if [ -e $myfiledeny ]; then
exit 0
fi

for myPing in 4 5 9 10 11 12 13 20 21
do
ping -c 30 192.168.0.$myPing && exit 0
done

exit 1

In questo esempio, il server “pinga” alcuni indirizzi della classe 192.168.0.1/24 per capire se ci sono client attivi. In caso di esito negativo esce con un codice di errore 1. Questo valore può essere impiegato in un altro script per spegnere la macchina:

#!/bin/sh
#script alive.sh

/sbin/staying_alive.sh

EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/sbin/dormi.sh
fi
exit 0

Il codice è utile ad esempio se inserito all’interno di cron (ad esempio nel crontab oppure nella cartella cron.hourly), il servizio di Linux che avvia operazioni pianificate. In questo caso ogni ora il server eseguirebbe un test per capire se ci sono client sulla rete prima di andare a “dormire”.

Gli utenti windows non useranno il cron ma AT (altrimenti conosciuto come “operazioni pianificate”).

Può capitare che per qualche motivo, il server debba restare acceso nonostante la mancanza di client, come ad esempio in caso di manutenzione o aggiornamento. Nell’ultimo script (quello che si preoccupa di spegnere effettivamente il server) possiamo prevedere una “deroga” allo spegnimento in base ad alcune regole.
Nel nostro caso, l’esistenza di un apposito file all’intnerno della directory root, evita lo spegnimento programmato del server:

#!/bin/sh
#script dormi.sh

myfile=”/root/astutami”
myfiledeny=”/root/astutami.dont”

if [ -e $myfiledeny ]; then
echo “Don’t astutami for now.”
else
touch $myfile

wall << "EOF"

ALERT! System is going down after 5 minutes by now!
To avoid shutdown delete the file:

/root/astutami

EOF

echo “waiting…”
sleep 5m
if [ -e $myfile ]; then
rm $myfile
/sbin/astutami.sh
exit 0
fi
fi

Altra cosa interessante è che lo script appena riportato invia un messaggio broadcast (cioè a tutti gli utenti con una console attiva sul server) che indica l’imminente spegnimento ma attende 5 minuti prima di eseguire il comando. In questo periodo è ancora possibile evitare lo shutdown semplicemente eliminando il file /root/astutami.

Infine, l’ultimo script che presento si occupa semplicemente di spegnere la macchina.

#!/bin/sh
#script astutami.sh

shutdown -h now

Per concludere
Basta usare un po’ di fantasia per poter sfruttare ancora meglio le possibilità offerte da WOL.
Si potrebbe utilizzare AT e cron anche per accendere i server; io lo faccio ad esempio per schedulare un backup notturno.

Spero di non avere annoiato nessuno. Grazie per l’attenzione. Alla prossima

Per saperne di più
WOL Wikipedia (EN)
ether-wake
mc-wol

Quale IP ha il mio modem/router ADSL?

Vi è capitato di voler lasciare acceso il proprio modem/router ADSL quando siete fuori casa, per poi poterlo interrogare tramite Internet?
I router di ultima generazione hanno la possibilità di utilizzare protocolli come Dynamic DNS (DDNS) che consentono di rintracciare l’IP del modem anche in presenza di un indrizzo dinamico.

Per quanto riguarda i modem, questi sono spesso utilizzati per mezzo di un PC. Se l’opzione DDNS non è disponibile, allora e sufficiente scaricare un client DDNS (basta fare una ricerca su Internet) da installare sulla propria macchina.

Chi inevece come me utilizza un router che non supporta il protocollo DDNS deve inventarsi qualcosa.

Una semplice soluzione fatta in casa
Nel mio caso è possibile interrogare il router per mezzo del protocollo telnet (porta 23).
I modem/router che supportano le sessioni su porta 23 sono tanti (es. Dlink 300T, 302T, 320T, ecc.).
L’idea è quella di prendere l’IP del modem ed inviarlo ad un indirizzo di posta elettronica a cadenza regolare; ad esempio, ogni ora.

Per prima cosa dobbiamo creare uno script in grado di generare l’output per la sessione telnet proprio come se fosse un utente a farlo:

cat > /sbin/runtelnet.sh < #!/bin/sh
host=192.168.1.1
port=23
login=root
passwd=RouterPass

echo open ${host} ${port}
sleep 1
echo ${login}
sleep 1
echo ${passwd}
sleep 1
echo ifconfig ppp0
sleep 1
echo exit
EOF

Questo comando crea un file chiamato /sbin/runtelnet.sh che contiene i comandi da impartire al router per ottenere l’IP della rete WAN. E’ necessario modificare le variabili secondo le proprie esigenze.

A questo punto dobbiamo renderlo eseguibile:

chmod 750 /sbin/runtelnet.sh

Adesso bisogna creare un piccolo script che prenda questo indirizzo e lo spedisca in posta elettronica:

cat > /sbin/myIP.sh < #!/bin/sh

SUBJECT=”Modem Public Ip”

# A chi spediamo l’email?
EMAIL=”noreply@morzello.com”

# inviamo l’email usando /bin/mail
/sbin/runtelnet.sh | telnet 2> /dev/null | grep “addr:” | /bin/mail -s “$SUBJECT” “$EMAIL” > /dev/null 2>&1

echo “done.”
EOF

Questo comando genera il file /sbin/myIP.sh con il quale spediremo un messaggio contenente l’IP pubblico del router.
Anche in questo caso è necessario rendere eseguibile il file con il comando:

chmod 750 /sbin/myIP.sh

Prima di concludere, facciamo qualche test per capire se tutto è in ordine.

Quando tutto funzionerà correttamente, potremo procedere con un inserimento nel file /etc/crontab in modo da eseguire questo comando ogni ora:

01 * * * * root /sbin/myIP.sh >/dev/null 2>&1


In alternativa, sui sistemi operativi come ad esempio Fedora, è possibile linkare lo script nella cartella /etc/cron.hourly.

Per saperne di più:
cos’è il DDNS
DynDNS – servizio on-line
No IP – un altro servizio on-line