2hours.gg/

Saatlik oyun sunucuları. Sadece oynarken öde.

Yalnızca Windows'a özgü bir oyun sunucusu Linux'ta nasıl çalıştırılır

Bazı Steam oyunları yalnızca Windows dedicated sunucusu getirir. Depoda Linux binary'si yoktur, bu yüzden alışılmış tavsiye "onu bir Windows makinesinde çalıştır" olur. Buna mecbur değilsin. Wine ile Windows sunucusunu normal bir Linux makinede çalıştırabilirsin ve Steam'e bağlanıp gerçek oyuncuları kabul eder. Bu, bizde işe yarayan tam tarif, örnek olarak Alien Swarm: Reactive Drop (ücretsiz bir Source co-op oyunu) ile. Aynı yaklaşım diğer yalnızca Windows Source dedicated sunucularına da taşınmalı.

Önce, gerçekten Linux sunucusu olmadığını doğrula

Varsayma. Wine'a uzanmadan önce doğrudan Steam'e sor. steamcmd'yi app'e yönlendir ve platform listesini oku:

steamcmd +login anonymous +app_info_print <appid> +quit \
  | grep -iE "oslist|name"

Eğer dedicated sunucu app'i yalnızca "oslist windows" ise, geri dönülecek native Linux build'i yoktur. Bir Linux kurulumunu zorlamayı da deneyebilirsin; gerçekten hiç Linux deposu yoksa hızlıca başarısız olur:

steamcmd +@sSteamCmdForcePlatformType linux \
  +login anonymous +app_update <appid> validate +quit
# ERROR! Failed to install app '<appid>' (Missing configuration)

O hata ve hiç ELF dosyasının inmemesi bunu doğrular. Artık yol Wine. Sunucuyu VE app 1007'yi (Steamworks Common Redistributables) aynı klasöre, windows platform tipiyle kur. App 1007, sunucunun ihtiyaç duyduğu Steam DLL'lerini getirir ve nedenini Adım 2'de göreceksin:

steamcmd +@sSteamCmdForcePlatformType windows +login anonymous \
  +force_install_dir /path/to/server \
  +app_update <appid> validate \
  +app_update 1007 validate \
  +quit

Naif Wine denemesi neden başarısız olur

Sunucuyu doğrudan Wine'dan çalıştırmak arka arkaya iki duvara toslar:

  • Konsol yok: sunucu gerçek bir terminal bekler. /dev/null'dan pipe yapmak CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents verir ve asla başlamaz.
  • Steam kütüphanesi yüklenemiyor: açılsa bile "Unable to load Steam support library" yazar ve Steam'e asla kayıt olmaz, dolayısıyla kimse onu bulamaz veya katılamaz.

İkisi de düzeltilebilir. İşte tam tarif.

Adım 1: ona gerçek bir terminal (PTY) ver

Ekransız bir makinenin terminali yoktur ve Windows konsol sunucusu biri olmadan çalışmayı reddeder. Başlatmayı, bir sözde terminal ayıran script içine sar ve sahte bir ekran için Xvfb kullan:

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.log

Bu tek başına sunucunun bir harita yüklemesini ve oyun portunu bağlamasını sağlar. Ama hâlâ Steam ile konuşamaz.

Adım 2: iki Steam DLL'i, iki farklı kaynak

Source engine, sunucu exe'sinin yanında HEM steamclient.dll HEM de steam.dll'i ister ve bize fazladan bir tur hata ayıklamaya mal olan tuzak şu: bunlar FARKLI yerlerden gelir ve app 1007 sana yalnızca BİRİNİ verir.

  • steamclient.dll: Adım 1'de kurduğun app 1007'den (Steamworks Common Redistributables) gelir. Kanonik, sürümü eşleşmiş, Valve tarafından bakımı yapılan.
  • steam.dll: app 1007'de YOKTUR. Steam İSTEMCİSİNİN bir parçasıdır ve onu almanın tek temiz yolu, Windows steamcmd.exe'yi Wine altında bir kez çalıştırmaktır; kendini günceller ve steam.dll'i (artı steamclient.dll'i) kendi klasörüne bırakır.

O yüzden steam.dll'i Wine altında steamcmd.exe ile bootstrap et, sonra iki DLL'i de sunucu exe'sinin yanına kopyala:

# 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" .

Adım 3: neden steam.dll önemli olan parça

Bu, neredeyse kimsenin yazmadığı kısım. Hata "Unable to load Steam support library" der ve kastettiği support kütüphanesi steamclient.dll değil, steam.dll'dir. Source engine, tüm Steam zincirini başlatmak için steam.dll'yi kendi çalıştırılabilir dosyasının yanında arar. Yalnızca steamclient.dll varken (ki app 1007'nin sana verdiği tek şey budur) hâlâ başarısız olur; steam.dll .exe'nin yanında olduğu an, log başarısızlıktan başarıya döner:

Connection to Steam servers successful.
VAC secure mode is activated.

VAC, sunucu düzgün giriş yapmış bir gameserver olmadıkça etkinleşmez, yani o satır kayıt olduğunun kanıtıdır. Çoğu Source sunucusu burada anonim olarak giriş yapar ve bir Game Server Login Token (GSLT) gerektirmez. Yalnızca birkaç oyun (CS2 gibi) bir tane gerektirir.

Tuzak: A2S susar ama sunucu gayet iyi

İşte bize en çok zaman kaybettiren ve neredeyse vazgeçmemize sebep olan püf nokta. Wine altında sunucu A2S_INFO'ya yanıt VERMEZ, ki bu araçların bir sunucunun adını, haritasını ve oyuncu sayısını okumak için kullandığı UDP sorgusudur. Onu sorgula ve aynı makineden bile her port zaman aşımına uğrar. A2S'yi health check olarak kullanırsan, sunucu tamamen ölü görünür.

Ölü değil. Wine altında A2S'nin susması gerçek oyuncuların katılmasını engellemez. Oyun içi sunucu tarayıcısı, sunucuları Steam'in master listesinden listeler (sunucu buna kendiliğinden bildirir) ve doğrudan bağlantı A2S'yi değil, oyun protokolünü kullanır. Yani asıl test, yanıt veren bir sorgu değil, bağlanan bir istemcidir. Sonunda denediğimizde, gerçek bir oyuncu ilk denemede bağlandı ve oynadı:

Client "player" connected (10.0.0.5:27005).
1/ 8 on map <mapname>

Pratik ders: Wine'da host edilen bir sunucuda A2S ile health check yapma. Gerçekten canlılığı yansıtan bir şeyi kontrol et, örneğin log'daki "VAC secure mode is activated" satırı, oyuncu sayısı satırı ya da oyunun UDP portunun bağlı olduğuna dair basit bir kontrol.

Bu her Windows oyunu için çalışır mı?

Kapsam konusunda dürüst ol. Bunu bir Source engine sunucusunda kanıtladık ve aynı tarif (PTY, steamcmd ile derlenmiş bir runtime, exe'nin yanında steam.dll) diğer yalnızca Windows Source dedicated sunucuları için çalışmalı. Diğer engine'lerdeki oyunlar Steam'i farklı entegre eder, o yüzden onları ayrı deneyler olarak ele al. Her durumda beklenecek iki şey: açılışlar native Linux'tan daha yavaştır (Wine artı steamcmd adımı artı Steam girişi) ve yukarıdaki A2S-susar davranışı muhtemelen hepsi için geçerli olacak.

Ya da tüm bunları atla

Bu, bir öğleden sonrayı yiyip bitiren türden bir uğraş. Sadece sunucuyu istiyorsan, Linux filosunu ve Wine tesisatını senin için, saatlik, ilk dakikadan itibaren genel bir IP ile işletiyoruz. 2hours.gg üzerinde neler sunduğumuza bak.

Ayrıca bak

← Tüm rehberlere dön