Vissa Steam-spel har bara en dedikerad server för Windows. Det finns ingen Linux-binär i depoten, så det vanliga rådet är att "köra den på en Windows-maskin". Det behöver du inte. Med Wine kan du köra Windows-servern på en vanlig Linux-maskin, och den kopplar upp sig mot Steam och tar emot riktiga spelare. Det här är precis det recept som fungerade för oss, med Alien Swarm: Reactive Drop (ett gratis co-op-spel på Source-motorn) som exempel. Samma metod bör fungera för andra dedikerade Source-servrar som bara finns till Windows.
Kontrollera först att det verkligen inte finns någon Linux-server
Anta inget. Fråga Steam direkt innan du tar till Wine. Peka steamcmd mot appen och läs dess plattformslista:
steamcmd +login anonymous +app_info_print <appid> +quit \
| grep -iE "oslist|name"Om den dedikerade serverappen bara har "oslist windows", finns det ingen native Linux-build att falla tillbaka på. Du kan också försöka tvinga fram en Linux-installation; när det verkligen inte finns någon Linux-depot misslyckas det snabbt:
steamcmd +@sSteamCmdForcePlatformType linux \
+login anonymous +app_update <appid> validate +quit
# ERROR! Failed to install app '<appid>' (Missing configuration)Det felet, och att inga ELF-filer hamnar där, bekräftar det. Nu är Wine vägen framåt. Installera servern OCH app 1007 (Steamworks Common Redistributables) i samma mapp, med plattformstypen windows. App 1007 innehåller de Steam-DLL:er som servern behöver, och du kommer se varför i steg 2:
steamcmd +@sSteamCmdForcePlatformType windows +login anonymous \
+force_install_dir /path/to/server \
+app_update <appid> validate \
+app_update 1007 validate \
+quitVarför det naiva Wine-försöket misslyckas
Att köra servern direkt från Wine går rakt in i två väggar:
- Ingen konsol: servern förväntar sig en riktig terminal. Om du pipear från /dev/null får du CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents och den startar aldrig.
- Kan inte ladda Steam-biblioteket: även när den startar skriver den ut "Unable to load Steam support library" och registrerar sig aldrig hos Steam, så ingen kan hitta eller ansluta till den.
Båda går att lösa. Här är hela receptet.
Steg 1: ge den en riktig terminal (PTY)
En headless maskin saknar terminal, och Windows konsolserver vägrar köra utan en. Kör starten via script, som allokerar en pseudo-terminal, och använd Xvfb för en fejkad display:
Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99 WINEPREFIX=/wine
script -qfc "wine srcds_console.exe -console -condebug \
-game <gamedir> +map <map> -port 27015" /tmp/server.logBara det får servern att ladda en bana och binda sin spelport. Men den kan fortfarande inte prata med Steam.
Steg 2: två Steam-DLL:er, två olika källor
Source-motorn behöver BÅDE steamclient.dll och steam.dll bredvid serverns exe-fil, och här är fällan som kostade oss en hel extra runda felsökning: de kommer från OLIKA ställen, och app 1007 ger dig bara EN av dem.
- steamclient.dll: kommer från app 1007 (Steamworks Common Redistributables), som du installerade i steg 1. Kanonisk, versionsmatchad och underhållen av Valve.
- steam.dll: finns INTE i app 1007. Den är en del av Steam-KLIENTEN, och det enda rena sättet att få tag i den är att köra Windows steamcmd.exe en gång under Wine, som uppdaterar sig själv och lägger steam.dll (samt steamclient.dll) i sin egen mapp.
Så bootstrappa steam.dll med steamcmd.exe under Wine, och kopiera sedan båda DLL-filerna till samma mapp som server-exe:n:
# steam.dll: run Windows steamcmd once under Wine (needs Xvfb for a display)
cd "$WINEPREFIX/drive_c/steamcmd"
curl -fsSLO https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip
unzip -o steamcmd.zip
DISPLAY=:99 wine steamcmd.exe +quit # lays down steam.dll + steamclient.dll
# place both next to the server exe
cd /path/to/server
cp "$WINEPREFIX/drive_c/steamcmd/steam.dll" .
[ -f steamclient.dll ] || cp "$WINEPREFIX/drive_c/steamcmd/steamclient.dll" .Steg 3: varför steam.dll är den avgörande biten
Det här är den delen nästan ingen skriver ner. Felet säger "Unable to load Steam support library", och biblioteket det syftar på är inte steamclient.dll, utan steam.dll. Source-motorn letar efter steam.dll bredvid sin egen körbara fil för att starta upp hela Steam-kedjan. Med bara steamclient.dll på plats (vilket är allt app 1007 ger dig) misslyckas det fortfarande; i samma stund som steam.dll ligger bredvid .exe-filen vänder loggen från fel till lyckat resultat:
Connection to Steam servers successful.
VAC secure mode is activated.VAC aktiveras inte om inte servern är korrekt inloggad som spelserver, så den raden är ditt bevis på att den registrerades. De flesta Source-servrar loggar in anonymt här och behöver ingen Game Server Login Token (GSLT). Bara ett fåtal spel (som CS2) kräver en sådan.
Fällan: A2S tystnar men servern mår bra
Här är fällan som kostade oss mest tid, och anledningen till att vi nästan gav upp. Under Wine svarar inte servern på A2S_INFO, den UDP-fråga som verktyg använder för att läsa en servers namn, bana och antal spelare. Fråga den och varje port timeoutar, även från samma maskin. Om du använder A2S som hälsokontroll ser servern helt död ut.
Den är inte död. Att A2S är tyst under Wine hindrar inte riktiga spelare från att ansluta. Serverlistan i spelet hämtar servrar från Steams huvudlista (som servern själv skickar till), och en direktanslutning använder spelprotokollet, inte A2S. Det verkliga testet är alltså om en klient kan ansluta, inte om en fråga besvaras. När vi till slut testade det anslöt en riktig spelare och spelade på första försöket:
Client "player" connected (10.0.0.5:27005).
1/ 8 on map <mapname>Den praktiska lärdomen: för en Wine-hostad server, hälsokontrollera inte med A2S. Kontrollera något som faktiskt speglar om servern lever, till exempel raden "VAC secure mode is activated" i loggen, raden med antal spelare, eller en enkel kontroll att spelets UDP-port är bunden.
Fungerar det här för alla Windows-spel?
Var ärlig om omfattningen. Vi bevisade det här på en Source-motorserver, och samma recept (PTY, en steamcmd-byggd runtime, steam.dll bredvid .exe-filen) bör fungera för andra dedikerade Source-servrar som bara finns till Windows. Spel på andra motorer integrerar Steam på andra sätt, så behandla dem som separata experiment. Två saker att räkna med oavsett: uppstart tar längre tid än på native Linux (Wine plus steamcmd-steget plus Steam-inloggningen), och att A2S är tyst enligt ovan kommer troligen att gälla för alla av dem.
Eller hoppa över allt det här
Det här är den typen av tidsslukande sidospår som äter upp en eftermiddag. Vill du bara ha servern kör vi Linux-flottan och Wine-rörledningen åt dig, per timme, med publik IP från första minuten. Se vad vi hostar på 2hours.gg.