WAKE ON LAN

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Satzzeichenfehler korrigiert)
(Letzte Version wiederhergestellt)
Zeile 1: Zeile 1:
 +
Unter Wake on LAN (Abgekürzt: WOL) versteht man einen Rechner per Netzwerk einzuschalten.
 +
Dies ist z. B. sehr schön wenn man einen Linux-Router hat - sich per Internet zu diesem verbindet - und dann seinen VDR einschalten kann (um z. B. neue Timer zu speichern).
  
 +
Das Einschalten erfolgt meistens durch das sogenante "MagicPacket(TM)".
 +
 +
== Programme ==
 +
Die Programme müssen das "MagicPacket(TM)" erzeugen und an die MAC-Adresse der Netzwerkkarte des aufzuweckenden Rechners schicken.
 +
 +
=== Browser ===
 +
Bequem per Browser läßt sich über diesen [http://stephan.mestrona.net/wol/ Wake-On-Lan über Router-Dienst] das MagicPacket(TM) aus Web-Formular senden.  Das funktioniert teilweise sogar durch (DSL-) Router hindurch.
 +
 +
=== Linux ===
 +
Ein passendes Linux-Programm ist [http://www.scyld.com/wakeonlan.html ether-wake].
 +
 +
Compiliert wird der source-code mit
 +
<pre>
 +
wget ftp://ftp.scyld.com/pub/diag/ether-wake.c
 +
gcc -O -Wall -o ether-wake ether-wake.c
 +
cp ./ether-wake /usr/local/bin
 +
</pre>
 +
Der Aufruf erfolgt so:
 +
<pre>
 +
ether-wake 00:11:22:33:44:55
 +
</pre>
 +
wobei man für die Zahlenfolge einfach die MAC-Adresse des aufzuweckenden Rechners eingeben muss. Wenn man die nicht hat, kann man sich diese mit
 +
<pre>ifconfig eth0
 +
</pre>
 +
anzeigen lassen (natürlich auf dem Rechner den man später wecken will!).
 +
* als Alternative dazu gibt es z.B. noch [http://ahh.sourceforge.net/wol/ wol]
 +
 +
====Probleme====
 +
*seit dem 2.6er Kernel gibt es Probleme dass WOL nicht funktioniert Das Problem liegt darin, dass die meisten Netzwerkkarten-Treiber das WOL deaktivieren.
 +
*3Com Karten die den Treiber 3c59x verwenden, müssen den Parameter "enable_wol=1" angeben, um WOL zu aktivieren. Dies geht allerdings nur wenn der Treiber als Modul eingebunden wird.
 +
 +
'''Lösung des Problems:'''
 +
Es gibt ein Programm namens [http://www.sourceforge.net/projects/gkernel/ "ethtool"]. Hiermit kann man - nachdem der Netzwerktreiber geladen ist - die Netzwerkkartenparameter auslesen und ändern.
 +
So bekommt man angezeigt, wie die Parameter derzeit sind:
 +
<pre>ethtool eth0</pre>
 +
Beispiel:
 +
<pre>
 +
ethtool eth0
 +
Settings for eth0:
 +
      Supported ports: [ TP MII ]
 +
      Supported link modes:  10baseT/Half 10baseT/Full
 +
                              100baseT/Half 100baseT/Full
 +
      Supports auto-negotiation: Yes
 +
      Advertised link modes:  10baseT/Half 10baseT/Full
 +
                              100baseT/Half 100baseT/Full
 +
      Advertised auto-negotiation: Yes
 +
      Speed: 100Mb/s
 +
      Duplex: Full
 +
      Port: MII
 +
      PHYAD: 1
 +
      Transceiver: internal
 +
      Auto-negotiation: on
 +
      Supports Wake-on: pumbg
 +
      Wake-on: g
 +
      Current message level: 0x00000001 (1)
 +
      Link detected: yes
 +
</pre>
 +
Besonders die Zeilen "Supports Wake-on:" und "Wake-on:" sollte man hier im Auge behalten.
 +
Die Buchstaben bedeuten:
 +
<pre>
 +
      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.
 +
</pre>
 +
So aktiviert man das Wake-On-Lan beim Eintreffen eines "MagicPacket(TM)":
 +
<pre>
 +
ethtool -s eth0 wol g
 +
</pre>
 +
Ich habe diese Zeile einfach in meine /etc/init.d/networking an entsprechender Stelle nach dem Aktivieren des Netzwerks gesetzt.
 +
 +
Falls es noch Fragen gibt könnt Ihr mich auch direkt anmailen: Thorsten at Gehrig.de
 +
 +
=== Windows ===
 +
Für Windows gibt es die Freeware [http://www.spettel.de/lanstart/ LANStart].
 +
 +
=== Wakeup per CGI ===
 +
Einen eigenen Wakeupdienst mit MagicPacket(TM) und Web-Formular ist aber ansich auch keine größere Schwierigkeit.
 +
Also wenn man sich z.B. die eigene MAC Adresse nicht permanent nicht merken möchte, und wenn ein eigener Webserver, der CGI+Perl unterstützt, zur Verfügung steht, kann mit folgendem HTML-Wrapper und CGI-Script ein eigener Wakeupdienst aufgesetzt werden.
 +
 +
Dieser HTML-Teil in die Webseite einbetten.
 +
<pre>
 +
        <form action="/cgi/wakeup.pl" method="post">
 +
            <table>
 +
                <tr><td>HWaddress:</td><td><input size="40" maxlength="40" name="HWaddress" value="00:11:22:33:44:55"></td></tr>
 +
                <tr><td>IPaddress:</td><td><input size="40" maxlength="40" name="IPaddress" value="1.2.3.4"></td></tr>
 +
                <tr><td>Port:</td><td><input size="40" maxlength="40" name="Port" value="9"></td></tr>
 +
                <tr><td>&nbsp;</td><td><input type="submit" value="Absenden"></td></tr>
 +
            </table>
 +
        </form>
 +
</pre>
 +
 +
und diesen CGI-Teil als "/cgi/wakeup.pl" auf dem Webserver speichern.
 +
<pre>
 +
#!/usr/bin/perl -w
 +
 +
use strict;
 +
use Socket;
 +
use CGI;
 +
my $cgi = new CGI;
 +
use CGI::Carp qw(fatalsToBrowser);
 +
 +
$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');
 +
 +
print $cgi->header(-type    =>'text/html'),
 +
$cgi->start_html('Wakeup'),
 +
$cgi->h1('Wakeup'),
 +
wake($cgi->param('HWaddress'),$cgi->param('IPaddress'),$cgi->param('Port')),
 +
$cgi->end_html();
 +
 +
sub wake
 +
{
 +
my $hwaddr  = shift;
 +
my $ipaddr  = shift || '255.255.255.255';
 +
my $port    = shift || getservbyname('discard', 'udp');
 +
 +
my ($raddr, $them, $proto);
 +
my ($hwaddr_re, $pkt);
 +
 +
# Validate hardware address (ethernet address)
 +
 +
$hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6);
 +
if ($hwaddr !~ m/^$hwaddr_re$/) {
 +
return $cgi->p({-style => 'color:red'}, "Invalid hardware address: $hwaddr" );
 +
}
 +
 +
# Generate magic sequence
 +
 +
foreach (split /:/, $hwaddr) {
 +
$pkt .= chr(hex($_));
 +
}
 +
$pkt = chr(0xFF) x 6 . $pkt x 16;
 +
 +
# Allocate socket and send packet
 +
 +
$raddr = gethostbyname($ipaddr);
 +
$them = pack_sockaddr_in($port, $raddr);
 +
$proto = getprotobyname('udp');
 +
 +
if(!socket(S, AF_INET, SOCK_DGRAM, $proto)) {
 +
        return $cgi->p({-style => 'color:red'}, "socket : $!");
 +
}
 +
if(!setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)) {
 +
        return $cgi->p({-style => 'color:red'}, "setsockopt : $!" );
 +
    }
 +
 +
if(!send(S, $pkt, 0, $them)) {
 +
        return $cgi->p({-style => 'color:red'}, "send : $!");
 +
    }
 +
 +
close S;
 +
return $cgi->p("Sending magic packet to $ipaddr:$port with $hwaddr");
 +
}
 +
</pre>
 +
 +
==Sonstiges==
 +
Das ganze ist im BIOS zu aktivieren: '''Power On by Ring''' bzw. '''Wake on LAN'''
 +
 +
[[Bild:Wake On Lan 01.png|thumb|none|400px|''Einstellung im BIOS'']]
 +
 +
Vor allem bei älteren Netzwerkkarten, bzw. Mainboards muss außerdem ein Kabel zwischen Mainboard und Netzwerkkarte gesteckt werden: (Ausnahme sind Mainboards mit Onboard-Netzwerkkarte). Abhängig ist dies von der verwendeten PCI-Spezifikation.
 +
 +
Eine genauere Erläuterung dazu ist auf den [http://www.heise.de/ct/04/24/232/default.shtml c't Hotline Seiten zur Ausgabe 24/2004] unter ''Komplizierter Netzverkehr'' zu finden
 +
 +
[[Bild:Wake On Lan 02.png|thumb|none|400px|''WOL Kabel'']]
 +
 +
== Links ==
 +
{|
 +
|[1]
 +
|[http://www.ip-phone-forum.de/forum/viewtopic.php?p=94622 Thread zu "Wake-On-Lan aus Internet durch DSL-Router (hier FritzBox)"]
 +
|--
 +
|[2]
 +
|[http://stephan.mestrona.net/wol/ Wake-On-Lan über Router-Dienst: MagicPacket(TM) aus Web-Formular senden]
 +
|}

Version vom 29. August 2005, 20:18 Uhr

Unter Wake on LAN (Abgekürzt: WOL) versteht man einen Rechner per Netzwerk einzuschalten. Dies ist z. B. sehr schön wenn man einen Linux-Router hat - sich per Internet zu diesem verbindet - und dann seinen VDR einschalten kann (um z. B. neue Timer zu speichern).

Das Einschalten erfolgt meistens durch das sogenante "MagicPacket(TM)".

Inhaltsverzeichnis

 [Verbergen

Programme

Die Programme müssen das "MagicPacket(TM)" erzeugen und an die MAC-Adresse der Netzwerkkarte des aufzuweckenden Rechners schicken.

Browser

Bequem per Browser läßt sich über diesen Wake-On-Lan über Router-Dienst das MagicPacket(TM) aus Web-Formular senden. Das funktioniert teilweise sogar durch (DSL-) Router hindurch.

Linux

Ein passendes Linux-Programm ist ether-wake.

Compiliert wird der source-code mit

wget ftp://ftp.scyld.com/pub/diag/ether-wake.c
gcc -O -Wall -o ether-wake ether-wake.c
cp ./ether-wake /usr/local/bin

Der Aufruf erfolgt so:

ether-wake 00:11:22:33:44:55

wobei man für die Zahlenfolge einfach die MAC-Adresse des aufzuweckenden Rechners eingeben muss. Wenn man die nicht hat, kann man sich diese mit

ifconfig eth0

anzeigen lassen (natürlich auf dem Rechner den man später wecken will!).

  • als Alternative dazu gibt es z.B. noch wol

Probleme

  • seit dem 2.6er Kernel gibt es Probleme dass WOL nicht funktioniert Das Problem liegt darin, dass die meisten Netzwerkkarten-Treiber das WOL deaktivieren.
  • 3Com Karten die den Treiber 3c59x verwenden, müssen den Parameter "enable_wol=1" angeben, um WOL zu aktivieren. Dies geht allerdings nur wenn der Treiber als Modul eingebunden wird.

Lösung des Problems: Es gibt ein Programm namens "ethtool". Hiermit kann man - nachdem der Netzwerktreiber geladen ist - die Netzwerkkartenparameter auslesen und ändern. So bekommt man angezeigt, wie die Parameter derzeit sind:

ethtool eth0

Beispiel:

ethtool eth0
Settings for eth0:
       Supported ports: [ TP MII ]
       Supported link modes:   10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Supports auto-negotiation: Yes
       Advertised link modes:  10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Advertised auto-negotiation: Yes
       Speed: 100Mb/s
       Duplex: Full
       Port: MII
       PHYAD: 1
       Transceiver: internal
       Auto-negotiation: on
       Supports Wake-on: pumbg
       Wake-on: g
       Current message level: 0x00000001 (1)
       Link detected: yes

Besonders die Zeilen "Supports Wake-on:" und "Wake-on:" sollte man hier im Auge behalten. Die Buchstaben bedeuten:

      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.

So aktiviert man das Wake-On-Lan beim Eintreffen eines "MagicPacket(TM)":

ethtool -s eth0 wol g

Ich habe diese Zeile einfach in meine /etc/init.d/networking an entsprechender Stelle nach dem Aktivieren des Netzwerks gesetzt.

Falls es noch Fragen gibt könnt Ihr mich auch direkt anmailen: Thorsten at Gehrig.de

Windows

Für Windows gibt es die Freeware LANStart.

Wakeup per CGI

Einen eigenen Wakeupdienst mit MagicPacket(TM) und Web-Formular ist aber ansich auch keine größere Schwierigkeit. Also wenn man sich z.B. die eigene MAC Adresse nicht permanent nicht merken möchte, und wenn ein eigener Webserver, der CGI+Perl unterstützt, zur Verfügung steht, kann mit folgendem HTML-Wrapper und CGI-Script ein eigener Wakeupdienst aufgesetzt werden.

Dieser HTML-Teil in die Webseite einbetten.

        <form action="/cgi/wakeup.pl" method="post">
            <table>
                <tr><td>HWaddress:</td><td><input size="40" maxlength="40" name="HWaddress" value="00:11:22:33:44:55"></td></tr>
                <tr><td>IPaddress:</td><td><input size="40" maxlength="40" name="IPaddress" value="1.2.3.4"></td></tr>
                <tr><td>Port:</td><td><input size="40" maxlength="40" name="Port" value="9"></td></tr>
                <tr><td> </td><td><input type="submit" value="Absenden"></td></tr>
            </table>
        </form>

und diesen CGI-Teil als "/cgi/wakeup.pl" auf dem Webserver speichern.

#!/usr/bin/perl -w

use strict;
use Socket;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

	$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');

	print $cgi->header(-type    =>'text/html'),
	$cgi->start_html('Wakeup'),
	$cgi->h1('Wakeup'),
	wake($cgi->param('HWaddress'),$cgi->param('IPaddress'),$cgi->param('Port')),
	$cgi->end_html();

sub wake
{
	my $hwaddr  = shift;
	my $ipaddr  = shift || '255.255.255.255';
	my $port    = shift || getservbyname('discard', 'udp');

	my ($raddr, $them, $proto);
	my ($hwaddr_re, $pkt);
	
	# Validate hardware address (ethernet address)

	$hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6);
	if ($hwaddr !~ m/^$hwaddr_re$/) {
		return $cgi->p({-style => 'color:red'}, "Invalid hardware address: $hwaddr" );
	}

	# Generate magic sequence

	foreach (split /:/, $hwaddr) {
		$pkt .= chr(hex($_));
	}
	$pkt = chr(0xFF) x 6 . $pkt x 16;

	# Allocate socket and send packet

	$raddr = gethostbyname($ipaddr);
	$them = pack_sockaddr_in($port, $raddr);
	$proto = getprotobyname('udp');

	if(!socket(S, AF_INET, SOCK_DGRAM, $proto)) {
        	return $cgi->p({-style => 'color:red'}, "socket : $!");
	}
	if(!setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)) {
        	return $cgi->p({-style => 'color:red'}, "setsockopt : $!" );
    	}

	if(!send(S, $pkt, 0, $them)) {
        	return $cgi->p({-style => 'color:red'}, "send : $!");
    	}

	close S;
	return $cgi->p("Sending magic packet to $ipaddr:$port with $hwaddr");
}

Sonstiges

Das ganze ist im BIOS zu aktivieren: Power On by Ring bzw. Wake on LAN

Einstellung im BIOS

Vor allem bei älteren Netzwerkkarten, bzw. Mainboards muss außerdem ein Kabel zwischen Mainboard und Netzwerkkarte gesteckt werden: (Ausnahme sind Mainboards mit Onboard-Netzwerkkarte). Abhängig ist dies von der verwendeten PCI-Spezifikation.

Eine genauere Erläuterung dazu ist auf den c't Hotline Seiten zur Ausgabe 24/2004 unter Komplizierter Netzverkehr zu finden

WOL Kabel

Links

[1] Thread zu "Wake-On-Lan aus Internet durch DSL-Router (hier FritzBox)"
[2] Wake-On-Lan über Router-Dienst: MagicPacket(TM) aus Web-Formular senden