====== 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 =====
*unächst wird ganz normal die Jail installiert und nach außen abgesichert.
*s wird ein User mit **adduser** hinzugefügt unter dessen Rechte und Home-Verzeichnis der Server später laufen soll (in den hier verwendeten Beispielen und Scripten heißt der User **minecrafter**.
*s wird java/openjdk6 installiert
*s wird lang/perl5.14 installiert
*s wird das Serverfile von Minecraft geladen.
*s wird sysutils/tmux installiert
===== 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.