[HOWTO] Trine 2 unter FreeBSD

Yamagi

Possessed With Psi Powers
Teammitglied
Trine 2 ist seit dem 31. März 2012 für Linux verfügbar und ohne lange Diskussion das im Moment mit großen Abstand grafisch aufwändigste Spiel für Linux. Es läuft mit ein wenig Gebastel einwandfrei unter FreeBSD. Diese Anleitung wurde unter FreeBSD 9.0 erstellt, ältere Versionen mögen auch funktionieren, aber ich kann es nicht Versprechen. Ich beziehe mich auf die Verkaufsversion von http://www.trine2.com, zwischen der normalen Version und der Collectors Edition besteht kein Unterschied.

Systemvoraussetzungen
--------------------------------
- Eine Nvidia-Grafikkarte mit Blob. Eine 8600GT ist nach Berichten das absolute Minimum, eine 9800GT besser und eine GTX 260 optimal. Der Treiber sollte aktuell sein.
- Eine schnelle CPU, wobei ein 2,5GHz Dual-Core wohl ausreichend ist.
- Mindestens 2GB RAM, besser 4GB.

Den Linuxulator vorbereiten
-----------------------------------
Erst einmal muss der Linuxulator wie im Handbuch beschrieben installiert werden. Trine 2 benötigt zusätzlich zur linux_base-f10 mindestens folgende Ports. Eventuell noch ein paar mehr, aber das kann ich (derzeit) nicht sicher sagen:
- audio/linux-f10-libvorbis
- graphics/linux-f10-libGLU
- x11-toolkits/linux-f10-gtk2

Es stellt sich nun das Problem, dass Trine 2 eine neuere Version der glibc benötigt, als dem Linuxulator beiliegt. Leider kann die glibc nicht einfach per LD_LIBRARY_PATH nachgeladen werden, sie muss in der Linux-Base selbst ersetzt werden. Das zerdeppert den Linuxulator für andere Anwendungen! Ein möglicher Ausweg sind Symlinks:

Code:
cd /compat
cp -rp linux linux_base
mv linux linux_trine2
ln -s linux_trine2 linux

Soll nun eine normale Linux-Anwendung ausgeführt werden, kann der Symlink einfach umgesetzt werden:

Code:
cd /compat
rm linux 
ln -s linux_base linux

Anschließend werden neuere Versionen der glibc und glibc-common aus Fedora 12 heruntergeladen. Es sind im Einzelnen:
- ftp://ftp.pbone.net/mirror/archive....linux/updates/12/i386/glibc-2.11.2-3.i686.rpm
- ftp://ftp.pbone.net/mirror/archive....i386/os/Packages/glibc-common-2.11-2.i686.rpm

Diese Paketen werden mit rpm2cpi(1) installiert:
Code:
cd /compat/linux
rpm2cpio glibc-2.11.2-3.i686.rpm | tar xfv -
rpm2cpio glibc-common-2.11-2.i686.rpm | tar xfv -

Da die neue glibc einen Linux 2.6.18 Kernel erwartet, müssen wir unseren Linuxulator zu einem machen. Zar unterstützt FreeBSD 2.6.18 nicht vollständig, aber für unsere Zwecke reicht es aus:
Code:
sysctl compat.linux.osrelease=2.6.18

Nun ist das System bereit für Trine 2.

Trine 2 installieren
-----------------------
Trine 2 kommt in Form der Datei trine2_linux_installer.run als Download auf die Festplatte. Diese Datei ist ein selbstextrahierendes Shellscript, es lässt sich auch mit etwas Gefummel nicht unter FreeBSD erfolgreich ausführen. Ich habe daher eine VM mit einer Ubuntu-LiveCD gestartet und dort drin das Spiel nach ~/Trine2 installiert. Anschließend habe ich das Verzeichnis auf den FreeBSD-Host kopiert.

Das so installierte Trine 2 hat 4 Probleme:
1. Die beiliegende libSDL nutzt "evdev" für die Eingabe. Das ist ein Eingabesystem für Linux, unter FreeBSD existiert es nicht. Sobald sie evdev anzusprechen versucht, crasht das Spiel. Ich habe daher eine libSDL aus dem Mercurial mit Stand letzter November unter einem echten Fedora 10 in einer VM gebaut, die kein evdev nutzt. Mit ihr funktioniert das Spiel.
2. Das OpenAL des Linuxulators hat keinen Sound. Das ist bekannt, ich habe daher bereits seit langer Zeit eine selbstgebaute libopenal.so.1, die unter FreeBSD Sound gibt.
3. Der Loader benötigt eine glib20, die neuer als die der Linux-Base ist. Ich habe daher eine erstellt.
4. Das Spiel benötigt eine libstdc++, die neuer als die der Linux-Base ist. Ich habe eine gebaut.

All diese Bibliotheken können hier heruntergeladen werden: http://deponie.yamagi.org/freebsd/misc/trine2_libs.tar.xz

Anschließend werden sie ins Spiel extrahiert:
Code:
cd ~/Trine2/lib/lib32
tar xfv trine2_libs.tar.xz

Nun muss noch der Sheband des Startscripts "trine2.sh" auf /compat/linux/bin/sh" geändert werden. Anschließend lässt sich Trine 2 über es starten und kann gespielt werden. Viel Spaß damit. :)
 
Zuletzt bearbeitet:
Also 90% der Issues gehen darauf zurück, dass die Linuxemu zu alt ist? Hast du mal versucht /compat/linux einfach auf dein Ubuntu (aus der VM) zeigen zu lassen?
 
Die Frage ist, was es bringt. FreeBSD "emuliert" einen Linux 2.6.16, das Ubuntu hat einen 3.1 oder so. Da ist schon ein gewaltiger Unterschied zwischen, vielleicht zu groß. Keine Ahnung. Das Hauptproblem war allerdings auch libSDL, was beim fehlgeschlagenen Versuch evdev zu initialisieren einfach abschmiert, anstatt den Fehler abzufangen...

Trine 2 selbst ist auch recht interessant. Das Binary verlangt als Minimum ein Linux 2.6.15, ist aber glibc 2.11 gelinkt, was grob zu 2.6.18 gehört. Und da liegt das Problem in Sachen Linuxulator. Dank Symbol Versioning kann man nicht mal mehr eine ältere glibc unterschieben und die Daumen drücken, dass es klappt. Man muss die gewünschte Version haben und zwar mit allem Schnick-Schnack außenrum.

Nachdem 8.3 draußen ist und die Ports wieder augetaut sind, soll übrigens eine linux_base auf Basis von CentOS 6 committet werden: http://www.leidinger.net/blog/2012/03/13/new-centos-linux_base-for-testing-soonish/ CentOS ist insofern interessant, als das es dank Red Hats Patchorgien auf ein Linux 2.6.18 aufsetzt, aber aktuelle Libs hat. Damit müsste dann sowas wie Trine 2 "out of the box" gehen.

Ich würde es mir ja wünschen, dass Trine 1 opensourced wird. Aber wird wahrscheinlich nicht passieren und wäre für uns BSDler eh sinnlos. In beiden Teilen stecken jede Menge proprietärer Libs von Nvidia. Mindestens Cg und Physx, vielleicht noch ein wenig mehr... Es läuft mit den oben verlinkten Libs nun aber stabil, ich bin schon ca. ein Viertel durch. :)
 
Inzwischen ist die CentOS 6 Linux-Base verfügbar: emulators/linux_base-c6
Damit kann man sich viel Gefummel sparen, verliert allerdings im Gegenzug die Unterstützung einiger anderer Linux-Ports.
 
Hey, danke für das Howto. Mittlerweile habe ich Trine 2 durchgespielt, aber fall es noch jemand installieren möchte, kann er den installer hiermit patchen, so dass er sich auf FreeBSD 9 ausführen lässt. (Kein Linux rüberkopieren mehr nötig).

Code:
#!/bin/sh
# INPUT1: trine installer input filename (backup before!)
sed -e 's/--parents/-p      /' -i .tmp1 "$1" # +1 padding byte
sed -e 's/tar xz -p/tar xzpf -/' -i .tmp2 "$1" # -1 padding byte

Das problem ist/war GNUonly usage von baseutils.
 
Zurück
Oben