ubuntuusers.de

Wake on LAN

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Unter Wake-on-LAN (WOL) versteht man, einen Rechner per Netzwerk einzuschalten. Dies ist z.B. sehr praktisch, wenn man einen Linux-Router oder Server hat und diesen ferngesteuert aus- und einschalten kann. Das Einschalten erfolgt meistens durch ein sogenanntes Magic Packet.

Zum Wecken braucht man einen zweiten Rechner mit einem Programm, das ein "Magic Packet" erzeugt und an die MAC-Adresse der Netzwerkkarte des aufzuweckenden Rechners schickt. Damit WOL funktioniert, muss der Rechner dafür vorbereitet werden. Sowohl im BIOS als auch im System müssen die richtigen Einstellungen vorgenommen werden.

WOL im BIOS aktivieren

Im ersten Schritt sollte man im BIOS des Rechners überprüfen, ob Wake-On-LAN überhaupt aktiviert ist. Die in Rechnern verbauten BIOS-Arten sind zu vielfältig, um detaillierte Tipps geben zu können. Doch unter den Bezeichnungen "Wake on LAN" oder "Power on PCI/PCIE Devices" sollte man fündig werden.

Eventuell muss man auch einen Schraubendreher in die Hand nehmen. Ältere PCI-Netzwerkkarten wurden oft mit einem kleinen Kabel mit dem Mainboard verbunden. Fehlt dieses Kabel, so geht eventuell WOL gar nicht. Moderne PCI-Netzwerkkarten brauchen dieses Kabel nicht mehr. Auf dem Mainboard integrierte Netzwerkadapter benötigen das Kabel mit Sicherheit ebenfalls nicht.

Ubuntu für WOL vorbereiten

Die meisten Kernelmodule für Netzwerkkarten aktivieren beim Hochfahren Wake-On-LAN nicht. Dieses muss extra nach oder während des Starts des Systems durchgeführt werden. Dies geschieht über das Programm ethtool, das erst über das Paket

  • ethtool

Paketliste zum Kopieren:

sudo apt-get install ethtool  

Oder mit apturl die Pakete installieren. Link: apt://ethtool

nachinstalliert [1] werden muss. Mit ethtool können die Parameter und Einstellungen von Netzwerkkarten ausgelesen und verändert werden.

Hinweis:

Im Laufe des Wikis wird nur das Gerät "eth0" behandelt. Sollte man ein anderes Netzwerkgerät zu Wake-On-LAN benutzen wollen, so müssen die Befehle natürlich entsprechend angepasst werden.

Eine Liste der Adapter kann ausgegeben werden mit: ip link

Über den Befehl

sudo ethtool eth0 

  Settings for eth0:
       Supported ports: [ TP MII ]
       Supported link modes:   10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
[...]
       Auto-negotiation: on
       Supports Wake-on: pumbg
       Wake-on: g
       Current message level: 0x00000001 (1)
       Link detected: yes

im Terminal [3] bekommt man angezeigt, wie die Optionen derzeit gesetzt sind. Besonders die Zeilen "Supports Wake-on" und "Wake-on" sollte man hier im Auge behalten. Die Bedeutung der einzelnen Buchstaben findet man in der Man-Page zu ethtool.

man ethtool 

[...]
      wol p|u|m|b|a|g|s|d...
             Set Wake-on-LAN options.  Not all  devices  support  this.   The
             argument  to  this  option  is a string of characters specifying
             which options to enable.
             p  Wake on phy activity
             u  Wake on unicast messages
             m  Wake on multicast messages
             b  Wake on broadcast messages
             a  Wake on ARP
             g  Wake on MagicPacket(tm)
             s  Enable SecureOn(tm) password for MagicPacket(tm)
             d  Disable (wake on nothing).  This option clears  all  previous
                options.
[...]

Mittels des Befehls

sudo ethtool -s eth0 wol g 

aktiviert man nun das Wake-On-LAN beim Eintreffen eines "MagicPacket". Allerdings überdauert diese Einstellung einen Neustart des Rechners nicht. Sie muss bei jedem Start des Rechners neu gesetzt werden.

WOL dauerhaft aktivieren

Um diese Einstellung bei jedem Start des Rechners zu setzen, bieten sich verschiedene Wege an. Am einfachsten und zuverlässigsten ist sicherlich die erstgenannte Methode.

Methode 1: /etc/rc.local

Die Datei /etc/rc.local wird bei jedem Boot-Vorgang ausgeführt. Sie ist dafür gedacht, einfache Befehle beim Start auszuführen. Daher ist sie der ideale Platz, um Wake-On-LAN zu aktivieren. Man trägt mit einem Editor mit Root-Rechten [4] einfach nur den Befehl

ethtool -s eth0 wol g

zum Aktivieren von WOL ein. Weitere Informationen finden sich im entsprechenden Wiki Artikel zur rc.local. Sollte nach einem Neustart dennoch das Argument nicht gesetzt sein, wird rc.local evtl. zu früh, also noch vor dem Anlegen der Netzwerkschnittstelle, ausgeführt. In diesem Falle bleibt ein

sleep 5
ethtool -s eth0 wol g

bzw. die nächste Methode.

Methode 2: /etc/network/interfaces

Hinweis:

Seit Ubuntu "Intrepid Ibex" 8.10 ist die /etc/network/interfaces üblicherweise bis auf das loopback-Device "lo" leer. Der Network-Manager übernimmt bei einer Desktop-Installation vollständig die Verwaltung der Netzwerke. Daher bietet sich hier besonders die erste Methode an, da es keine graphische Oberfläche mehr gibt, um die interfaces Datei zu bearbeiten.

Hier ist ebenfalls mit Root-Rechten [4] die Datei /etc/network/interfaces zu bearbeiten. Für jedes Interface, auf dem Wake-On-Lan aktiviert werden soll, muss die Zeile pre-down /usr/sbin/ethtool -s <netzwerkdevice> wol g ergänzt werden. Ein so konfiguriertes Netzwerkgerät sieht dann beispielsweise so aus:

auto eth0
iface eth0 inet static
    address 192.168.0.97
    netmask 255.255.255.0
    gateway 192.168.0.1
    pre-down /usr/sbin/ethtool -s eth0 wol g

Dabei ist zu beachten, dass manuell über die /etc/network/interfaces konfigurierte Netzwerk-Geräte nicht mehr im Network-Manager erscheinen. Diese Konfiguration bietet sich daher im Endeffekt nur für Serversysteme an.

Methode 3: systemd

Mit systemd funktioniert Methode 1 mit /etc/rc.local nicht direkt. Mit einem Eintrag in die Konfigurationsdatei /etc/systemd/system/network-online.target.wants/networking.service lässt sich Wake-On-LAN aktivieren. Man trägt mit einem Editor mit Root-Rechten [4] einfach nur die Zeile:

ExecStartPost=/sbin/ethtool -s eth0 wol g

zum Aktivieren von WOL ein. Weitere Informationen finden sich im entsprechenden Wiki Artikel zu systemd.

halt-Skript anpassen

Unglücklicherweise reicht das noch nicht aus, damit der Rechner wieder aufwacht. Schuld daran ist das Skript /etc/init.d/halt, das beim Herunterfahren des Systems ausgeführt wird. Es schaltet von Haus aus alle Netzwerkschnittstellen aus und macht damit die bisherige Arbeit wieder zunichte.

Um das Deaktivieren der Netzwerkkarten beim Herunterfahren zu verhindern, öffnet man die Datei /etc/default/halt in einem Editor mit Root-Rechten [4] und fügt die Variable "NETDOWN" mit dem Wert "no" ein:

NETDOWN=no

Danach bleiben die Karten aktiviert. Änderungen des Init-Skriptes "/etc/init.d/halt" werden bei Ubuntu-Updates überschrieben!

WOL nach Standby oder Suspend

Wer seinen Rechner nicht richtig herunterfährt, sondern lediglich Standby oder den Ruhezustand benutzt, der stellt eventuell fest, dass WOL nach dem Tiefschlaf nicht funktioniert. Hier hilft es, WOL wie oben beschrieben einzurichten und anschließend in der Datei /etc/default/acpi-support die Option

# Add services to this list to stop them before suspend and restart them in
# the resume process.
STOP_SERVICES=""

um den Eintrag networking zu erweitern, so dass die Option danach so

# Add services to this list to stop them before suspend and restart them in
# the resume process.
STOP_SERVICES="networking"

aussieht. Eventuell stehen hier schon andere Einträge. Hier muss man "networking" mit einem Leerzeichen abgetrennt einfügen. Welche weiteren Einträge dort vorhanden sind, hängt von den auf dem System installierten Programmen ab - die Zeile sieht beispielsweise so STOP_SERVICES="mysql lirc networking" aus.

Aufwecken

Hinweis:

Das Aufwecken eines Rechners ist nur innerhalb des eigenen lokalen Netzwerkes möglich, da die "Magic Packets" nicht routingfähig sind. Es ist daher nicht möglich, einen Rechner direkt über das Internet aufzuwecken. Möchte man dies tun, so benötigt man einen Router oder Rechner im LAN, den man vom Internet aus erreichen kann. Manche Hardware-Router bieten in ihren Web-Frontends sogar Wake-On-LAN-Funktionen an.

Hat man dies alles gemacht, kann man den zu weckenden Rechner herunterfahren. Von einem zweiten Rechner im lokalen Netzwerk aus kann man versuchen, den Rechner aufzuwecken. Dazu benötigt man die MAC-Adresse des aufzuweckenden Rechners. Man findet sie beispielsweise auf der Netzwerkkarte oder eventuell auf der Rückseite des Rechners. Alternativ kann man sie über den Befehl

ifconfig eth0 | grep "Hardware Adresse" 

eth0      Link encap:Ethernet  Hardware Adresse 00:0c:5e:17:23:7a

herausfinden. Die MAC-Adresse wäre in diesem Fall die Zeichenfolge "00:0c:5e:17:23:7a". Zum Aufwecken stehen verschiedene Programme zur Verfügung.

etherwake

Für Ubuntu gibt es ein Programm im Paket

  • etherwake (universe )

Paketliste zum Kopieren:

sudo apt-get install etherwake 

Oder mit apturl die Pakete installieren. Link: apt://etherwake

welches einfach über die Paketverwaltung installiert [1] werden kann. Der Aufruf erfolgt im Terminal [3] mit

# Allgemein
sudo etherwake <mac-adresse>
#Beispiel
sudo etherwake 00:0c:5e:17:23:7a 

wakeonlan

Mit diesem Befehl ist es komfortabler möglich, verschiedene Rechner per LAN aufzuwecken. Unter anderem lassen sich die Hardwareadressen in Dateien speichern. Das benötigte Paket [1] heißt

  • wakeonlan (universe )

Paketliste zum Kopieren:

sudo apt-get install wakeonlan 

Oder mit apturl die Pakete installieren. Link: apt://wakeonlan

Problemlösungen

Selbst wenn man all diese Einstellungen vorgenommen hat, kann man über eine Reihe von Problemen stolpern. Im Folgenden sind weitere Problemlösungen gesammelt. Man sollte diese nicht wahllos durchprobieren und "eingebaut" lassen, sondern die einzelnen Tipps nach und nach probieren. Einige der genannten Tipps haben Nachteile, wie z.B. das Deaktivieren des modernen Stromsparmechanismus ACPI zugunsten des veralteten APMs.

BCM5723-Chipsatz

Bei einer Broadcom NetXtreme Netzwerkkarte mit dem BCM5723-Chipsatz, Treibermodul: tg3 Version 3.128 funktioniert folgender Weg lt fx-83: Eine Datei /etc/rc0.d/K99wol_poweroff erstellen und ausführbar machen. Folgender Inhalt:

#!/bin/sh
ifconfig eth0 down 
poweroff

Nforce-4 Chipsätze

Hinweis:

Die umgekehrte MAC-Adresse kommt nur vor, wenn man den Rechner "richtig" heruntergefahren hat. Fährt man den Rechner in den Standby- oder Ruhezustand, so kann er nur mit der MAC-Adresse in der richtigen Reihenfolge geweckt werden.

Im Kernel gibt es einen Fehler 🇬🇧 , der bewirkt, dass die MAC-Adresse beim Herunterfahren in der falschen Reihenfolge auf die Netzwerkkarte geschrieben wird. Mittels des Befehls

lsmod | grep forcedeth 

forcedeth              68112  0

findet man heraus, ob die eigene Hardware diesen Treiber benutzt. Wer nun Hardware besitzt, die den forcedeth-Treiber verwendet, und das Aufwecken über die "richtige" MAC nicht klappt, kann man versuchen, seine MAC-Adresse verkehrt herum einzugeben. Also statt 01:02:03:04:05:06 dreht man die Folge um: 06:05:04:03:02:01.

3c905c Chipsatz

Netzwerkkarten mit dem 3C905C Chipsatz von 3Com brauchen eine Option, die beim Laden des Kernelmoduls "3c59x" geladen werden muss. Dazu fügt man [4] in der Datei /etc/modprobe.d/options die Zeile

options 3c59x enable_wol=1

ein und startet den Rechner neu. Ob solch eine Netzwerkkarte im eigenen Rechner verbaut ist, kann man mittels

lsmod | grep 3c59x 

3c59x                  46248  0 
mii                     6400  1 3c59x

überprüfen. Sollte die Ausgabe leer sein, so wurde das Kernelmodul nicht geladen. Daher wird auch keine Netzwerkkarte im Rechner verbaut sein, die solch einen Chipsatz benutzt.

Marvell Yukon (Modul "sky2")

Bei diesem Ethernetadapter kann es helfen 🇬🇧, den Modul-Parameter "legacy_pme" auf "1" zu setzen. Der Parameter wurde ist jedoch erst ab Kernel 3.2.14-1 vorhanden. Dazu muss dem Kernel der Parameter

sky2.legacy_pme=1

übergeben werden. Alternativ ist auch ein Eintrag in modprobe.d möglich:

sudo sh -c 'echo "options sky2 legacy_pme=1" >> /etc/modprobe.d/sky2.conf'; sudo update-initramfs -u 

Kernel-Parameter

Bei diversen Serversystemen hilft es, auf ACPI zu verzichten und APM zu benutzen (z.B.: HP Server tc2110). Dazu bearbeitet man die Datei /boot/grub/menu.lst mit einem Editor mit Root-Rechten [4] und fügt in der Zeile mit den "defoptions" die Kernel-Parameter "apm=on apm=power-off" hinzu. Die Zeile

[...]
# defoptions=quiet splash language=de_DE
[...]

muss dann beispielsweise so

[...]
# defoptions=quiet splash language=de_DE apm=on apm=power-off
[...]

aussehen. Damit diese Optionen in die Kernelzeilen geschrieben werden, muss noch der Befehl

sudo update-grub 

ausgeführt werden. Nun sollte man den Rechner neu starten und Wake-On-LAN testen.

/proc/acpi/wakeup

Sollte WOL nach wie vor nicht funktionieren, so kann man sich den Inhalt der "virtuellen" Datei /proc/acpi/wakeup ansehen.

cat /proc/acpi/wakeup 

Device	S-state	  Status   Sysfs node
HUB0	  S5	 disabled  pci:0000:00:06.0
XVR0	  S5	 disabled  pci:0000:00:0f.0
[...]
AZAD	  S5	 disabled  pci:0000:00:06.1
MMAC	  S5	 disabled  pci:0000:00:08.0

Man erkennt, dass WOL für alle Geräte ("devices") deaktiviert ist! Ein Vergleich der Device-Nummern mit

lspci 

[...]
00:08.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a2)
[...]

lässt hier die Zugehörigkeit von MMAC zum kabelgebundenen Netzwerkinterface erkennen. Zum Testen aktiviert man mittels des Befehls

echo -n MMAC | sudo tee /proc/acpi/wakeup 

WOL für das gerade herausgefundene Gerät. Auf dem eigenen Rechner muss man die Angabe des "device" sicherlich anpassen. Den Erfolg kann man nun mittels

cat /proc/acpi/wakeup 

Device  S-state   Status   Sysfs node
[...]
MMAC	  S5	 enabled   pci:0000:00:08.0
[...]

überprüfen. Sollte ein Wake-On-LAN nun funktionieren, so bietet es sich an, die Zeile

echo -n MMAC | tee /proc/acpi/wakeup

in die rc.local aufzunehmen, so dass sie bei jedem Neustart des Systems ausgeführt wird.

NIC-Module bei SUSPEND nicht entladen

Hinweis:

Dies gilt für Ubuntu 8.04 und eventuell auch spätere Versionen! Das ist ein Workaround, der überprüft werden muss.

  • Die Datei /usr/lib/pm-utils/sleep.d/50modulesins Verzeichnis /etc/pm/sleep.d/ kopieren. Dadurch wird nicht mehr der pm-utils-Hook aus /usr/lib/pm-utils/sleep.d/ sondern der angepasste aus dem Verzeichnis /etc/pm/sleep.d/. Ausserdem wird dadurch das angepasste Skript nicht beim nächsten Update des Pakets pm-utils durch die Standard-Version ersetzt.

sudo cp /usr/lib/pm-utils/sleep.d/50modules /etc/pm/sleep.d/
sudo chmod +x /etc/pm/sleep.d/50modules

  • Im Skript /etc/pm/sleep.d/50modules den Inhalt der Funktion unload_network() kommentieren. Das sollte so aussehen:

unload_network()
{
#       for x in /sys/class/net/*; do
#       if [ -e $x/device/driver ]; then
#               NETMODULES="$NETMODULES $(basename $(readlink $x/device/driver) | tr [:upper:\] [:lower:])"
#       fi
#       done
#       for x in $NETMODULES; do
#               modunload $x;
#       done
#       if [ -d /sys/module/ndiswrapper ]; then
#               modunload ndiswrapper;
#       fi
}

  • Anschließend sollte WOL funktionieren!

Für ältere Versionen von Ubuntu, müsste eine Datei 60-generate-modules-list.sh und 55-down-interfaces.sh unter /etc/acpi/sleep.d/ sein, welche wahrscheinlich das gleiche tut. Konnte ich bis jetzt aber nicht testen!

Neustart als provisorische Lösung

Möglicherweise lässt sich der Rechner trotz allem nicht aufwecken, wenn er aus Ubuntu/Linux heraus heruntergefahren wurde. In manchen Fällen befindet sich der Computer aber in einem aufweckbaren Zustand, wenn er aus einem anderen Betriebssystem oder aus dem Bootloader heraus heruntergefahren wurde. In diesem Fall hilft es nach jedem Linux-Herunterfahren einmal kurz neu zu starten und wieder aus zu schalten. Dies lässt sich bequem über die folgenden Befehle erledigen, die diesem 🇩🇪 Beitrag entnommen sind. Diese Anleitung bezieht sich auf GRUB 2.

Achtung!

Bei Änderungen am Bootloader sollte man immer mit Bedacht vorgehen und Sicherheitskopien anlegen.

Zunächst muss ein neuer Boot-Eintrag erstellt werden. Dazu wird die Datei /etc/grub.d/40_custom wie folgt angepasst:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "PowerOff" {
saved_entry=0
save_env saved_entry
halt
}

In der /etc/default/grub muss folgende Zeile angepasst werden:

GRUB_DEFAULT=saved

Nach jeder Änderung an der Datei /etc/default/grub muss die Grubkonfiguration aktualisiert werden:

sudo update-grub 

Der Rechner sollte dann mit folgendem Befehl heruntergefahren werden:

grub-set-default PowerOff ; shutdown -r now 

TLP-Einstellung

Unter Ubuntu 16.04 muss für WOL zusätzlich eine Einstellung des Power-Management-Tools TLP geändert werden. Dazu wird in der Datei /etc/default/tlp die Zeile

WOL_DISABLE=Y

zu

WOL_DISABLE=N

geändert. Ein Neustart ist nötig, um diese Änderung zu übernehmen.

Diese Revision wurde am 5. Februar 2020 20:34 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk