Wake-on-Lan mit Linux

Voraussetzungen

  • WoL muss im BIOS aktiviert sein.
  • Der Netzwerkadapter muss WoL unterstützen. Mit dem Tool ethtool wird überprüft, ob dies der Fall ist.
lexi:~# ethtool eth1
Settings for eth1:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: umbg
        Wake-on: g
        Current message level: 0x00000007 (7)
        Link detected: yes
lexi:~#

Einrichten

Die Zeile Supports Wake-on: umbg zeigt welche Events für das Aufwachen akzeptiert werden. Wake-on: g bedeutet, dass das Magic Packet als Event aktiviert ist. Um den Event zu aktivieren genügt das Kommando

lexi:~# ethtool -s eth0 wol g

Hilft die Konfiguration mit ethtool nicht, ist die Erkennung von Wakeup-Evens am PCI-Bus möglicherweise nicht aktiviert. Das lässt sich mit folgendem Kommando überprüfen:

lexi:# cat /proc/acpi/wakeup

Device Sleep state    Status
PCI0      4           disabled
COM1      4           disabled
...

PCI0 ... disabled bedeutet an dieser Stelle, dass vom PCI-Bus keine Wakeup-Events angenommen werden. Da die Netzwerkkarte meistens an diesem Bus hängt, bleiben MagicPackets folglich unbemerkt. Der PCI-Bus lässt sich aber für die Erkennung derartiger Events aktivieren:

lexi:~# echo -n PCI0 > /proc/acpi/wakeup

Vorsicht: Das Kommando toggelt zwischen enabled und disabled, also nur einmal ausführen.

Das folgende kleine Skript erledigt die nötigen Schritte z.B. beim shutdown:

 /usr/sbin/ethtool -s eth0 wol g
 if (grep PCI0 /proc/acpi/wakeup | grep disabled 2>&1 >> /dev/null) ; then
     echo -n PCI0 > /proc/acpi/wakeup
 fi

Beispielhaftes init-Skript:

#! /bin/sh
#
# Stellt die Funktion von Wake-On-Lan sicher

#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

case "$1" in
  stop|start|restart|force-reload|reload)
	echo -n "Turn on: Wake on Magic Packet"
	/usr/sbin/ethtool -s eth0 wol g
	echo
	;;
  *)
	exit 1
	;;
esac

exit 0

Das Skript landet in init.d und muss dann noch auführbar gemacht werden:

-rwxr-xr-x  1 root root  386 2006-01-31 09:50 wake_on_lan

Dann noch ein entsprechender Symlink:

/etc/rc0.d/S80wake_on_lan -> ../init.d/wake_on_lan

Den Link kann man damit setzen:

lexi:~# cd /etc/rc0.d
lexi:~# ln -s ../init.d/wake_on_lan S80wake_on_lan 

Alternative

Weniger aufwändig als das init-skript ist ein Eintrag in /etc/network/interfaces:

up ethtool -s eth0 wol g

Anmerkungen

Mit einem Marvell Onboard-Netzwerkadapter, der die Modi 10, 100 und 1000 Mbit unterstützen soll, war im Gbit-Mode kein WoL möglich. Scheinbar erkennt er die Magic Packets nicht. Im 100 Mbit Modus hingegen war WoL kein Problem. Um die Übertragungsrade auf 100 Mbit zu drosseln, kann der Adapter entweder an einem 100 Mbit-Switch angeschlossen, oder per ethtool ausdrücklich auf diese Geschwindigkeit gebracht werden. Dazu muss Auto-Negotiation deaktiviert werden. In einem Shutdown-Skript könnten diese Einstellungen durchgeführt werden, allerdings konnte der Adapter mit deaktivierter Auto-Negotiation gar keine Verbindung mehr herstellen. Die einzige Lösung ist also der Betrieb an einem 100 Mbit-Switch, was aber aus Performancegründen unerwünscht war. Die Lösung war schließlich der Einbau einer neuen Intel-Netzwerkkarte.