Některé hry ve Steamu mají dedikovaný server jen pro Windows. V depotu není žádná Linuxová binárka, takže obvyklá rada zní „spusť to na Windows stroji“. Nemusíš. Pomocí Wine můžeš spustit Windows server na běžném Linuxovém stroji a server se normálně připojí ke Steamu a přijme skutečné hráče. Tohle je přesný postup, který nám fungoval, na příkladu Alien Swarm: Reactive Drop (bezplatná kooperativní hra na Source enginu). Stejný přístup by měl fungovat i pro další dedikované servery na Source enginu, které existují jen pro Windows.
Nejdřív ověř, že opravdu neexistuje verze pro Linux
Nic nepředpokládej. Zeptej se přímo Steamu, než sáhneš po Wine. Namiř steamcmd na danou appku a přečti si seznam podporovaných platforem:
steamcmd +login anonymous +app_info_print <appid> +quit \
| grep -iE "oslist|name"Pokud má appka dedikovaného serveru „oslist windows“ jen pro Windows, neexistuje žádná nativní Linuxová verze, na kterou by ses mohl spolehnout. Můžeš také zkusit vynutit instalaci pro Linux; pokud opravdu neexistuje žádný Linuxový depot, rychle to selže:
steamcmd +@sSteamCmdForcePlatformType linux \
+login anonymous +app_update <appid> validate +quit
# ERROR! Failed to install app '<appid>' (Missing configuration)Tahle chyba, a to, že se nestáhnou žádné soubory ELF, to jen potvrzuje. Cesta teď vede přes Wine. Nainstaluj server A appku 1007 (Steamworks Common Redistributables) do stejné složky, s platformou nastavenou na windows. Appka 1007 obsahuje Steam DLL knihovny, které server potřebuje, a proč, uvidíš v kroku 2:
steamcmd +@sSteamCmdForcePlatformType windows +login anonymous \
+force_install_dir /path/to/server \
+app_update <appid> validate \
+app_update 1007 validate \
+quitProč naivní pokus přes Wine selže
Když spustíš server rovnou přes Wine, narazíš hned na dvě zdi za sebou:
- Žádná konzole: server očekává skutečný terminál. Když mu vstup napojíš z /dev/null, dostaneš chybu CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents a server se vůbec nespustí.
- Nelze načíst knihovnu Steamu: i po nastartování vypíše „Unable to load Steam support library“ a nikdy se nezaregistruje u Steamu, takže ho nikdo nenajde ani se k němu nepřipojí.
Obě se dají vyřešit. Tady je kompletní postup.
Krok 1: dej mu skutečný terminál (PTY)
Headless stroj nemá terminál a konzolový server pro Windows bez něj odmítá běžet. Zabal spouštění do příkazu script, který přidělí pseudo-terminál, a pro falešný displej použij Xvfb:
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.logSamo o sobě to stačí na to, aby server načetl mapu a obsadil herní port. Se Steamem se ale pořád nedomluví.
Krok 2: dvě Steam DLL, dva různé zdroje
Source engine potřebuje vedle spustitelného souboru serveru OBĚ knihovny, steamclient.dll i steam.dll, a tady je past, která nás stála celé další kolo ladění: pocházejí z RŮZNÝCH míst a appka 1007 ti dá jen JEDNU z nich.
- steamclient.dll: pochází z aplikace 1007 (Steamworks Common Redistributables), kterou jsi nainstaloval v kroku 1. Je to originální, verzově odpovídající soubor spravovaný Valve.
- steam.dll: NENÍ součástí aplikace 1007. Je to část Steam KLIENTA a jediný čistý způsob, jak ho získat, je jednou spustit Windows steamcmd.exe pod Wine – ten se sám aktualizuje a uloží steam.dll (i steamclient.dll) do vlastní složky.
Nejdřív tedy získej steam.dll pomocí steamcmd.exe pod Wine, pak zkopíruj obě DLL knihovny vedle spustitelného souboru serveru:
# 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" .Krok 3: proč je klíčová právě steam.dll
Tuhle část skoro nikdo nikde nezmiňuje. Chyba hlásí „Unable to load Steam support library“ a myslí tím ne steamclient.dll, ale steam.dll. Source engine hledá steam.dll vedle vlastního spustitelného souboru, aby jím nastartoval celý řetězec připojení ke Steamu. Pokud je přítomná jen steamclient.dll (a to je vše, co ti dá appka 1007), pořád to selže. Ve chvíli, kdy je steam.dll vedle .exe souboru, se log najednou obrátí z chyby na úspěch:
Connection to Steam servers successful.
VAC secure mode is activated.VAC se aktivuje jen tehdy, když je server řádně přihlášený jako gameserver, takže tenhle řádek je důkaz, že se zaregistroval. Většina serverů na Source enginu se tady přihlašuje anonymně a nepotřebuje Game Server Login Token (GSLT). Vyžaduje ho jen pár her (například CS2).
Past: A2S mlčí, ale server je v pořádku
Tady je háček, který nás stál nejvíc času, a důvod, proč jsme to málem vzdali. Pod Wine server VŮBEC neodpovídá na A2S_INFO, tedy UDP dotaz, kterým nástroje zjišťují název serveru, mapu a počet hráčů. Zeptáš se ho a každý port vyprší, i ze stejného stroje. Pokud používáš A2S jako health check, server vypadá jako úplně mrtvý.
Není mrtvý. To, že A2S pod Wine mlčí, nebrání skutečným hráčům se připojit. Prohlížeč serverů ve hře čerpá ze Steamího hlavního seznamu (na který se server sám hlásí) a přímé připojení používá herní protokol, ne A2S. Skutečným testem je tedy to, jestli se připojí klient, ne jestli odpoví dotaz. Když jsme to konečně vyzkoušeli, skutečný hráč se připojil a hrál hned napoprvé:
Client "player" connected (10.0.0.5:27005).
1/ 8 on map <mapname>Praktické ponaučení: u serveru běžícího pod Wine health check přes A2S nepoužívej. Kontroluj něco, co skutečně odráží, že server žije, například řádek „VAC secure mode is activated“ v logu, řádek s počtem hráčů, nebo obyčejnou kontrolu, že je herní UDP port obsazený.
Funguje to pro každou hru pro Windows?
Buďme upřímní ohledně rozsahu. Ověřili jsme to na serveru se Source enginem a stejný postup (PTY, runtime postavené pomocí steamcmd, steam.dll vedle .exe souboru) by měl fungovat i pro další dedikované servery na Source enginu, které existují jen pro Windows. Hry na jiných enginech integrují Steam jinak, takže je ber jako samostatné experimenty. V každém případě počítej se dvěma věcmi: bootování je pomalejší než na nativním Linuxu (Wine plus krok se steamcmd plus přihlášení do Steamu) a výše popsané mlčení A2S se pravděpodobně bude týkat všech z nich.
Nebo se tomu všemu vyhni
Tohle je přesně ten typ zdlouhavého laborování, který sežere celé odpoledne. Pokud chceš jen server, my za tebe provozujeme celou Linuxovou flotilu i Wine propojku, účtujeme podle hodiny, s veřejnou IP adresou od první minuty. Podívej se, co hostujeme na 2hours.gg.