Выделенный сервер только под Windows обычно можно запустить на Linux под Wine, и рецепт короткий: скачайте Windows-сборку через SteamCMD с принудительной платформой Windows, создайте 64-битный префикс Wine, установите среду выполнения Visual C++, с которой слинкован сервер, добавьте виртуальный дисплей, если он его требует, и запустите .exe через wine. Серверам без графики с Wine гораздо проще, чем игровым клиентам, потому что им не нужны ни графика, ни звук, а от Windows - совсем немного. Для многих survival-серверов это работает хорошо - Enshrouded, V Rising, Abiotic Factor, Sons of the Forest и другие часто запускают именно так, - а для некоторых плохо, и знаменитый трудный случай здесь - Space Engineers. В статье - настройка, альтернатива в виде Proton и ошибки, на которые приходится почти каждая неудачная попытка.
Если вы ещё решаете, нужно ли вам всё это, загляните в статью Linux или Windows для игровых серверов - там перечислено, у каких серверов есть сборка под Linux. Если нативная сборка есть, используйте её; Wine - для случаев, когда её нет.
Что на самом деле делает Wine#
Wine - не эмулятор и не виртуальная машина. Это повторная реализация Windows API на Linux: когда программа для Windows вызывает CreateFileW или открывает сокет через Winsock, вызов обрабатывают собственные библиотеки Wine и переводят его в эквивалент для Linux. Машинный код программы процессор выполняет напрямую, поэтому потери производительности невелики.
Выделенный сервер - хороший кандидат, потому что он использует узкий срез Windows: файлы, потоки, сокеты, консоль и среду выполнения C++. Те части Wine, из-за которых бывают проблемы с играми, - трансляция DirectX, звук, контроллеры, драйверы античита - здесь почти не задействованы. Когда серверы всё же не запускаются, причина обычно одна из четырёх: не хватает DLL среды выполнения, есть зависимость от .NET Framework, сервер требует дисплей, даже если ничего на нём не рисует, или серверный компонент античита хочет настоящую Windows.
Proton - это дистрибутив Wine от Valve с дополнительными патчами и библиотеками для игр Steam. Для серверов это альтернативная сборка того же самого: иногда совместимее, иногда наоборот. Начните с обычного Wine и переходите на Proton (на практике - на community-сборки GE-Proton), если известно, что конкретному серверу он нужен.
Установка Wine и сервера#
Пакеты из дистрибутива работают, но часто отстают на несколько релизов. Игровым серверам, вышедшим за последние год-два, иногда нужен более свежий Wine, чем есть в стабильном дистрибутиве, поэтому обычно используют репозиторий WineHQ:
$ sudo dpkg --add-architecture i386$ sudo mkdir -pm755 /etc/apt/keyrings$ sudo wget -O /etc/apt/keyrings/winehq-archive.key \ https://dl.winehq.org/wine-builds/winehq.key$ sudo wget -NP /etc/apt/sources.list.d/ \ https://dl.winehq.org/wine-builds/ubuntu/dists/noble/winehq-noble.sources$ sudo apt update$ sudo apt install --install-recommends winehq-stable$ sudo apt install winetricks xvfb cabextractЗамените noble на кодовое имя своего релиза (WineHQ публикует файл источников для каждого поддерживаемого релиза Debian и Ubuntu). winehq-stable - консервативный выбор; в winehq-staging есть патчи, ещё не попавшие в stable, и иногда именно он нужен только что вышедшему серверу. Проверьте, что установилось, командой wine --version.
Всё, что дальше, выполняйте от того же непривилегированного пользователя, которому принадлежат файлы сервера. Префикс Wine, созданный от root, а потом используемый другим пользователем, - верный способ потратить час на ошибки прав доступа.
Загрузка Windows-сборки через SteamCMD
SteamCMD на Linux по умолчанию запрашивает у Steam депо для Linux. Для сервера только под Windows такой запрос либо падает с Invalid Platform, либо не скачивает ничего полезного. Задайте платформу принудительно до входа:
$ ./steamcmd.sh +@sSteamCmdForcePlatformType windows \ +force_install_dir /srv/enshrouded \ +login anonymous \ +app_update 2278520 validate +quitНастройка @sSteamCmdForcePlatformType windows действует до конца сессии, поэтому ставьте её первой. Если тем же SteamCMD вы ставите и нативные Linux-серверы, держите это в отдельном скрипте, чтобы случайно не скачать для них Windows-сборки. App ID серверов для распространённых игр только под Windows есть в статье App ID и beta-ветки SteamCMD.
Префикс Wine#
Префикс - это папка с одной поддельной установкой Windows: drive_c, реестр, установленные среды выполнения. Если не указано иное, Wine использует ~/.wine. Дайте каждому серверу свой префикс, чтобы среда выполнения, установленная для одного, не могла сломать другой:
$ export WINEPREFIX=/srv/enshrouded/.wine$ export WINEARCH=win64$ export WINEDEBUG=-all$ export WINEDLLOVERRIDES="mscoree,mshtml="$ wineboot --initЧто делает каждая переменная:
| Переменная | Значение | Зачем |
|---|---|---|
WINEPREFIX | отдельная папка на каждый сервер | Изолирует реестр и среды выполнения |
WINEARCH | win64 | 64-битный префикс; задаётся только при создании |
WINEDEBUG | -all | Убирает отладочный вывод самого Wine из лога |
WINEDLLOVERRIDES | mscoree,mshtml= | Пропускает запросы на установку Mono и Gecko при первом запуске |
WINEARCH важен только при создании. Префикс, созданный 32-битным, остаётся 32-битным, и 64-битный сервер, запущенный в нём, падает с ошибкой о том, что исполняемый файл не удаётся загрузить или найти. Если вы её видите, удалите префикс и создайте его заново с заданным WINEARCH=win64.
WINEDEBUG=-all стоит пояснить. Без него Wine печатает строки fixme: для каждой функции Windows, которую он реализует лишь частично. Они почти всегда безвредны, но заваливают собственный вывод сервера, и люди гоняются за ними часами. Отключите их по умолчанию и включайте обратно (WINEDEBUG=err+all - разумная середина) только при отладке самого Wine.
Среды выполнения: Visual C++ и .NET#
Большинство серверов на Unreal и Unity собраны инструментарием Visual C++ от Microsoft и нуждаются в его DLL - vcruntime140.dll, msvcp140.dll и других. У Wine есть собственные замены для некоторых из них, которые подходят многим программам, но не всем. Если сервер при запуске падает из-за отсутствующей или неработающей DLL из этого семейства, установите в префикс настоящую среду выполнения:
$ WINEPREFIX=/srv/enshrouded/.wine winetricks -q vcrun2022vcrun2022 устанавливает актуальный объединённый пакет 2015-2022; в старых версиях winetricks он называется vcrun2019. Если такого verb нет, обновите сам winetricks - копия в репозитории дистрибутива часто старая, и это исправляет winetricks --self-update или установка из релиза проекта на GitHub.
С .NET Framework сложнее. Сервер, которому он нужен (Space Engineers требует .NET Framework 4.8), хочет winetricks -q dotnet48, а это долго, иногда обрывается на полпути и даёт префикс, чувствительный к смене версии Wine. Если серверу нужен .NET Framework, прежде чем собирать своё, поищите поддерживаемый community-контейнер или эгг для этой конкретной игры; обычно кто-то уже нашёл работающее сочетание версии Wine и сред выполнения.
Виртуальный дисплей и запуск сервера#
Некоторые Windows-серверы создают окно даже в «headless»-режиме, а чтобы его создать, Wine нужен X-дисплей. Без него вы получите ошибки о невозможности открыть дисплей, или процесс сразу завершится. Xvfb - виртуальный X-сервер, который рисует в память, а xvfb-run запускает его на время выполнения команды:
$ cd /srv/enshrouded$ xvfb-run --auto-servernum --server-args="-screen 0 640x480x24" \ wine enshrouded_server.exeСначала попробуйте без xvfb-run. Многим серверам он не нужен, а это на одну движущуюся часть меньше. Добавьте его, если сервер не запускается без дисплея.
V Rising - типичный пример с аргументами:
$ cd /srv/vrising$ xvfb-run --auto-servernum wine VRisingServer.exe \ -persistentDataPath ./save-data -logFile ./logs/VRisingServer.logСобственная конфигурация сервера работает ровно так же, как на Windows: файлы JSON или ini читает Windows-программа, которая не знает, что она на Linux. Пути внутри этих конфигов можно писать в форме Windows (C:\..., что соответствует drive_c в префиксе), через диск Z: от Wine (он соответствует корню Linux, так что Z:\srv\vrising - это /srv/vrising) или относительными. Относительные пути запутывают меньше всего. Файлы JSON и ini, которые используют эти серверы, разобраны в статье о форматах конфигов игровых серверов.
Особой настройки портов не нужно. Вызовы Winsock в Wine превращаются в обычные сокеты Linux, так что сервер слушает порты из своего конфига, и действуют обычные правила firewall - см. статью о портах игровых серверов.
Запуск как службы
На своей машине unit systemd держит сервер запущенным после выхода из системы и стартует его при загрузке. Переменные окружения прописываются в unit, чтобы каждый запуск использовал один и тот же префикс:
[Unit]Description=Enshrouded server (Wine)After=network-online.target[Service]User=steamWorkingDirectory=/srv/enshroudedEnvironment=WINEPREFIX=/srv/enshrouded/.wine WINEDEBUG=-allExecStart=/usr/bin/wine enshrouded_server.exeKillSignal=SIGINTTimeoutStopSec=60Restart=on-failure[Install]WantedBy=multi-user.targetKillSignal=SIGINT запрашивает самую мягкую остановку, которую может послать systemd, а TimeoutStopSec даёт серверу минуту на сохранение, прежде чем его убьют. Сохраняется ли игра под Wine по этому сигналу на самом деле - отдельный вопрос, он разобран ниже в разделе о корректной остановке. Остальное в unit-файле объясняется в статье о службах systemd для ваших приложений.
Запуск через Proton#
Если известно, что серверу нужен Proton, скачайте релиз GE-Proton, распакуйте его и запускайте сервер через его скрипт proton. Proton ожидает две переменные окружения, которые обычно задаёт Steam:
$ export STEAM_COMPAT_CLIENT_INSTALL_PATH=/home/steam/steamcmd$ export STEAM_COMPAT_DATA_PATH=/srv/abiotic/proton-data$ mkdir -p "$STEAM_COMPAT_DATA_PATH"$ /opt/GE-Proton/proton run AbioticFactor/Binaries/Win64/AbioticFactorServer-Win64-Shipping.exe \ -log -PORT=7777 -QueryPort=27015STEAM_COMPAT_DATA_PATH - место, где Proton хранит свой префикс (внутри он создаёт pfx), то есть это аналог WINEPREFIX. Путь установки клиента должен просто существовать; обычно его направляют на папку SteamCMD. При первом запуске Proton сам выполняет wineboot, поэтому первый старт медленный.
Компромисс такой: Proton включает исправления, которые иначе пришлось бы ставить через winetricks, но это более крупная движущаяся часть, его версии привязаны к графику релизов GE, а отлаживать его - значит отлаживать Wine с дополнительными слоями сверху. Для большинства серверов обычный Wine проще.
Корректная остановка, сохранения и панель#
Это самый важный раздел, когда сервер уже работает, потому что именно здесь теряются миры.
В Linux остановка - это сигнал. Нативный Linux-сервер получает SIGINT или SIGTERM, сохраняется и завершается. Windows-программа под Wine вместо этого получает транслированное консольное событие, и реагирует ли она так же, как на Ctrl+C в Windows, зависит от программы. Одни корректно сохраняются и выходят. Другие игнорируют его, пока их не убьют. Третьи сразу завершаются без сохранения.
Проверьте это, прежде чем доверять:
- Запустите сервер и сделайте в мире изменение, которое вы узнаете.
- Остановите его так, как это делает ваша панель или менеджер служб.
- Запустите снова и посмотрите, сохранилось ли изменение.
Если нет, отправляйте собственную команду сохранения игры перед каждой остановкой - у большинства этих серверов она есть в RCON или консоли - и уменьшите интервал автосохранения, чтобы kill стоил минут, а не получаса. Компромиссы этого интервала разобраны в статье об интервалах автосохранения игровых серверов.
На панели Pterodactyl игры только под Windows обычно так и работают под капотом: эгг использует образ с Wine, скрипт установки скачивает Windows-сборку, а строка запуска оборачивает .exe в wine. Community-образы для этого публикуются в ghcr.io/parkervcp/yolks с тегами Wine, хотя имена тегов и содержимое со временем меняются. Эгг также задаёт команду остановки, и поэтому одна и та же кнопка Stop для одной игры под Wine сохраняет корректно, а для другой - нет. Где это настраивается, описано в статье об эггах Pterodactyl для игровых серверов.
В RE:NODE такие игры, как Sons of the Forest, The Forest и Abiotic Factor, устанавливаются и запускаются из панели без того, чтобы вы вообще касались Wine, а на каждом тарифе есть слоты для backup и вкладка Schedules, так что команда сохранения и следом backup могут выполняться по таймеру, что бы игра ни делала с сигналом остановки.
Память и производительность под Wine#
Цена реальная, но умеренная. Рассчитывайте на несколько сотен мегабайт памяти сверх того, что тот же сервер использовал бы на Windows, - в основном это процесс wineserver и загруженные библиотеки. Накладные расходы на CPU обычно малы, потому что код программы выполняется нативно, а через трансляцию проходят только системные вызовы. Первый запуск медленнее, пока Wine готовит префикс, а Proton ещё и компилирует свои компоненты; следующие запуски обычные.
Две вещи делают производительность хуже, чем должна быть:
- Отладочный вывод. Если на болтливом сервере не задать
WINEDEBUG, он может писать в лог тысячи строкfixme:в минуту, тратя диск и немного CPU. - Старый Wine. Новые релизы Wine регулярно улучшают работу с потоками и файловый ввод-вывод. Если сервер под Wine подтормаживает, а у тех, кто хостит на Windows, работает гладко, попробуйте более свежую stable- или staging-сборку, прежде чем настраивать игру.
Ошибки и что они значат#
| Ошибка | Причина | Решение |
|---|---|---|
Invalid Platform от SteamCMD | Запрошено депо для Linux | Первым аргументом +@sSteamCmdForcePlatformType windows |
Library VCRUNTIME140.dll ... not found | Нет среды выполнения VC++ | winetricks -q vcrun2022 |
wine: Bad EXE format for ... | 32-битный префикс, 64-битный сервер | Пересоздайте префикс с WINEARCH=win64 |
cannot open display / no X server | Серверу нужно окно | Запускайте под xvfb-run |
| Зависание при первом запуске, запрос Mono или Gecko | Wine ждёт установщик | WINEDLLOVERRIDES="mscoree,mshtml=" |
wineserver: ... lock или зависший старт | Ещё работает предыдущий wineserver | wineserver -k с тем же WINEPREFIX |
| Вылеты после обновления игры | Новой сборке нужен более свежий Wine | Обновите Wine, затем попробуйте staging |
| Мир откатывается после рестарта | Остановка не сохраняет | Команда сохранения перед остановкой, автосохранение чаще |
Две привычки заметно сокращают отладку. Читайте собственный лог сервера, а не вывод Wine, потому что полезная ошибка обычно исходит от игры. А когда сервер, работавший вчера, сегодня падает, спросите себя, что изменилось - обновление игры, обновление Wine или префикс, который кто-то трогал, - прежде чем что-то переустанавливать. Статья о чтении консоли применима здесь ровно так же, как к нативным серверам.
FAQ#
Не нарушает ли запуск сервера под Wine условия игры?
Как правило, нет. Вы запускаете собственный серверный бинарник разработчика; Wine лишь предоставляет слой операционной системы. Чего вы не получаете, так это поддержки разработчика, поэтому сообщайте о багах, только воспроизведя их на Windows.
Wine или Proton - что выбрать для игрового сервера?
Начните с Wine из репозитория WineHQ и сред выполнения, которые нужны серверу. Переходите на GE-Proton, когда известно, что конкретный сервер работает с ним лучше, или когда Wine падает так, что более новая сборка не помогает.
Работает ли Wine с серверами, где есть античит?
Зависит от того, что запускается на сервере. Серверные компоненты, которым нужна только обычная сеть, часто работают. Всё, что ожидает драйвер ядра или глубокую интеграцию с Windows, не работает, а некоторые игры вообще отказываются запускать античит под Wine.
Можно ли использовать один префикс Wine для нескольких серверов?
Можно, но не стоит. Изменение среды выполнения или реестра для одного сервера может сломать другой, а удаление сломанного префикса всегда должно затрагивать только одну игру. Префиксы дешёвые - дайте каждому серверу свой.
Почему мой сервер под Wine потребляет больше памяти, чем указано в требованиях?
Требования написаны для Windows. Wine добавляет свой серверный процесс и библиотеки, обычно на несколько сотен мегабайт. Подбирайте тариф с этим запасом, особенно для игр, которые и так работают у самого предела памяти.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.