خوادم ألعاب بالساعة. ادفع فقط عندما تلعب.

كيف تشغّل خادم لعبة مخصص لـ Windows فقط على Linux

بعض ألعاب Steam توفّر خادمًا مخصصًا لـ Windows فقط. لا يوجد ملف Linux ثنائي في المستودع (depot)، لذا فالنصيحة المعتادة هي "شغّله على جهاز Windows." لست بحاجة إلى ذلك. مع Wine، يمكنك تشغيل خادم Windows على جهاز Linux عادي، وسيتصل بـ Steam ويقبل لاعبين حقيقيين. هذه هي الوصفة الدقيقة التي نجحت معنا، باستخدام Alien Swarm: Reactive Drop (لعبة Source تعاونية مجانية) كمثال. المقاربة نفسها ينبغي أن تصلح لخوادم Source المخصصة الأخرى المخصصة لـ Windows فقط.

أولًا، تأكد أنه لا يوجد فعلًا خادم Linux

لا تفترض. اسأل Steam مباشرة قبل اللجوء إلى Wine. وجّه steamcmd نحو التطبيق واقرأ قائمة منصاته:

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

إذا كان تطبيق الخادم المخصص مجرد "oslist windows"، فلا يوجد بناء Linux أصلي تلجأ إليه. يمكنك أيضًا محاولة فرض تثبيت Linux؛ وعندما لا يوجد فعلًا مستودع Linux، يفشل فورًا:

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

هذا الخطأ، وعدم تنزيل أي ملف ELF، يؤكدان ذلك. الآن Wine هو الطريق. ثبّت الخادم والتطبيق 1007 (وهو Steamworks Common Redistributables) في المجلد نفسه، بنوع المنصة windows. يجلب التطبيق 1007 مكتبات DLL من Steam التي يحتاجها الخادم، وسترى السبب في الخطوة 2:

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

يحتاج الخادم أيضاً إلى بيئة تشغيل Microsoft Visual C++ 2019 داخل بادئة Wine. ثبّتها مرة واحدة باستخدام winetricks (تحتاج إلى شاشة، فغلّفها بـ xvfb-run):

WINEPREFIX=/wine xvfb-run -a winetricks -q vcrun2019
wineserver -w

لماذا تفشل المحاولة الساذجة مع Wine

تشغيل الخادم مباشرة من Wine يصطدم بحائطين متتاليين:

  • بلا وحدة تحكم: يتوقع الخادم طرفية حقيقية. إعادة التوجيه من /dev/null تعطي CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents ولا يبدأ أبدًا.
  • تعذّر تحميل مكتبة Steam: حتى بعد إقلاعه، يطبع "Unable to load Steam support library" ولا يسجّل نفسه أبدًا في Steam، فلا يستطيع أحد العثور عليه أو الدخول إليه.

لكلٍّ منهما إصلاح. إليك الوصفة الكاملة.

الخطوة 1: امنحه طرفية حقيقية (PTY)

الجهاز بلا شاشة لا يملك طرفية، وخادم وحدة التحكم في Windows يرفض العمل بدونها. يحتاج إلى طرفية زائفة (PTY) يبقى جانب إدخالها مفتوحاً، وهو ما يمنحك إياه docker run -it. النصيحة الشائعة هي تغليف التشغيل بـ script. على جهاز بلا طرفية، هذا هو الخلل بعينه: إدخال script نفسه يصل إلى نهاية الملف، وقراءة وحدة تحكم الخادم تراها أيضاً، فتتوقف حلقته الرئيسية. قد تُحمَّل الخريطة، لكن الخادم لا يرد أبداً على مقابسه. بدلاً من ذلك، شغّله من غلاف Python صغير يفتح PTY ولا يغلقه أبداً، واستخدم Xvfb لشاشة وهمية:

Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99 WINEPREFIX=/wine

cat > launch_pty.py <<'EOF'
import os, sys
cmd = ["wine", "srcds_console.exe", "-console", "-condebug",
       "-game", "<gamedir>", "+map", "<map>", "-port", "27015"]
pid, master = os.forkpty()
if pid == 0:
    os.execvp(cmd[0], cmd)
# Parent: never close master, so the server's input stays open.
# Copy the server output to our own stdout.
while True:
    try:
        data = os.read(master, 4096)
    except OSError:
        break
    if not data:
        break
    sys.stdout.buffer.write(data)
    sys.stdout.flush()
_, status = os.waitpid(pid, 0)
sys.exit(os.waitstatus_to_exitcode(status))
EOF
python3 launch_pty.py

هذا وحده يجعل الخادم يحمّل خريطة ويربط منفذ اللعبة الخاص به. لكنه لا يزال غير قادر على التحدث مع Steam.

الخطوة 2: مكتبتا DLL من Steam، من مصدرين مختلفين

يحتاج محرك Source إلى كلتيهما، steamclient.dll وsteam.dll، بجانب ملف exe الخادم، وهنا الفخ الذي كلّفنا جولة تصحيح كاملة إضافية: إنهما يأتيان من مكانين مختلفين، والتطبيق 1007 يمنحك واحدة منهما فقط.

  • steamclient.dll: تأتي من التطبيق 1007 (Steamworks Common Redistributables)، الذي ثبّتّه في الخطوة 1. أصلية، بإصدار متوافق، وتصونها Valve.
  • steam.dll: ليست في التطبيق 1007. إنها جزء من عميل (CLIENT) Steam، والطريقة النظيفة الوحيدة للحصول عليها هي تشغيل steamcmd.exe الخاص بـ Windows مرة واحدة تحت Wine، فيحدّث نفسه ويودع steam.dll (مع steamclient.dll) في مجلده الخاص.

إذًا ابدأ تشغيل steam.dll بواسطة steamcmd.exe تحت Wine، ثم انسخ كلتا مكتبتي DLL بجانب ملف exe الخادم:

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

الخطوة 3: لماذا steam.dll هي القطعة المهمة

هذا هو الجزء الذي لا يدوّنه أحد تقريبًا. يقول الخطأ "Unable to load Steam support library،" ومكتبة الدعم التي يشير إليها ليست steamclient.dll، بل steam.dll. يبحث محرك Source عن steam.dll بجانب الملف التنفيذي نفسه لبدء تشغيل سلسلة Steam بأكملها. وجود steamclient.dll وحده (وهو كل ما يمنحه لك التطبيق 1007) يظل يفشل؛ وفي اللحظة التي تصبح فيها steam.dll بجانب ملف الـ .exe، يتحول السجل من الفشل إلى النجاح:

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

لا يُفعَّل VAC ما لم يكن الخادم gameserver مسجّل الدخول بشكل صحيح، لذا فإن هذا السطر هو دليلك على أنه سجّل نفسه. معظم خوادم Source تسجّل الدخول بشكل مجهول هنا ولا تحتاج إلى أي Game Server Login Token (GSLT). قليل من الألعاب فقط (مثل CS2) تتطلب واحدًا.

الفخ: A2S يصمت

هذه هي المشكلة التي كلفتنا أكثر وقت. مع غلاف script، لم يرد الخادم على A2S_INFO، وهو استعلام UDP تستخدمه الأدوات لقراءة اسم الخادم وخريطته وعدد لاعبيه. انتهت مهلة كل استعلام، حتى من الجهاز نفسه، فبدا الخادم ميتاً تماماً. ألقينا اللوم أولاً على Wine. لكنها كانت الحلقة الرئيسية المتوقفة من الخطوة 1: الخادم لم يقرأ مقابسه إطلاقاً.

مع إبقاء الـ PTY مفتوحاً، يرد الخادم على A2S بشكل طبيعي ويستطيع اللاعبون الحقيقيون الانضمام. يبقى الاختبار النهائي اتصال عميل، لا الرد على استعلام. بمجرد أن صار الـ PTY صحيحاً، اتصل لاعب حقيقي ولعب:

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

الدرس العملي: إذا حمّل خادم مستضاف عبر Wine خريطته لكن A2S صامت، فلا تلُم Wine أولاً. تحقق من كيفية ربط وحدة التحكم. منفذ UDP مربوط ليس دليلاً على أن الخادم حي، لأن الخادم المتوقف يبقي منفذه مربوطاً بينما تتراكم الحزم دون قراءة.

هل يعمل هذا مع كل لعبة على Windows؟

لنكن صريحين بشأن النطاق. أثبتنا هذا على خادم بمحرك Source، والوصفة نفسها (PTY، وبيئة تشغيل مبنية بـ steamcmd، وsteam.dll بجانب الملف التنفيذي) يُفترض أن تعمل مع خوادم Source المخصصة الأخرى التي تعمل على Windows فقط. الألعاب على محركات أخرى تدمج Steam بطرق مختلفة، فتعامل معها كتجارب منفصلة. أمر واحد متوقع في الحالتين: الإقلاع أبطأ من Linux الأصلي (Wine إضافة إلى خطوة steamcmd وتسجيل الدخول إلى Steam).

أو تخطَّ كل هذا

هذا من نوع الأعمال الجانبية التي تلتهم فترة ما بعد الظهر. إذا كنت تريد الخادم فقط، فنحن نشغّل أسطول Linux وتجهيزات Wine لك، بالساعة، مع IP عام من الدقيقة الأولى. Alien Swarm: Reactive Drop ليست في صفحات التشغيل العامة لدينا بعد، لكن خوادم أخرى تعمل على Windows فقط موجودة، مثل Wreckfest وrFactor 2. اطّلع على كل ما نستضيفه على 2hours.gg.

انظر أيضًا

← العودة إلى جميع الأدلة