F.E.A.R. Dedicated Server auf Linux

Aus MySlug
Wechseln zu: Navigation, Suche

Der mittlerweile etwas betagte Gruselshooter F.E.A.R. aus dem Hause Sierra hat ein gutes Multiplayermodul, das sich auch heute nach ca. 3 Jahren nach Erscheinen der letzten Version 1.08 großer Beliebtheit erfreut. Zumal das Multiplayermodul F.E.A.R. Combat kostenlos downloadbar ist und somit der Multiplayer Part frei gespielt werden kann.

Die Installation auf einem Linux Server ist relativ einfach. Die Prozedur auf einem Debian Server (getestet auf meinem intel Atom 270 Server mit einem 64bit Debian 5 , Lenny) ist schnell erledigt.

Legt einen eigenen User für das Spiel an, da wir den dedicated Server nicht als root laufen lassen wollen. Falls Ihr noch einen anlegen müsst, dann macht das an der Konsole als root

adduser meinfear

Damit haben wir den User meinfear generiert und dieser hat sein Homeverzeichnis meinfear nun unter /home.

Jetzt benötigen wir ein paar Pakete, die wir wie folgt installieren können:

apt-get install libstdc++5 screen

Wenn Ihr ein 64bit System verwendet, dann muss ein Paket mehr rein:

apt-get install libstdc++5 ia32-libs screen

Nachdem die Pakete im System sind werden wir nun den FEAR Server installieren. Das machen wir als normaler User. Wenn Ihr noch root seid, dann wechselt nun die Userid mit einem:

su meinfear

und wechselt in sein Homeverzeichnis:

cd /home/meinfear

Nun können wir den Server herunterladen:

wget http://www.1337-server.net/fear/fear-linuxserver-1.08.tar.gz

Die Datei entpacken wir:

tar -zxvf fear-linuxserver-1.08.tar.gz

Nun haben befindet sich in Eurem Homeverzeichnis das neue Verzeichnis FEAR. Wir wechseln nun dort hin:

cd FEAR

und können auch schon den Server starten:

./start.sh

Wenn alles glatt läuft solltet Ihr diese Ausgabe sehen:

F.E.A.R. Dedicated Linux Server - Version FEAR v1.08
Copyright (c) 2005 Monolith Productions, Inc. All rights reserved.

Initializing...
Map Rotation:
   Asylum
   Cafeteria
   Campus
   Construction
   Docks
   Evac
   Factory
   HighTech
   Office
   Refinery
   Stockpile
   WaterWorks
Loading world: Worlds\ReleaseMultiplayer\Asylum
World loaded.
Ready.

ServerOptions

Der Server läuft nun auf dem Standardport 27888.
Wenn Ihr den Gamemode ändern wollt oder auch den Port, dann müsst Ihr das in der Datei /FEAR/ServerOptions/ServerOptions.txt erledigen.

Wichtig ist zunächst Folgendes in dieser Datei.

Sektion [ServerSettings]:

GameType=DeathMatch Legt den Gametype fest (siehe darunterliegende Sektionen)
ServerMessage= Eine Meldung, die der Server ausgibt beim Connecten
UsePassword=0 0=kein Passwort 1=Passwortgeschützt
Password=password Serverpasswort
AllowScmdCommands=0 Schaltet Adminkommandos ein
ScmdPassword=password Admin Passwort
Port=27888 Standardport
...
Dedicated=1 0=kein dedicated Server 1= Dedicated Server
...
AllowVoteKick=1 Diverse Votingsettings
AllowVoteTeamKick=1
AllowVoteBan=1
AllowVoteNextRound=1
AllowVoteNextMap=1
AllowVoteSelectMap=1
MinPlayersForVote=5
MinPlayersForTeamVote=3
VoteLifetime=30
VoteBanDuration=60
UsePunkBuster=0 Punkbuster ja oder nein. 0=nein 1=ja

Die darunterliegenden Sektions nehmen Einstellungen für die einzelnen Spielearten fest, welchen Ihr oben unter GameType festlegt. Ihr solltet auf alle Fälle im jeweiligen Spieletyp Euren Servernamen festlegen, damit dieser im Ingamebrowser später auch eindeutig gefunden werden kann. Den Namen legt Ihr beim Parameter

SessionName=

fest. Wie schon gesagt, den könnt Ihr für jede Spieleart anders nennen, da dieser in jeder einzelnen Sektion festgelegt werden kann.

Speicherzugriffsfehler

Beim Installieren auf meinen Server begrüßte mich der Server zunächst beim Start mit einem Speicherzugriffsfehler (Segmentation fault) und brach ab. Ich dachte zuerst an ein Problem mit der Architektur. Allerdings lag das in meinem Fall an der eingeschalteten Firewall. Wenn Ihr iptables am Laufen habt, dann müssen folgende Ports jeweils UDP und TCP freigeschaltet werden 27888 (je nachdem wie Ihr Euren Standardport setzt) und den Port 27900 damit Euer Server gelistet wird. Tragt diese Ports im IN und OUT Eures Scripts ein. Danach sollte der Server starten.

Screen

Wenn Ihr den Server an der Konsole via ssh oder ähnlich startet, dann startet zuerst screen und dann den Server:

su meinfear
cd /home/meinfear/FEAR
screen
./start.sh

Mehrere Server parallel

Wenn Ihr auf Euren Server mehrere Gamemodi beispielsweise laufen lassen wollt (der Slowmo Deathmatch ist recht schön), dann legt eine weitere ServerOptions Datei an:

su meinfear
cd /home/meinfear/FEAR/ServerOptions
cp ServerOptions.txt ServerOptions2.txt

Editiert nun die ServerOptions2.txt und legt einen neuen Standardport fest (z.B. 27889) und tragt den neuen gewünschten GameType ein. Speichert die Änderung.

cd /home/meinfear/FEAR
cp start.sh start2.sh

Damit haben wir eine zweite Startdatei angelegt. Editiert auch diese und ändert die Zeile

./fearserver.bin

in

./fearserver.bin -optionsfile ServerOptions2.txt

Nun startet screen und den ersten Server:

su meinfear
cd /home/meinfear/FEAR
screen
./start.sh

Die zweite Screensession machen wir mit einer Tastenkombination auf:

STRG+a c

Dort starten wir nun den Server:

./start2.sh

Kurzer Exkurs zu Screen

Screen verlassen, läuft im Hintergrund weiter: Konsole zumachen, oder an der Konsole STRG+a d

exit beendet eine Konsole, bei der letzten Konsole beendet sich screen

screen -R startet die laufenden Screensessions.

STRG+a leer Schaltet zwischen den einzelnen Screensessions um.

Checkupscript für zwei laufende Server

Die Idee bei folgendem Script ist, dass es über einen Crontab-Eintrag in kurzen regelmäßigen Abständen prüft, ob der F.E.A.R. Server läuft. Ist dies der Fall, dann überprüft das Script, ob der Server eventuell am Überlaufen ist. D.h. ist die CPU Last über einen speziell festgelegten Schwellenwert, dann werden die Prozesse gekillt und der Server neu gestartet. Ich habe das einwenig ausgebaut, und hierbei zwei parallel laufende F.E.A.R. Server in die Überwachung genommen. Da das Skript E-Mails versendet muss ein MTA wie der Exim4 konfiguriert sein.

Vorbereitung für zwei Server:

Die zwei Server werden über ein eigenes Startskript aufgerufen. Zudem kopieren wir die Server Binary auf einen eienen Namen, damit der Prozess später anhand seines Namens gefunden und zur Not beendet werden kann.

Ich gehe davon aus, dass der User, meinfear heißt. Sein Verzeichnis liegt unter /home/meinfear. Das Fear Verzeichnis lautet FEAR. Das Script müsst Ihr dann entsprechend an Eure Gegebenheiten anpassen.

Die Startdatei kopieren wir wie folgt:

cp start.sh start2.sh

Die Binary:

cp fearserver.bin fearserver2.bin

In der Startdatei (start.sh und start2.sh) ändert den Inhalt etwas ab. Zum einen muss in Euer Homeverzeichnis gewechselt werden:

cd /home/meinfear/FEAR

Danach noch hinter den ./fearserver.bin die Ergänzung -optionsfile mit dem ABSOLUTEN Pfad zu Eurer Serverkonfigurationsdatei. Z.B.:

./fearserver.bin -optionsfile /home/meinfear/FEAR/ServerOptions/ServerOptions.txt

Speichert die Änderungen entsprechend ab. Dann legt im Verzeichnis /usr/local/bin die Datei wie folgt an:

feartest

#!/bin/sh

# F.E.A.R. Dedicated Checkup Script by Pierre "Gargi" Kretschmer

top -b -n 1 | grep fearserver.bin
server1=$?
top -b -n 1 | grep fearserver2.bin
server2=$?
if [ \( $server1 = 1 \) -o \( $server2 = 1 \) ]; then
     pkill -u meinfear
     killall -s7 fearserver.bin
     killall -s7 fearserver2.bin
     su meinfear -c 'screen -S server1 -d -m /home/meinfear/FEAR/start.sh'
     su meinfear -c 'screen -S server2 -d -m /home/meinfear/FEAR/start2.sh'
     rm /var/log/fearcheck.log
     echo "No active F.E.A.R. Server found. Starting new Killerspiele sessions!" > /var/log/fearcheck.log
     mail -a "Content-Type: text/plain; charset=UTF-8" -s "[System] F.E.A.R. Server start"   //ZEILENUMBRUCH
          meine @ emailadresse.de < /var/log/fearcheck.log 
     exit 1

     else

        fear1load=$(top -b -n 1 | grep fearserver.bin | cut -d " " -f20)
        fear2load=$(top -b -n 1 | grep fearserver2.bin | cut -d " " -f20)

     if [ $fear1load -gt 30 ]; then
        pkill -u meinfear
        killall -s7 fearserver.bin
        killall -s7 fearserver2.bin
        su meinfear -c 'screen -S server1 -d -m /home/fear/meinFEAR/start.sh'
        su meinfear -c 'screen -S server2 -d -m /home/meinfear/FEAR/start2.sh'
        rm /var/log/fearcheck.log
        echo "Fear Server had to be restarted because of too high CPU load" > /var/log/fearcheck.log
        mail -a "Content-Type: text/plain; charset=UTF-8" -s "[System] F.E.A.R. Server restart"   //ZEILENUMBRUCH
            meine @ emailadresse.de < /var/log/fearcheck.log
        exit 1

     elif [ $fear2load -gt 30 ]; then
        pkill -u meinfear
        killall -s7 fearserver.bin
        killall -s7 fearserver2.bin
        su meinfear -c 'screen -S server1 -d -m /home/meinfear/FEAR/start.sh'
        su meinfear -c 'screen -S server2 -d -m /home/meinfear/FEAR/start2.sh'
        rm /var/log/fearcheck.log
        echo "Fear Server had to be restarted because of too high CPU load" > /var/log/fearcheck.log
        mail -a "Content-Type: text/plain; charset=UTF-8" -s "[System] F.E.A.R. Server restart" //ZEILENUMBRUCH
               meine @ emailadresse.de < /var/log/fearcheck.log
        exit 1

     else
        rm /var/log/fearcheck.log
        echo "server load ok" > /var/log/fearcheck.log
     fi
fi

(Bitte beachtet, dass bei dem Hinweis //ZEILENUMBRUCH im Skript, die markierten Zeilen in eine Zeile geschrieben werden müssen, sonst ist das Skript nicht funktionsfähig!)

Zu Beginn prüft das Script also, ob beide Server aktiv sind. Sind es diese nicht, oder fehlt einer der beiden Server, dann werden alle Prozesse aus dem Bereich "gekillt" und der Server neu gestartet. Fehlt wieder ein Server, wird dies beim nächsten Test wieder ausgelöst, bis alle beiden Server aktiv sind. Sind beide Server vorhanden, dann wird getestet, ob die Auslastung der einzelnen Server über 30% liegt. Sollte das der Fall sein, werden auch hier alle Prozesse getötet und die beiden Server neu gestartet. Auch hier gibt es dann eine E-Mail als Benachrichtigung. Sollte der Load unter 30 % liegen, dann passiert gar nichts und der Check kommt dann zum nächsten Lauf wieder. Man kann dieses Script dann über die Crontab (crontab -e) beispielsweise alle 2 Minuten aufrufen:

*/2 *   * * *    /usr/local/bin/feartest > /dev/null

Vergesst nicht, das Skript ausführbar zu machen:

chmod +x /bin/feartest

Das Skript startet zwei eigene Screen Sessions für den gleichen User. Um die Screensession aufzurufen, macht das als eingeloggter User mit einem

screen -r server1

oder

screen -r server2

Ihr könnt dann auch im Script die Bezeichnung der Sessions individuell ändern. Dies findet über dem screen Parameter -S statt.

Den Schwellenwert von den voreingestellten 30 % könnt Ihr wenn Ihr wollt auch individuell ändern. Diesen findet Ihr im if Bereich hinter dem Prüfwert -gt. Wenn ein Server generell höhere Last hat, dann kann man die auch mit entsprechend unterschiedlichen Werten versehen.