WAKE ON LAN

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (aus VDR Wiki, der freien Wissensdatenbank Wiederhergestellt zur Version vom 00:34, 22. Apr 2006)
K (Linux)
Zeile 15: Zeile 15:
 
Ein passendes Linux-Programm ist [http://www.scyld.com/wakeonlan.html ether-wake].
 
Ein passendes Linux-Programm ist [http://www.scyld.com/wakeonlan.html ether-wake].
  
Compiliert wird der Sourcecode mit
+
Kompiliert wird der [[Quelltext]] mit
  
 
<pre>
 
<pre>

Version vom 12. Mai 2006, 21:30 Uhr

Inhaltsverzeichnis

Beschreibung

Mittels Wake on LAN (Abgekürzt: WOL oder WoL) kann der Rechner per Netzwerk eingeschaltet werden. 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 etwa neue Timer zu speichern). Das funktioniert z.B. bei der FritzBox mit Hilfe des Fritz!Box WoL Hack.

Das Einschalten erfolgt meistens durch das sogenante "MagicPacket".

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

Möglichkeiten

Browser

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

Programme

Linux

Ein passendes Linux-Programm ist ether-wake.

Kompiliert wird der Quelltext 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

Bzw.

ether-wake -p <HOST> 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

Oder

arp

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

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

M$

Für Windows gibt es die Freeware LANStart.

Einige Leute haben berichtet dass LanStart bei Ihnen nicht funktioniert. Alternativen sind wol.exe von http://www.gammadyne.com/cmdline.htm

oder mc-wol.exe von http://www.matcode.com/wol.htm (funktioniert auch nicht immer. Für die Scovery250 ist es ok, für den via-rhine II nicht).

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 auf dem Webserver speichern.

Datei
/cgi/wakeup.pl
#!/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");
}


Probleme

2.6er Kernel

  • 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

  • 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

Sonstiges

BIOS einstellungen

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

Einstellung im BIOS

Verbindung

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
  3. Fritz!Box WoL Hack
  4. Wake On LAN client - FAQ
  5. Gute Verteilerseite
  6. C++ Beispiel auf codeproject.com
  7. Debian spezifischer Artikel zu WOL