Windows-Spieleserver unter Linux betreiben
Hasst 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:
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:
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.
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
Hallo,
dafür liefert wine das Programm “wineconsole” mit – das sollte auch ohne X-Server laufen. Zur Not mit “–backend=curses”.
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.
Kurze Anmerkung: Habe gerade gesehen, dass ich unter Debian Wine 1.4.x mit aptitude installiert bekomme. Ich kann mir allerdings auch Wine 1.6.2 besorgen.
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.
Genau so hätte ich es auch vorgeschlagen. 😉 Würde mich wundern, wenn es nicht liefe. Viel Erfolg!
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 &
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.
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.
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.
Habe auch das soweit gelöst bekommen und halt noch fehlende Fonts nachinstalliert!