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.
