Linux: debuggen nach fehlenden Dateien in Steam Workshop Mods

Ich wollte ein paar Mods für Civilisation 6 installieren, jedoch funktionierte das Spiel dann in Teilen nicht mehr richtig.

Ein elemetarer Unterschied zwischen Linux und Windows ist, dass Linux die Schreibweise von Dateinamen wichtig ist. Ein Mod-Entwickler unter Windows wird nicht merken, dass es ein Groß-/Kleinschreibung-Problem gibt.

Um die Dateien, die ein Programm öffnen möchte zu debuggen kann man unter Linux strace verwenden.

Mit strace an die Steam workshop mods

# sudo strace -f -p 192370 2>&1 | grep 289070 | grep 'Datei '

Hier oben bindet sich strace an die Prozess-ID von "Civ6Sub" (192370 - immer anders) und hört auf alle Events. Zusätzlich werden alle Fehler unterdrückt, jede Zeile isoliert, die den Civilisation Mod-Folder "289070" enthält und davon nur die gefiltert die den Text "Datei oder Verzeichnis nicht gefunden" beinhalten.

So kam ich auf 3 Dateien, die im Trace in Kleinbuchstaben (und fehlend) erschienen. Die angemerkten Dateien waren tatsächlich in gemischter Schreibweise vorhanden. Aber seltsamerweise wurde die Datei nirgendwo nur in Kleinbuchstaben verwendet.
Es macht den Anschein, als würde dies vom Spiel intern erzwungen. Kein Problem unter Windows, aber unter Linux ist das ein ernstes und absolut nicht auffälliges Problem (man könnte es eine "Falle" nennen).

Wie kriegt man die Prozess ID eines Programms?

Man sollte den Namen des Programs wissen (bspw. Civ6Sub). Ggf. im System Monitor nachsschauen.

# ps aux | grep "Civ6Sub"

ruediger  192370  0.0  0.0  31568  7260 ?        S    16:52   0:00 /bin/sh /mnt/games/Steam/steamapps/common/Sid Meier's Civilization VI/./Civ6

In der Augabe oben ist 192370 die Prozess ID.

Woher weiss ich den Mod-Ordner des Steam-Spiels?

Öffnet man die Steam-Seite des Spiels, steht in der URL die Spiel-ID: https://store.steampowered.com/app/289070/Sid_Meiers_Civilization_VI/

Hier ist die Spiel-ID: 289070

Mods sind im Installationsverzeichnis von Steam im workshop Ordner.

Der Ordner des Spiels ist dann bspw.
/path/to/Steam/steamapps/workshop/content/289070/
(oft ~/.local/share/Steam)

Wie ich mein Problem dann löste

Für mein konkretes Problem mit "Sukritact's Simple UI Adjustments" wurde ich im Forum des Mod fündig. Dort gibt es den u.g. Patch:
https://steamcommunity.com/workshop/filedetails/discussion/939149009/4241773359648346080/

cd ~/.local/share/Steam/steamapps/workshop/content/289070/939149009/
find -name '*.lua' -o -name '*.xml' | sed -n 's/\(.*\/\)\(.*\)/ln -s \2 \1\L\2/p' | sh

Das ist ziemlich elegant, da es ein Kommando mittels Suchen & Ersetzen zusammenbaut und dieses dann ausführt. Das Kommando im Ergebnis erzeugt für jeden gefundene Dateipfad einen Symlink, dessen Dateiname nur aus Kleinbuchstaben besteht, lässt aber den Pfad in Ruhe.

.*\/ erwischt alles bis zum letzten /. Somit ist der zweite Teil
.* nur noch der Dateiname

Der zweite Teil wird dann eingefügt mit einer Konvertierung zu Kleinbuchstaben: \L\2

Schlussendlich wird für jede Datei ein Kommando ausgeführt, das etwa so aussieht:

# ln -s UI/Common/CityPanel.xml UI/Common/citypanel.xml