Tips en Trucs 2019

Steam en openSUSE

Wie onder Linux wil gamen, komt bijna automatisch bij Steam terecht. Om games via Steam te kunnen spelen, moet je het Steam softwarepakket installeren. Steam creëert daarmee een eigen omgeving (lees besturingssysteem) gebaseerd op Ubuntu. Steam hoeft voor de publicatie van een game het spel enkel te testen in hun eigen omgeving. Waardoor ze als firma meer tijd hebben om meer games uit te brengen en te verkopen. Zo bevat hun omgeving nu ook een Windows emulator waardoor je in Linux nu ook bepaalde Windows games kunt spelen.

Maar dit systeem heeft ook een nadeel. Linux en zijn verschillende distributies evolueren zo snel dat er nu en dan problemen ontstaan. Maar deze zijn meestal eenvoudig op te lossen.

Northgard

Hoe ouder het spel en hoe recenter uw distributie, hoe meer kans op problemen. Hoewel Northgard dateert van 7 maart 2018 kan je dit via Steam niet meer opstarten in openSUSE Leap 15.1.

Om te achterhalen wat er fout gaat, start je een Terminal waarop je de foutmeldingen worden weergegeven. Start Programmastarter > Terminal (Konsole) en start Steam met de opdracht:

dany@main:~> xhost local:+; STEAM_RUNTIME_PREFER_HOST_LIBRARIES=0 /usr/bin/steam

Geef indien nodig uw Account name en Password in om je bij Steam aan te melden. M.a.w. Steam start zoals je dat gewoon bent, in de grafische omgeving. Daarbij werden reeds twee problemen opgelost:

Start daarna zoals gewoonlijk vanuit de grafische Steam omgeving het spel op. In de Terminal krijg je de volgende meldingen bij het opstarten van het spel Northgard:

Starting app 466560
Installing breakpad exception handler for appid(steam)/version(1565656602)
>>> Adding process 6132 for game ID 466560
GameAction [AppID 466560, ActionID 1] : LaunchApp changed task to WaitingGameWindow with ""
ERROR: ld.so: object '/home/dany/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
GameAction [AppID 466560, ActionID 1] : LaunchApp changed task to Completed with ""
>>> Adding process 6138 for game ID 466560
** ERROR ** Missing library linux/sdl.hdll: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by linux/libSDL2-2.0.so.0)
** ERROR ** Missing library linux/libSDL2-2.0.so.0: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by linux/libSDL2-2.0.so.0)
** ERROR ** Missing library linux/libSDL2.so: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by linux/libSDL2.so)
** ERROR ** Missing library linux/libSDL2-2.0.so: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by linux/libSDL2-2.0.so)
** ERROR ** Missing library linux/libSDL2-2.0.so.0.8.0: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by linux/libSDL2-2.0.so.0.8.0)
sh: notify-send: command not found
src/module.c(321) : FATAL ERROR : Failed to load library sdl.hdll
Game removed: AppID 466560 "", ProcID 6132 
Exiting app 466560
No cached sticky mapping in ActivateActionSet.JS method call Messaging.PostMessage with 4 arguments
JS method call SharedConnection.SendMsgAndAwaitResponse with 3 arguments
JS method call Messaging.PostMessage with 4 arguments
JS method call Messaging.PostMessage with 4 arguments

Uit de eerste foutmelding (** ERROR **) blijkt dat het onderdeel (bibliotheek, library) linux/sdl.hdll ontbreekt. Om ons onderzoek verder te zetten, verlaten we Steam in de grafisch omgeving via het menu Steam > Exit). Gebruik NIET de sluitknop van het Steam venster, daarmee minimaliseer je Steam in het systeemvak, maar wordt Steam niet afgesloten. Bij het correct afsluiten van Steam verschijnen in het Terminalvenster de volgende meldingen:

Exiting workitem thread
[2019-08-17 13:40:59] Startup - updater built Aug 12 2019 23:47:21
[2019-08-17 13:40:59] Verifying installation...
[2019-08-17 13:40:59] Verification complete
[2019-08-17 14:03:48] Shutdown

Steam games worden standaard opgeslagen in de verborgen map met de naam .local/share/Steam/steamapps/common/ in uw Persoonlijke map. Met de volgende opdracht kan je deze map in de Terminal openen:

dany@main:~> cd .local/share/Steam/steamapps/common/

Met een ls opdracht maak je inhoud van deze map zichtbaar, m.a.w. zie je welke games je geïnstalleerd hebt:

dany@main:~/.local/share/Steam/steamapps/common> ls -lh
totaal 12K
drwxr-xr-x 7 dany users 4,0K 26 jul 18:54 AoW3
drwxr-xr-x 6 dany users 4,0K 30 jul 19:23 Northgard
drwxr-xr-x 4 dany users 4,0K  7 aug 20:53 Pillars of Eternity II

De map met de naam Northgard bevat het spel dat niet wil starten, we openen in dit spel de map uit de foutmelding met de opdracht:

dany@main:~/.local/share/Steam/steamapps/common> cd Northgard/linux/

Je bekijkt de inhoud van deze map met de opdracht:

dany@main:~/.local/share/Steam/steamapps/common/Northgard/linux> ls -lh
totaal 15M
-rwxr-xr-x 1 dany users  43K 26 jul 18:41 detect.hl
-rwxr-xr-x 1 dany users 115K 26 jul 18:41 fmt.hdll
-rwxr-xr-x 1 dany users 2,2M 26 jul 18:41 hl
-rwxr-xr-x 1 dany users  84K 26 jul 18:41 libbsd.so.0
-rwxr-xr-x 1 dany users 557K 26 jul 18:41 libhl.so
-rwxr-xr-x 1 dany users 586K 26 jul 18:41 libmbedcrypto.a
-rwxr-xr-x 1 dany users 362K 26 jul 18:41 libmbedcrypto.so
-rwxr-xr-x 1 dany users 362K 26 jul 18:41 libmbedcrypto.so.1
-rwxr-xr-x 1 dany users 362K 26 jul 18:41 libmbedcrypto.so.2.8.0
-rwxr-xr-x 1 dany users 273K 26 jul 18:41 libmbedtls.a
-rwxr-xr-x 1 dany users 177K 26 jul 18:41 libmbedtls.so
-rwxr-xr-x 1 dany users 177K 26 jul 18:41 libmbedtls.so.10
-rwxr-xr-x 1 dany users 177K 26 jul 18:41 libmbedtls.so.2.8.0
-rwxr-xr-x 1 dany users 109K 26 jul 18:41 libmbedx509.a
-rwxr-xr-x 1 dany users  91K 26 jul 18:41 libmbedx509.so
-rwxr-xr-x 1 dany users  91K 26 jul 18:41 libmbedx509.so.0
-rwxr-xr-x 1 dany users  91K 26 jul 18:41 libmbedx509.so.2.8.0
-rwxr-xr-x 1 dany users  39K  6 jul 16:04 libogg.so.0
-rwxr-xr-x 1 dany users 642K 26 jul 18:41 libopenal.so.1
-rwxr-xr-x 1 dany users 207K 26 jul 18:41 libpng16.so.16
-rwxr-xr-x 1 dany users 1,3M 26 jul 18:41 libSDL2-2.0.so
-rwxr-xr-x 1 dany users 1,3M 26 jul 18:41 libSDL2-2.0.so.0
-rwxr-xr-x 1 dany users 1,3M 26 jul 18:41 libSDL2-2.0.so.0.8.0
-rwxr-xr-x 1 dany users 1,3M 26 jul 18:41 libSDL2.so
-rwxr-xr-x 1 dany users  60K 26 jul 18:41 libsndio.so
-rwxr-xr-x 1 dany users  60K 26 jul 18:41 libsndio.so.6.1
-rwxr-xr-x 1 dany users 472K 26 jul 18:41 libsteam_api.so
-rwxr-xr-x 1 dany users 450K 26 jul 18:41 libturbojpeg.so.0
-rwxr-xr-x 1 dany users 160K 26 jul 18:41 libuv.so.1
-rwxr-xr-x 1 dany users  35K 26 jul 18:41 libvorbisfile.so.3
-rwxr-xr-x 1 dany users 176K 26 jul 18:41 libvorbis.so.0
-rwxr-xr-x 1 dany users  55K 26 jul 18:41 mysql.hdll
-rwxr-xr-x 1 dany users  99K 26 jul 18:41 openal.hdll
-rwxr-xr-x 1 dany users  118  6 jul 16:04 run.sh
-rwxr-xr-x 1 dany users 108K 26 jul 18:41 sdl.hdll
-rwxr-xr-x 1 dany users  40K 26 jul 18:41 ssl.hdll
-rwxr-xr-x 1 dany users 290K 26 jul 18:41 steam.hdll
-rwxr-xr-x 1 dany users  18K 26 jul 18:41 ui.hdll
-rwxr-xr-x 1 dany users  22K 26 jul 18:41 uv.hdll

En inderdaad, daar staat het probleem veroorzakende bestand sdl.hdll (zie foutmelding). Je kunt de benodigde onderdelen die nodig zijn om dit bestand uit te voeren, achterhalen met de opdracht:

dany@main:~/.local/share/Steam/steamapps/common/Northgard/linux> ldd sdl.hdll
./sdl.hdll: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by ./libSDL2-2.0.so.0)
        linux-vdso.so.1 (0x00007ffd03dfb000)
        libhl.so => ./libhl.so (0x00007f88cfe90000)
        libSDL2-2.0.so.0 => ./libSDL2-2.0.so.0 (0x00007f88cfb58000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f88cf79e000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f88cf580000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f88cf248000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f88d032a000)
        libasound.so.2 => /usr/lib64/libasound.so.2 (0x00007f88cef4f000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f88ced4b000)
        libpulse.so.0 => /usr/lib64/libpulse.so.0 (0x00007f88ceafa000)
        libsndio.so.6.1 => ./libsndio.so.6.1 (0x00007f88ce8e9000)
        libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007f88ce5a8000)
        libXext.so.6 => /usr/lib64/libXext.so.6 (0x00007f88ce396000)
        libXcursor.so.1 => /usr/lib64/libXcursor.so.1 (0x00007f88ce18b000)
        libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x00007f88cdf88000)
        libXi.so.6 => /usr/lib64/libXi.so.6 (0x00007f88cdd77000)
        libXrandr.so.2 => /usr/lib64/libXrandr.so.2 (0x00007f88cdb6c000)
        libXss.so.1 => /usr/lib64/libXss.so.1 (0x00007f88cd968000)
        libXxf86vm.so.1 => /usr/lib64/libXxf86vm.so.1 (0x00007f88cd762000)
        libwayland-egl.so.1 => /usr/lib64/libwayland-egl.so.1 (0x00007f88cd560000)
        libwayland-client.so.0 => /usr/lib64/libwayland-client.so.0 (0x00007f88cd351000)
        libwayland-cursor.so.0 => /usr/lib64/libwayland-cursor.so.0 (0x00007f88cd149000)
        libxkbcommon.so.0 => /usr/lib64/libxkbcommon.so.0 (0x00007f88ccf09000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f88ccd01000)
        libpulsecommon-11.1.so => /usr/lib64/pulseaudio/libpulsecommon-11.1.so (0x00007f88cca7c000)
        libdbus-1.so.3 => /usr/lib64/libdbus-1.so.3 (0x00007f88cc82a000)
        libbsd.so.0 => ./libbsd.so.0 (0x00007f88cc614000)
        libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007f88cc3eb000)
        libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00007f88cc1e1000)
        libXfixes.so.3 => /usr/lib64/libXfixes.so.3 (0x00007f88cbfdb000)
        libffi.so.7 => /usr/lib64/libffi.so.7 (0x00007f88cbdd1000)
        libsystemd.so.0 => /usr/lib64/libsystemd.so.0 (0x00007f88cbb3c000)
        libsndfile.so.1 => /usr/lib64/libsndfile.so.1 (0x00007f88cb8c0000)
        libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007f88cb6bc000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f88cb4a5000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f88cb27c000)
        libcap.so.2 => /usr/lib64/libcap.so.2 (0x00007f88cb077000)
        liblzma.so.5 => /usr/lib64/liblzma.so.5 (0x00007f88cae3d000)
        liblz4.so.1 => /usr/lib64/liblz4.so.1 (0x00007f88cac28000)
        libgcrypt.so.20 => /usr/lib64/libgcrypt.so.20 (0x00007f88ca90c000)
        libgpg-error.so.0 => /usr/lib64/libgpg-error.so.0 (0x00007f88ca6ec000)
        libFLAC.so.8 => /usr/lib64/libFLAC.so.8 (0x00007f88ca4af000)
        libogg.so.0 => /usr/lib64/libogg.so.0 (0x00007f88ca2a8000)
        libvorbis.so.0 => /usr/lib64/libvorbis.so.0 (0x00007f88ca07b000)
        libvorbisenc.so.2 => /usr/lib64/libvorbisenc.so.2 (0x00007f88c9dd2000)
        libspeex.so.1 => /usr/lib64/libspeex.so.1 (0x00007f88c9bb7000)
        libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f88c992a000)

Opnieuw merk je dat het door ./sdl.hdll benodigde onderdeel libm.so.6 (eerste regel) niet op het systeem werd gevonden. Uit deze melding kan je ook afleiden dat libm.so.6 een onderdeel is van GLIBC_2.27. Na onderzoek (Programmastarter > Toepassingen > Systeem > Software installeren/verwijderen) blijkt openSUSE Leap 15.1 glibc 2.26 te gebruiken. M.a.w. een oudere, voor het spel niet geschikte versie. Op de website https://software.opensuse.org/ ga je op zoek naar het pakket glibc voor alle distributies (All Distributions). Bij het Bekijken van het glibc softwarepakket, blijkt al vlug dat openSUSE Tumbleweed glib versie 2.29 gebruikt. openSUSE Tumbleweed is de meest geavanceerde, maar ook de meest experimentele openSUSE versie. Hoewel we maar glibc versie 2.27 nodig hebben, is de kans groot dat versie 2.29 ook voldoet. Recentere versies zijn in de meeste gevallen compatibel met oudere versies, wat omgekeerd niet opgaat. Klik op de knop glibc voor andere distributies tonen om alle glibc versies te zien. Blijkbaar ondersteunt openSUSE voor Leap 15.1 enkel versie 2.26. Klik bij openSUSE Leap 15.1 op de knop Toon pakketten van de gemeenschap om na te gaan of iemand buiten openSUSE voor Leap 15.1 een recentere glibc versie aanbiedt. En inderdaad in de softwarebron home:jamborm:benchmarking152 wordt versie 2.29 aangeboden. Download de 64 Bit 2.29 versie voor openSUSE Leap 15.1 uit de home:jamborm:benchmarking152 softwarebron.

Start via de Programmastarter de Bestandsbeheerder en open de map Downloads. Klik met de rechter muisknop op het bestand glibc-2.29-lp151.1.2.x86_64.rpm en start de opdracht Uitpakken > Archief hier uitpakken, submap automatisch detecteren. Kopieer het ontbrekende onderdeel naar de linux map van het Steam spel met de Terminal opdracht:

dany@main:~/.local/share/Steam/steamapps/common/Northgard/linux> cp ~/Downloads/glibc-2.29-lp151.1.2.x86_64/lib64/libm-2.29.so .

Let op de punt achteraan de opdracht. Let eveneens op de naam van dit bestand, deze bevat het versienummer 2.29. Omdat versienummers bij dit soort bestanden (onderdelen voor andere programma's of bibliotheken) niet van belang zijn, zolang ze maar hoger zijn, hebben bibliotheekbestanden geen versienummers in hun naam. Omdat het Steamspel Northgard de bibliotheek moet vinden, hernoem je de bibliotheek met de volgende opdracht:

dany@main:~/.local/share/Steam/steamapps/common/Northgard/linux> mv libm-2.29.so libm.so.6

Nu is het tijd om het spel Northgard in Steam te testen. En jawel, Northgard start en zorgt voor uren speelgenot.

Northgard

Conclusie

Dankzij de gescheiden omgeving tussen openSUSE Leap 15.1 en Steam kan je in Steam per spel andere bibliotheken (voor Northgard, glibc 2.27) beschikbaar stellen. Deze bibliotheken storen de werking van openSUSE Leap 15.1 niet, deze blijft glibc versie 2.26 gebruiken. Je hebt de bibliotheek niet in openSUSE geïnstalleerd, maar naar de spelmap van Northgard gekopieerd, waardoor deze enkel door Northgard gebruikt wordt.

Northgard heeft maar één bibliotheek tekort, maar voor sommige games moet je meerdere bibliotheken beschikbaar maken. Bepalen welke bibliotheken tekort zijn, de geschikte bibliotheekbestanden vinden, vormen dan de uitdaging. Maar het uiteindelijk spelplezier maakt veel goed.