tas2580

Server per LAN einschalten

tas2580  

Das Problem bei meinen Homeservern ist das solange alle Server laufen sehr viel Strom verbraucht wird, außerdem sind die Lüfter sehr laut was nervt wenn ich mein Wohnzimmer wo die Server stehen nutzen will. Die meisten Server müssen auch nicht dauerhaft laufen, wenn niemand spielt ist es auch nicht nötig das der Gameserver läuft. Wenn die Server immer aus sind und von Hand eingeschaltet werden müssen ist das aber auch blöd da ich teilweise Server über das Internet nutzen will ohne das ich bevor ich von zuhause weg gegangen bin wusste das ich speziell diesen Server brauchen werde.


Da war doch was mit Wake on LAN, zumindest sehe ich diese Einstellungen schon seit Jahren im BIOS meiner Rechner, aber beschäftigt damit habe ich mich noch nie. Nach ein bisschen googlen habe ich erkannt das es genau das ist was ich suche. Das Prinzip ist sehr einfach, man sendet einfach ein UDP-Paket an den Brodcast des Netzwerks in dem der Rechner steht den man einschalten will und er geht von alleine an.

Das Paket muss folgendermaßen aufgebaut sein, 6x FF (HEX) und dann 16x die MAC-Adresse (auch HEX) der Netzwerkkarte vom Rechner den man einschalten will. In PHP macht man das ganz einfach mit folgender Funktion:

function wakeup($mac_addr$broadcast '192.168.178.255'

    
$mac_hex preg_replace('=[^a-f0-9]=i'''$mac_addr); 
    
$mac_bin pack('H12'$mac_hex); 
    
$data str_repeat("\xFF"6) . str_repeat($mac_bin16); 
    
$s socket_create(AF_INETSOCK_DGRAMSOL_UDP); 
    
$opt_ret socket_set_option($s16true); 
    
$e socket_sendto($s$datastrlen($data), 0$broadcast2050);
    
socket_close($s); 
    return 
true
}

Das ganze funktioniert ohne Probleme, ich kann die Server bei Bedarf über das Webinterface einschalten.

Damit WOL beim hochfahren für die Netzwerk Karte aktiviert wird muss man ethtool -s eth0 wol g ausführen. Dazu muss ethtool installiert sein. Um den Befehl automatisch bei jedem Start auszuführen kann man den Befehl in die /etc/rc.local eintragen.

apt-get install ethtool
nano /etc/rc.local

Und wieder stoppen

Jetzt kommt aber das Problem das ich die Server auch gerne über das Webinterface wieder ausschalten möchte. Sowas wie Shutdown on LAN gibt es leider nicht also musste mal wieder selber was gebaut werden. Ich muss also auf dem Server einen Port öffnen auf dem ein Script läuft das auf den Befehl zum runterfahren des Rechners wartet. Dazu habe ich mir ein kleines Perl Script geschrieben das genau das tut. Nebenbei habe ich mir noch eine Funktion eingebaut die mir die Uptime des Servers anzeigt damit ich im Webinterface sehe wie lange der Server schon läuft.

#!/usr/bin/perl -w
use English;
use strict;
use IO::Socket;

my $socket = new IO::Socket::INET (
    LocalPort => 8004,
    Listen    => 1,
    Proto     => 'tcp',
    Reuse     => 1
) || die "$!\n";

print "System-listener gestartet...\n\n";
while(  )
{
    my( $client, $client_addr ) = $socket->accept();
    $client->recv(my $response, 32);
    chomp $response;
    
    if ($response eq 'uptime')
    {
        my $uptime = `uptime`;
        $client->send("$uptime\n");
        print "Uptime: $uptime\n";
    }
    if ($response eq 'halt')
    {
        system("halt");
        $client->send("System going down\n");
        print "System going down\n";
    }
    close $client;

}
close $socket;

Das Script kommt auf alle Server und wird beim Systemstart automatisch mit gestartet. Für das Webinterface brauche ich jetzt nur noch eine kleine PHP Funktion die den Befehl zum runterfahren an den Server sendet.

function shutdown($ip$port 8004)
{
    if(
$fp fsockopen($ip$port$errno$errstr0.5))
    {
        
fwrite($fp"halt\n");
        
$buffer '';
        while (!
feof($fp)) 
        {
            
$buffer .= fgets($fp);
        }
        
fclose($fp); 
        return 
$buffer;
    }
}

Das ganze kann man jetzt natürlich noch mit einem Passwort absichern damit nicht jeder die Server runter fahren kann, bei mir zuhause im Netzwerk halte ich das allerdings nicht für nötig.


Ähnliche Beiträge


Kommentare


Kommentar schreiben

URLs werden automatisch umgewandelt.
[b]DEIN TEXT[/b] für Fett gedruckt
[quote]DEIN ZITAT[/quote] für Zitate
[code]DEIN CODE[/code] für Code
captcha