Skip to content
21

Counter-Strike Source und TF 2 Linux Server

Dieses Tutorial beschreibt, wie man einen Counter-Strike: Source und Team Fortress 2 Server unter Linux installiert, zum laufen bringt, und im Betrieb hält. Das Counter-Strike: Source Orangebox Update vom 14.10.2011 wurde beim erstellen des Howtos berücksichtigt.

Portforwarding

Wenn der Rechner zu Hause und, oder hinter einer Firewall steht müssen folgende Ports geforwarded werden:

  • UDP 27000 bis 27015 (Game client traffic)
  • UDP 27015 bis 27030 (Normalerweise Matchmaking und STV)
  • TCP 27014 bis 27050 (Steam Downloads)
  • UDP 4380
  • TCP 27015 (SRCDS Rcon Port)


System vorbereiten

Als erstes sollte der Server auf den neuesten Stand gebracht werden.
Bei Debian macht man dies mit:

apt-get update && apt-get upgrade

Damit der Server weiterläuft, auch wenn du dich ausloggst, benötigst du das Programm Screen. Installiere es also mit dem user root.
Der Debian Befehl:

apt-get install screen

Wenn du über eine 64bit System verfügst, dann benötigst du noch die Systemlibs für 32bit, damit du den Counter-Strike Source Server starten kannst.
Für Debian geht dies mit:

apt-get install ia32-libs


Installation des Servers

Am besten legt ihr einen eigenen User für den Server an. Dies macht ihr indem ihr als root

adduser euerneuerusername

eingebt und im folgenden Dialog ein Password für den User eingebt. Es ist eine extrem schlechte Idee Programme mit dem user Root auszuführen. Also verwerft den Gedanken gleich wieder.
Mit dem neuen User logt ihr euch nun ein und erstellt erst einmal das zukünftige Serververzeichnis. Der Name ist egal ich benutze css für Counter-Strike: Source und tf für Team Fortress 2:

mkdir css
mkdir tf

Nun in das erstellte Verzeichnis wechseln, das Steamupdatetool herunterladen und ausführbar machen:

cd css
wget http://storefront.steampowered.com/download/hldsupdatetool.bin
chmod +x hldsupdatetool.bin

Als nächstes das Tool starten und den Lizensbedingungen zustimmen:

./hldsupdatetool.bin

Es wird die Datei „steam“ erstellt, die wir für das Downloaden und Updaten des Servers benötigen. Mit ihr installieren wir jetzt den Counter-Strike Source bzw. Team Fortress 2 Server (Dies ist der selbe Befehl mit dem ihr Updates installiert) :

./steam -command update -game "Counter-Strike Source" -dir . -verify_all -retry

bzw.:

./steam -command update -game tf -dir . -verify_all -retry

Je nachdem wie schnell eure Anbindung ist kann es jetzt etwas dauern. In manchen Fällen wird erst der Updater geupdatet. Dann müsst ihr diesen Befehl so oft ausführen, bis ihr die Nachricht „the server is running in the latest version“ erhaltet.

Den Server starten und konfigurieren

Um zu testen. Ob der Server funktioniert, starten wir den Server mit folgenden Parametern aus dem /css/css bzw. /tf/orangebox Verzeichnis:

./srcds_run

Nun wird der Server gestartet. Beenden kannst du den Server, indem du ctrl+c in der Konsole drückst.


Starscript mit screen

Mit dem neuen User erstellst du nun folgendes Startscript, indem du mit dem Editor deiner Wahl (Ich nutze nano) die neue Datei öffnest, das Script einfügst, anpasst und den Editor schließt ( bei nano ctrl+x) und dabei speicherst.

nano css.sh

Alternativ kannst du es hier Downloaden

Hier das Script:

#!/bin/bash 

############################################################################
#                                                                          #
#  Counter-Strike Source  and TF 2 (HL2) Server Script                     #
#                                                                          #
#  Author:                                                                 #
#  Ulrich Block                                                            #
#                                                                          #
#  Kontakt:                                                                #
#  ulblock at gmx.de                                                       #
#  www.ulrich-block.de                                                     #
#                                                                          #
#  This program is free software: you can redistribute it and/or modify    #
#  it under the terms of the GNU General Public License as published by    #
#  the Free Software Foundation, either version 3 of the License, or       #
#  (at your option) any later version.                                     #
#                                                                          #
#  This program is distributed in the hope that it will be useful,         #
#  but WITHOUT ANY WARRANTY; without even the implied warranty of          #
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           #
#  GNU General Public License for more details.                            #
#                                                                          #
#  You should have received a copy of the GNU General Public License       #
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.   #
#                                                                          #
#  Gebrauch: ./css.sh {start|stop|restart|update|console|check}            #
#                                                                          #
#  start/restart/stop: Server An und aus schalten                          #
#                                                                          #
#  update: Mit dem Steam Updatetool den Server aktualisieren               #
#                                                                          #
#  console: Wechselt auf die Counter-Strike Serverkonsole                  #
#           Mit strg+a -> d die Konsole wieder in den Hintergrund schicken #
#                                                                          #
############################################################################

function init {

DEAMON="srcds_run"
IP="HierDeineIpEintragen"
PORT="HierDenGewuenschtenPortEintragen"
# CSS
DIR="/home/hierdenusernameneeingeben/css/css"
PARAMS="-game cstrike -ip $IP -port $PORT"
PARAMS2="+maxplayers 12 +map de_dust2 +fps_max 66.7"
# TF2
DIR="/home/hierdenusernameneeingeben/tf/orangebox"
#PARAMS="-game tf -ip $IP -port $PORT"
#PARAMS2="+maxplayers 12 +map arena_badlands +fps_max 66.7"
SCREENNAME="meinserver"

if [ "`whoami`" = "root" ]; then
 echo "Verantwortungsvolle Admins starten Gameserver nicht mit root! Allen anderen ist es untersagt!"
 exit 0
fi
if [ -z "$DIR" ]; then
 echo "Es wurde nichts bei der Variable DIR angegeben."
 exit 0
fi
if [ -z "$DEAMON" ]; then
 echo "Es wurde nichts bei der Variable DEAMON angegeben."
 exit 0
fi
if [ -z "$PARAMS" ]; then
 echo "Es wurde nichts bei der Variable PARAMS angegeben."
 exit 0
fi
if [ -z "$PARAMS2" ]; then
 echo "Es wurde nichts bei der Variable PARAMS2 angegeben."
 exit 0
fi
if [ -z "$SCREENNAME" ]; then
 echo "Es wurde nichts bei der Variable SCREENNAME angegeben."
 exit 0
fi
if [ -z "$IP" ]; then
 echo "Es wurde nichts bei der Variable IP angegeben."
 exit 0
fi
if [ -z "$PORT" ]; then
 echo "Es wurde nichts bei der Variable PORT angegeben."
 exit 0
fi
}

function start_server {
 if [[ `screen -ls | grep $SCREENNAME` ]]; then
 echo "Der Server läuft bereits unter dem Screentab $SCREENNAME"
 else
 echo "Starte $SCREENNAME"
 if [ -d $DIR ]; then
 cd $DIR
 screen -d -m -S $SCREENNAME ./$DEAMON $PARAMS $PARAMS2
 else
 echo "Das Serververzeichnis wurde nicht angegeben"
 fi
 fi
} 

function stop_server {
 if [[ `screen -ls | grep $SCREENNAME` ]]; then
 echo -n "Stoppe $SCREENNAME"
 kill `screen -ls | grep $SCREENNAME | awk -F . '{print $1}'| awk '{print $1}'`
 echo " ... done."
 else
 echo "Konnte den Screentab $SCREENNAME nicht finden"
 fi
}

function update_server {
 stop_server
 echo "Update"
 cd $DIR
 cd ..
 ./steam -command update -game "Counter-Strike Source" -dir . -verify_all
 echo " ... done."
 start_server
}

function wrong_input {
 echo "Usage: $0 {start|stop|restart|update|console|check}"
 exit 1
}

function get_screen {
 screen -r $SCREENNAME
}

function check_ping {
 if [ "`/usr/bin/quakestat -a2s $IP:$PORT | grep -v ADDRESS | awk '{ print $2 }' | awk -F/ ' { print $1}'`" = "DOWN" ]; then
 sleep 10
 if [ "`/usr/bin/quakestat -a2s $IP:$PORT | grep -v ADDRESS | awk '{ print $2 }' | awk -F/ ' { print $1}'`" = "DOWN" ]; then
 stop_server
 start_server
 fi
 fi
}

init

case "$1" in
 start)
 start_server
 ;;

 stop)
 stop_server
 ;;

 restart)
 stop_server
 start_server
 ;;

 update)
 update_server
 ;;

 console)
 get_screen
 ;;

 check)
 check_ping
 ;; 

 *)
 wrong_input
 ;;
esac
exit 0

Mit diesem Script kannst du den Server einfach mittels

./css.sh start

starten. Um in zu stoppen oder neu zu starten start durch stop bzw restart ersetzen.
Um in der Linux Konsole auf die Server Konsole zu kommen gibst du folgendes ein. Um den Server wieder in den Hintergrund zu schicken drückt man dann „ctrl+a“ und dann „d“

./css.sh console


Automatisches Updaten

Den Server kannst du manuell mit dem selben Befehl updaten, mit dem du ihn auch installiert hast. Also folgendes im Serververzeichnis eingeben:

./steam -command update -game "Counter-Strike Source" -dir . -verify_all -retry

In meinem Startscript habe ich die Parameter “-autoupdate -retry -verify_all” reingeschrieben. Dadurch updated sich der Server in der Regel von selber im betrieb, so dass ihr nichts machen müsst.

Wenn das einmal nicht funktionieren sollte, kann man es entweder manuell machen, oder die Funktion “update “des Scriptes nutzen:

./css.sh update

Man kann jetzt mit cron immer um 5:15 Uhr morgens automatisch auf Updates überprüfen und den Server neu starten. Dafür musst du einen neuen crontab anlegen und das Script eintragen:

crontab -e

Diese Zeile einfügen:

15 05 * * * cd /home/euerneueruser && ./css.sh update >/dev/null 2>&1

Um 5:15 Uhr morgens wird nun der Server geupdatet und anschließend neu gestartet


Server Einstellungen

Nun müsst ihr noch den Server mit der server.cfg einstellen. Eine umfangreiche gut erklärte könnt ihr bei meinem Config Generator erstellen.

Wenn es jetzt auch noch Say Sounds, Quakesounds, Stats usw sein müssen, dann schaut euch diesen Artikel von mir an. Hier biete ich fertige Downloads dafür an.

21 Comments Post a comment
  1. Feb 20 2012

    DANKE! Super, nur mit dieser Anleitung habe ich es auch geschafft! :)

    Antworten
  2. TheFroggy
    Dez 15 2011

    Habe die CSS Anleitung befolgt, wenn ich nun ./srcds_run ausführe, kommt der contdown und dann:

    ERROR: Invalid game type ‘tf’ sepecified.econdss
    Do 15. Dez 01:22:45 CET 2011: Server Failed

    Weis jemand rat? Ich habe nur die für CSS erforderlichen schritte durchgeführt.

    Axo: danke für die Klasse Anleitung.

    Antworten
    • TheFroggy
      Dez 15 2011

      habe noch einmal von vorne begonnen und jetzt geht alles :)

      Antworten
  3. Dennis
    Aug 8 2011

    Hallo Ulrich,

    ist ein Super Script, geht wie geschmiert Danke :)

    kleiner frage noch, wo muss ich diesen Befehl einbauen?

    RDTSC_FREQUENCY=disabled?

    Antworten
  4. Yoshi126
    Jul 23 2011

    WIe kann ich in meiner start.sh den befehl das er um 4 uhr morgens starten ohne das ohne cron ,config etc ist das möglich wen ja wie ?

    Antworten
    • Ulrich Block
      Jul 23 2011

      Informiere dich bitte, was Cron ist und wofür es eingesetzt wird. Dann erübrigt sich deine Frage.

      Antworten
  5. Jul 12 2011

    wie stellt man das genau ein das er automatisch neustartet ab einer gewissen uhrzeit?

    wäre schön wenn mir das einer punkt für punkt erklärt

    danke nochmal

    Antworten
    • Ulrich Block
      Jul 12 2011

      Gib man in deine Console folgendes ein:
      man cron

      Im Regelfall sollte das Handbuch zum Scheduler Cron erscheinen.

      Antworten
  6. ben
    Apr 27 2011

    wenn du in die 2. und 3. zeile von deinem script das hier schreibst

    wget -q -O – http://checkip.dyndns.org | grep Address | awk ‘{print $6}’ | cut -d ” internet-ip.txt

    exip=`cat internet-ip.txt`

    hast du in der variable “exip” automatisch die aktuelle ip drin

    unten nach der verarbeitung kannst du mit

    rm internet-ip.txt

    die datei wo die ip drin steht wieder löschen lassen

    dann nurnoch :

    IP=”"
    durch

    IP=exip

    in deinem script ersetzen und der nimmt automatisch die ip die in der internet-ip.txt steht bei einem server mit nur einer ip meist die fürs internet *G

    ansonsten gehe ich bei mehrip systemen davon aus das es dev0 ist

    Antworten
  7. TIM
    Mrz 13 2011

    Hey Ulrich,

    ich finde dein Script super, nur habe ich mal 2 Fragen an dich.
    Ich möchte das Script für einen Lan Server starten.
    Mit sv_lan 1 muss die IP weg gelassen werden das der Server in der LAN Liste gefunden wird.
    Da meckert natürlich das Script das beim Starten das die IP fehlt.
    2. möchte ich ich mal den unterschied von fps_max 66 zu 1000 und 2000 testen.
    wenn ich bei deinem Script im Feld:
    DEAMON=”srcds_run”
    -> dies einfüge
    LD_PRELOAD=/path/to/libBEpingboost.so.1.0.1 FPS=4000 ./srcds_run
    geht es nicht, kannst du mir hier weiter helfen?

    P.S Super Seite.

    Antworten
    • Ulrich Block
      Mrz 13 2011

      1.
      Warum sollte das nicht gehen, die LAN IP anzugeben?

      2.
      Zu dem unnötigen FPS Schwachsinn, werde ich keinerlei Unterstützung geben.

      Antworten
      • TIM
        Mrz 13 2011

        weil der server dann in hlsw und steam server liste nicht gefunden wird !

      • Tim
        Mrz 15 2011

        Kannst du mir hier nun helfen?
        Wäre schade, sonst muss ich mich nach einem anderen Script umschauen und ich finde deins echt sehr gut.

      • Ulrich Block
        Mrz 15 2011

        Beide Sachen haben nichts mit dem Skript zu tun, sondern mit dem Server selber.

        Bei FPS gebe ich keine Unterstützung, da ich nie weiß, ob es dazu ausgenutzt wird, Kunden zu betrügen.

        Der Rest ist Problem deines Startbefehls, den du überarbeiten musst. Was genau, weiß ich nicht aus dem Kopf

    • Mrz 24 2011

      Nimm als IP Adresse 0.0.0.0 im LAN, dann wird er wieder gefunden und auch RCON Funktioniert.

      Antworten
  8. Yss
    Feb 15 2011

    Gutes Tut,
    habe jetzt mal diese css.sh auf meinen Server angepasst, alledings bin ich mir unsicher, was ich unter Screenname angeben muss.
    Wenn ich das ganze Teste kommt folgendes raus:
    grep: War-Server: No such file or directory
    grep: [GER]: No such file or directory
    Starte Bllodfighters War-Server [GER]

    Aber wenn ich das mit restart mache, dann startet der Server nicht neu… Was mache ich falsch?

    Antworten
    • Ulrich Block
      Feb 15 2011

      Grundkenntnisse über Linux wären nicht verkehrt. Linux ist casesensitve. Ebenso Sollte man auf Leerstellen und Sonderzeichen verzichten.

      Wenn du einfach nehmen würdes, was schon vorgegeben ist, würde es auch klappen.

      Antworten
      • Yss
        Feb 15 2011

        So, habe jetzt mit “screen -list” mir den tab rausgesucht, er heißt “counterstrike”, dieser ist nun auch in der sh.Datei drin, die Konsole zeigt nun auch keinen Fehler mehr an:
        Stoppe counterstrike…done
        Starte counterstrike
        $
        Aber der Server ist nicht wirklich neugestartet, da die server.cfg nicht angewendet wurde.

      • Ulrich Block
        Feb 17 2011

        Am besten einmal alle verkorksten restlichen Screentabs abschießen. Dann den Server neu starten.

      • Mrz 6 2011

        Anzumerken wäre in deinem Fall auch, dass die “sogenannte” Screen-Session nur ein Name ist, um das Aufrufen der Session zu erleichtern. Es möchte keiner immer eine neu generierte Nummer neu raussuchen und merken ;)
        Wenn die Session aber einen Namen hat, ist es ja leichter diese wieder in den Vordergrund zu holen.
        Wie Ulrich schon sagte, am besten bisschen Linux-Kenntnisse einsammeln.
        Als kleine Ergänzung wäre vllt noch zu sagen, dass dieses Tutorial natürlich für debianbasierte Linux Derivate gilt ;) Nicht das nacher noch einer nach CentOS fragt, wie bei deinem Gaming Kerneln.

        Finde es echt Klasse, dass du unwissenden hilfesuchenden Leuten derartige Hilfestellungen anbietest. Bin auch bisschen dabei, meinen Blog hoch zu ziehen.

      • Ulrich Block
        Mrz 6 2011

        Zu dem Debian Teil: Ich sage am Anfang, dass man sein System updaten sollte, dass man screen braucht und 32bit Unterstützung, wenn man ein 64bit System hat. Dazu sage ich ausdrücklich, wie man es unter Debian macht. Jeder mit gesundem Menschenverstand sollte verstehen, dass bei anderen Distros andere Befehle verwendet werden müssen.
        Der Rest des Tutorials sollte ja auf jeglichen Linux Distros laufen.

Share your thoughts, post a comment.

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments