Inhaltsverzeichnis

Allgemein

Im Weiteren soll erläutert werden wie ein Server für das Spiel Minecraft in einer Jail zum Laufen zu bewegen ist. Hinzu kommen ein paar Spielereien wie automatisches Starten des Servers mit Start der Jail und automatische Backups der Welt.

- Mittlerweile gibt es einen Port für den Minecraft-Server in der Portsammlung (games/minecraft-server). Dieser macht einen Großteil der hiesigen Dokumentation überflüssig. Der Vollständigkeit halber bleibt diese Seite jedoch unverändert. Der Port misst noch einige Features (z.B. die Backup-Funktion). -

TODO: Hier wird noch gearbeitet… Die Texte sind noch nicht fertig und die Scripte bedürfen noch einiger Überarbeitung!

Installation

Jail

Scripte hinzufügen

Folgende Scripte werden angelegt und ausführbar gemacht. Im Weiteren wird davon ausgegangen, dass die Scripte unter /usr/home/minecrafter/bin abgelegt sind:

mstart

#!/bin/sh
cd /usr/home/minecrafter
/usr/local/bin/tmux new-session -d -s minecraft "java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui"

mstop

#!/usr/bin/perl

# BINARIES
$tmux   = "/usr/local/bin/tmux";
$bin    = "/usr/home/minecrafter/bin";
$mcom   = $bin."/mcom -s";

$sessionname = "minecraft";

$sekunden = 5;

sub comline{
    system "$mcom $_[0]";
}


sub laeuft{
        my $laeuft;
        $laeuft = 0;
        @screens = `$tmux ls`;

        foreach (@screens){
                if ($_ =~ /^s*$sessionname/){
                        $laeuft = 1;
                }
        }
        return $laeuft;
}


if (&laeuft){
        &comline("say Server wird gestoppt!! in $sekunden Sekunden");
        for ($i=$sekunden;$i > 0; $i--){
                sleep 1;
                &comline("say Aus in $i Sekunden...");
        }
        &comline("say Server wird gestoppt.");
        &comline("stop");
        while (&laeuft){
                sleep 1;
        };

}
else{
        die "Minecraft-Server nicht gestartet.";
}

mcom

#!/usr/bin/perl

$serverpfad     = "/usr/home/minecrafter";
$tmux           = "/usr/local/bin/tmux";
$log            = $serverpfad."/server.log";
$templog        = $serverpfad."/server-tempcom.log";

$sessionname    = "minecraft";
$panename       = $sessionname.":0.0";
$silentkey      = "-s";

sub com{
    system "$tmux send -t $panename $_[0] \\"Enter\\"";
}

if ($ARGV[0] =~ /$silentkey/){
        $silent = 1;
        $j=1;
}
else{
        $j=0;
}

$command = "\\"";
for ($i=$j;$i<=$#ARGV;$i++){
    $command = $command.$ARGV[$i]." ";
}
$command = $command."\\"";

unless ($silent){
        system "cp $log $templog";
}
&com ($command);
unless ($silent){
        sleep 1;
        @diff = `diff $log $templog`;
        shift @diff;
        foreach (@diff){
                print "$_";
        }

        unlink $templog;
}

mbackup

#!/usr/bin/perl

# PROGRAMME

$tar            = "/usr/bin/tar";
$bin            = "/usr/home/minecrafter/bin";
$mcom           = $bin."/mcom -s";


# PFADE

$serverpfad     = "/usr/home/minecrafter";
$weltname       = "world";
$backupname     = "backup-ordner";
$log            = $serverpfad."/server.log";
$templog        = $serverpfad."/server-tempback.log";

# TWEAKS

$loeschinterval = 5;

$weltordner     = $serverpfad."/".$weltname;
$backupordner   = $serverpfad."/".$backupname;

# Zeit aufbereiten
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = $year +1900;
$mon = $mon + 1;
$datum = sprintf("%04d_%02d_%02d-%02d%02d", $year, $mon, $mday, $hour, $min);

sub world_kopieren{
        unless (-d $backupordner){
                mkdir $backupordner or die "Konnte Verzichnis nicht anlegen";
        }
        system "$tar -czvf $backupordner"."/"."$weltname-$datum.tar.gz $weltordner";
}

sub alte_backups_loeschen{
        @filelist = <$backupordner/*>;
        foreach (@filelist){
                if (-M $_ > $loeschinterval){
                        unlink $_;
                }
        }
}

sub wait_for {
        $key = $_[0];
        while (not defined $fertig){
                system "cp $log $templog";
                while (not defined $fertig) {
                        sleep 1;
                        @diff = `diff $log $templog`;
                        foreach (@diff){
                                if ($_ =~ /$key/){
                                        $fertig = 1;
                                }
                        }
                }
                unlink $templog;
        }
        undef $fertig;
        print "$key erreicht\
";
}

sub comline{
    system "$mcom $_[0]";
}

&comline ("say Serverbackup startet...");
&comline ("say Server wird in Read-Only-Modus versetzt");
&comline ("save-off");
&wait_for("CONSOLE: Disabling level saving.");
&comline ("save-all");
&wait_for("CONSOLE: Save complete.");
&world_kopieren;
&comline ("say Server nimmt wieder Read-Write-Betrieb auf");
&comline ("save-on");
&wait_for ("CONSOLE: Enabling level saving..");
&comline ("say Backup abgeschlossen");
&alte_backups_loeschen;

mspy

#!/bin/sh
tail -n 25 /usr/home/minecrafter/server.log

Automatisches Starten

Damit der Minecraft-Server mit Starten der Jail mit gestartet wird, wird die Datei /etc/rc.local innerhalb der Jail angelegt und wie folgt gefüllt (angenommen der User heißt minecrafter):

/usr/bin/su -l minecrafter -c '/usr/home/minecrafter/bin/mstart'

Automatisches Stoppen

Damit der Minecraft-Server mit Beenden der Jail sauber gestoppt wird, wird die Datei /etc/rc.shutdown.local innerhalb der Jail angelegt und wie folgt gefüllt (angenommen der User heißt minecrafter):

/usr/bin/su -l minecrafter -c '/usr/home/minecrafter/bin/mstop'

automatische Backups

Als User minecrafter wird die Datei crontab mit folgendem Inhalt angelegt:

crontab

# crontab - minecrafter's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#
#minute hour    mday    month   wday    command
#
0\t*\t*\t*\t*\t/home/minecrafter/bin/mcom "say wieder ne Stunde rum..."  > /dev/null 2>&1
10\t*/4\t*\t*\t*\t/home/minecrafter/bin/mbackup  > /dev/null 2>&1

Die crontab ist so ausgelegt, dass alle Stunde ein Hinweis angegeben und alle vier Stunden ein Backup durchgeführt wird.

Anschließend wird die crontab-Datei aktiviert. Hierzu wird als Benutzer minecrafter der Befehl

% crontab crontab

ausgeführt. (Dabei ist das zweite „crontab“ die soeben angelegte Datei).

Durch die Eingabe von

% crontab -l

wird die neuerlich geschriebene crontab angezeigt.