Skip to content

Windows-Spieleserver unter Linux betreiben

serverscreenHasst du es auch, einen Extra-Computer mit Windows hochfahren oder anmieten zu müssen, nur um den Server eines alten Spieles nutzen zu können? Oder möchtest du einen Server für ein Spiel hosten, aber es gibt keine Linuxanwendung dafür? Dann bist du hier genau richtig. In diesem Blogeintrag werde ich dir zeigen, wie ich die Serveranwendung eines meiner Lieblings-Spiele (Tron 2.0 Killer-App) unter Linux betreibe. Alles auf einer Kiste, die keine grafische Oberfläche hat und mit einem eigens eingerichteten Benutzer in dessen eigener Umgebung, sodass die Sicherheitslücken des Spiels nicht dazu genutzt werden können sollten, um Zugriff auf deine Maschine zu erlangen. Ich habe außerdem ein Notfallskript eingebaut, welches den Spieleserver neu startet, falls dieser abstürzen sollte.

Du musst dir zunächst Tron 2.0, den inoffiziellen Patch 1.042 und danach Killer App auf deiner Windows-Maschine installieren, damit du später einige Dateien von dort aus kopieren kannst. Los geht’s:

Zuerst melden wir uns via ssh (als Root-Benutzer) an unserer Maschine an und erstellen einen neuen Benutzer namens gameserver. Dieser wird für den TRON-Server später genutzt:

useradd --home-dir /home/gameserver --password swordfish 
--shell /bin/false gameserver

Jetzt haben wir einen neuen Benutzer angelegt, der keinen Zugriff auf die Kommandozeile hat. Niemand kann sich mit diesem Nutzer an unserer Box anmelden und dessen Heimatverzeichnis ist /home/gameserver. Super. Weiter geht es, der nächste Schritt ist die Installation der Software, damit wir den TRON-Server überhaupt starten können:

apt-get install wine xvfb

Wine wird benötigt, um eine Windows-Umgebung zu simulieren, xvfb wird später einen virtuellen Bildschirm erzeugen, damit wir den Server auch ohne einen solchen starten können.

Erstelle jetzt das neue Verzeichnis /home/gameserver/tron mit

mkdir /home/gameserver/tron

und kopiere dort die folgenden Dateien hinein:

Directories and all subfiles in them:
Custom
LightCycleGameData
Profiles
ServerData
tcdg
Files:
Engine.rez
Game.rez
Game2.rez
mfc42.dll
mpger.ls0 (If you have it)
SndDrv.dll
Sound.rez
TRONSrv.exe
autoexec.cfg
bl.dat
gamep5.rez
gamep6.rez
launchcmds.txt
layout.bin
ltmsg.dll
msvcirt.dll
server.dll

Beachte, dass sich im ServerData-Ordner eine Config-Datei befinden muss. Und nur EINE CONFIG. Also solltest du das Programm mindestens ein einziges Mal auf deiner Windows-Box starten um alle Einstellungen im Multiplayer-Assistenten vornehmen zu können. Danach hast du eine vorgefertigte Konfigurationsdatei, die du auf deinen Linuxserver kopieren kannst.

Zudem benötigt dieses Spiel eine msvcirt.dll (Stand: Wine 1.1). Besorge dir diese irgendwo im Internet oder kopiere sie von deiner Windows-Box aus in den tron-Ordner.

Das war’s – die TRON-Dateien sind jetzt auf deinem Server und der Benutzer wurde auch angelegt. Aber damit das Programm überhaupt richtig startet, benötigt es noch einige Registrierungseinträge in der simulierten Windows-Umgebung. Anderenfalls stürzt die TRONSrv.exe mit einem „Could not load resource file“-Fehler ab.

Um den Fake-Windows-Ordner zu erstellen, gib

sudo -s -u gameserver
xvfb-run -a winecfg

in der Konsole ein. Das Programm erstellt einen /home/gameserver/.wine-Ordner mit allen Einstellungen. In diesem Ordner befindet sich auch die Windows-Registrierung.

Drücke STRG+C um das Programm zu beenden (es ist ohne Bildschirm nicht nutzbar) und gib Folgendes ein

exit

um zum vorherigen Nutzer zurückzukehren.

Jetzt geht es weiter mit folgendem Kommando:

mcedit /home/gameserver/.wine/system.reg

Ein Editor sollte sich öffnen. Falls dies nicht passiert, installiere diesen mit apt-get install mc.

Direct nach der Zeile

[SoftwareMicrosoftWindows NTCurrentVersionSvcHost] 1338803243
"netsvcs"=str(7):"BITS"

fügst du Folgendes ein:

[SoftwareMonolith ProductionsNo One Lives Forever1.0] 1339584011
[SoftwareMonolith ProductionsTRON 2.01.0] 1339521803
"CDKey"="YOUR-CDKE-YGOE-SHER-E000"
"Commands"="-windowtitle "TRON 2.0: Killer App Mod""
"InstallDir"="Z:tron"
"KAModFOV"="106"
"KAModResolution"="1360x768"
"KAModTemp"="Z:tronCustomModsRetailKAModTempWORLDSRETAILSINGLEPLAYER"
"Language"="German"
"Last Random"=dword:00000000
"Num Launcher Runs"=dword:00000004
"OptionsWarning"=dword:00000001
"ProfileName"="Player"
"Save Commands"=dword:00000001
"SelectedMod"="Retail"
"UpdateCommandLine0"="-rez gamep5.rez"
"UpdateCommandLine1"="-rez gamep6.rez"
"UpdateCommandLine4"="-rez "Z:trontcdggame""
"UpdateNum"=dword:00000005

Vergiss‘ bitte nicht, einen korrekten CD-Key einzugeben. Meinen bekommst du nicht :)

Da wir angegeben haben, die TRONSrv vom Z:-Laufwerk zu starten, müssen wir wine noch mitteilen, welcher Ordner denn überhaupt das Z:-Laufwerk sein soll. In unserem Fall ist dies /home/gameserver.

Also erstellen wir mit dem folgenden Befehl einen Symlink:

mkdir /home/gameserver/.wine/dosdevices/z:
ln -s /home/gameserver /home/gameserver/.wine/dosdevices/z:

Jetzt erstellen wir noch ein Skript, welches den Server automatisch startet.

Eine neue crontab für den gameserver-User wird mit diesem Befehl angelegt:

EDITOR=mcedit crontab -e -u gameserver

Kopiere den folgenden Inhalt in den Editor und drücke F2 + F10 um die Datei abzuspeichern:

MAILTO=""
* * * * * /home/gameserver/tron_check.sh

Was bewirkt dies: Das Skript tron_check.sh wird alle 60 Sekunden gestartet – also müssen wir die Datei noch erstellen und mit Inhalten füllen:

mcedit /home/gameserver/tron_check.sh

Der Editor öffnet sich erneut. Dieses Mal, kopiere die folgenden Zeilen dort hinein. Drücke wieder F2 + F10.

#!/bin/bash
# check daemon
ps -ef | grep -v grep | grep TRONSrv.exe
# if not found - equals to 1, start it
if [ $? -eq 1 ]
then
cd tron && nohup xvfb-run -a wine TRONSrv.exe > /dev/null 2>/dev/null &
else
echo "tron found - do nothing"
fi

Jetzt stellen wir noch sicher, dass das gesamte Verzeichnis auch dem richtigen Benutzer gehört und dass das Skript auch ausführbar ist:

chown -R gameserver:gameserver /home/gameserver
chmod +x /home/gameserver/tron_check.sh

Fertig! Warte einige Sekunden und dein Server sollte in der Masterliste auftauchen! Falls nicht, entsperre die Ports 13139, 28888-29901 (TCP) und 27888-29901 (UDP) in deiner Firewall.

Meinen Serverstatus kannst du dir hier ansehen, er läuft sehr stabil über Wine:

http://hirnschwund.net/

Es ist natürlich auch möglich, eine zweite Instanz zu starten, aber etwas komplizierter. Ich werde dies hier nicht behandeln, helfe dir aber gern über die Kommentare.

Ich weiß, dass einige Schritte sehr speziell auf das Spiel zugeschnitten sind, welches ich hier nutzen wollte. Aber ich hoffe, dass dieser Beitrag vielleicht eine Hilfe für einige ist, die ähnliche Programme nutzen wollen.

Hinweis: Wenn du die grafische Oberfläche aufrufen möchtest, gib Folgendes ein:

ps -ef | grep -v grep | grep Xvfb

Hier siehst du den virtuellen Bildschirm, auf dem dein Server aktuell läuft. Dieser ist eine Nummer wie z.B. :1, :2 or :99. Merke dir einfach diese Nummer und starte einen VNC-Server mit dem folgenden Befehl:

x11vnc -display :99

Jetzt kannst du dich zu diesem Server mit irgendeinem VNC-Viewer unter Windows oder Linux verbinden und diesen mit deiner Maus bedienen. Es sieht nicht besonders schön aus, aber es funktioniert. Zumindest für das Spiel „No One Lives Forever“, in dem ich das ab und zu brauche:

bla

Wenn du nicht möchtest, dass sich fremde Menschen zu deiner Oberfläche verbinden können, richte den Passwortschutz in x11vnc ein. Du bekommst Anweisungen dazu, wenn du das Programm startest.

Dieser Beitrag hat 11 Kommentare

  1. Genau so etwas suche ich für ein kleines Windows Wetterdaten-Dekodierungsprogramm, welches sich ebenfalls mit CMD Kommandozeilen ausführen lässt. Bei mir will er aber ständig den X-Server haben, trotz des xvfb über Debian.

    Ich benötige die GUI aber nicht, weil ich die Decodierung über CMD Parameter anstoßen kann.

    Vg, Alexander

  2. Hmm, das ist komisch, ich habe blank ein Debian Root-Server in der Cloud aufgesetzt zum Testen. aptitude install wine xvfb ausgeführt sowie zusätzlich halt noch winetricks, was ich aber anscheinend für das simple Windows Dekodierungsprogramm nicht benötige.

    Jedenfalls verlangt er auch bei wineconsole xorg X-Server.

    wineconsole
    Application tried to create a window, but no driver could be loaded.
    Make sure that your X server is running and that $DISPLAY is set correctly.
    err:systray:initialize_systray Could not create tray window
    Application tried to create a window, but no driver could be loaded.
    Make sure that your X server is running and that $DISPLAY is set correctly.

    Ein weites Problem ist, dass ich das Programm einmal mit GUI wohl starten muss, weil ich habe zwar das *.KEY file im Programmverzeichnis, weil dieses Programm ebenfalls einen Lizenz Key benötigt, habe ich halt unter Windows schnell hinzugefügt, aber das derbe ist natürlich, dass sich bei neuer Hardware der Lizenzschlüssel wieder ändert. Anfordern kann ich jederzeit anhand dieses neuen generierten Schlüssels einen neuen Lizenzcode, nur muss ich den dann direkt in Linux in der GUI eingeben, aber halt nur einmalig.

    Was macht das Programm eigentlich: Ich hole praktisch von einem Wetterdienst per FTP einige Wetterdaten ab, dann muss dieses Programm namens FMdecode diese automatisch per CMD Batch ausgeführt dekodieren und zwar 24/7, welches dann lesbare CSV/XML Dateien erzeugt, diese müssen halt in ein Verzeichnis am besten wieder unter Linux Dateisystem liegen, welches ich dann per SFTP mit Leserechten freigebe. Für die meisten Wettermodelle und Dateiformate gibt es oft Linux C/Python/PHP Extensions, nur leider für diese FM Decodierung nicht.

    Mit der Linux Lösung spare ich mir eine Menge Umwege wie erst von Wetterdaten per FTP via WinSCP ziehen, dann mit FMdecode unter Windows verarbeiten (extra Maschine) und dann wieder automatisch via WinSCP SFTP auf meinen Linux Server dekodiert puschen.

    Die Software ist nur rein 32-Bit, habe auch die Wine 32-Bit Packages installiert.

  3. Ich habe es anscheinend erstmal ohne GUI hinbekommen. Wine und Xvfb nochmal in Debian reinstalled und dann xvfb-run wine fmdecode.exe – wird ausgeführt ohne Fehlermeldungen oder Verlangen nach X-Server/GUI.

    Jetzt noch einmalig die GUI anzeigen lassen über x11vnc für das Anzeigen der Seriennummer. Dann dürfte ich es bald wunderbar am Laufen haben.

  4. Habe es geschafft 😉 mit x11vnc und VNC Viewer. Jedenfalls aber öffnet er 0 Hauptdisplay und momentan geht es nur mit dem folgendem SSH Befehl:

    Xvfb -screen 0 800x600x16 -ac &
    DISPLAY=:0 wine fmdecode.exe &
    x11vnc -display :0 &

  5. Soweit so gut, habe noch paar Teile von dir übernommen.

    Aber leider funktioniert dieser Befehl nicht bei mir. Also es erstellt keinen Ordner .wine (ich bin als root User eingeloggt)

    sudo -s -u fmdecode
    xvfb-run -a wine cfg

    Hier meine aktuelle Befehlskette:

    Xvfb -screen :10 800x600x16 -ac &
    export DISPLAY=:10 &
    DISPLAY=:10 wine fmdecode.exe &
    x11vnc -rfbauth ~/.x11vnc/passwd -display :10 &

    Bin gerade dabei ein .sh Script zu erstellen. x11vnc sichere ich mit Kennwort ab.

    1. Der Befehl ist „winecfg“ zusammengeschrieben. wine als root laufenzulassen würde ich aus Sicherheitsgründen nicht empfehlen.

      Ich weiß nicht, ob wine da von sich aus nicht startet wie manch andere Programme. Es sollte aber eigentlich /root/.wine als Verzeichnis erstellen.

  6. Ja ich weiß ;). Ich habe auch schon einen Benutzer nur für Wine erstellt ohne Shell Zugriff. Das ganze liegt noch auf einem blanken Root-Server in der Cloud zum Testen. Wenn es fertig ist, geht es auf einen produktiven Server.

    Das winecfg auseinander geschrieben wurde, liegt wohl an meinem Mac Rechtschreibkorrektur.

    winecfg fordert mit xvfb-run ständig :99 Display.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

An den Anfang scrollen