RE:NODE

Сервер Valheim падает при запуске: причины и решения

Автор Команда RE:NODE
12 мин чтения


Когда выделенный сервер Valheim умирает во время запуска, причина почти всегда одна из шести: не найдена библиотека Steam steamclient.so (только Linux), пароль нарушает одно из правил игры, файл мира повреждён, порт уже занят другим процессом, BepInEx падает до загрузки игры или процессу не хватает памяти при загрузке большого мира. Каждая оставляет в логе свой след, и любое исправление начинается с лога. Читайте его сверху, а не снизу: последние строки упавшего сервера - обычно завершение работы, а причина находится строк на двадцать выше.

В этом материале разобран каждый сбой, как он выглядит и как его исправить, а также как отличить сервер, который упал один раз, от застрявшего в цикле перезапусков. Предполагается, что сервер установлен через SteamCMD или хостинг-панель; если вы ещё только устанавливаете, руководство по установке через SteamCMD на Linux описывает чистую установку, исключающую большинство этих проблем.

Сначала прочитайте лог#

Сервер Valheim пишет в стандартный вывод, если не задан -logFile. Где искать:

Как запущен серверГде лог
Панель (Pterodactyl и похожие)Вкладка консоли в реальном времени; более ранний вывод - в просмотре логов сервера
Linux, вручнуюТерминал или файл, указанный в -logFile
Linux, служба systemdjournalctl -u valheim -n 300 (имя вашего юнита)
WindowsОкно консоли или путь из -logFile
С BepInExДополнительно BepInEx/LogOutput.log в папке сервера

Если окно консоли закрывается раньше, чем вы успеваете прочитать, добавьте -logFile с путём, чтобы вывод пережил падение. Затем читайте с первой строки. Здоровый запуск идёт примерно в таком порядке: инициализируется Unity, загружается API игровых серверов Steam, загружается или генерируется мир, сервер регистрируется, а на кроссплей-сервере появляется строка с кодом присоединения. Где эта последовательность обрывается, там и проблема.

Полезная привычка: скопируйте лог, прежде чем что-либо перезапускать. Во многих конфигурациях следующий запуск его перезаписывает, а вместе с ним пропадает и единственная улика. Как читать логи запуска в целом и что стоит сохранять, описано в статье логи игровых серверов.

Linux: steamclient.so и недостающие библиотеки#

Самый частый сбой запуска на самостоятельно установленном Linux-сервере - не инициализируется Steam API. В логе встречаются примерно такие строки:

code
dlopen failed trying to load:/home/steam/.steam/sdk64/steamclient.sowith error:/home/steam/.steam/sdk64/steamclient.so: cannot open shared object file[S_API] SteamAPI_Init(): Sys_LoadModule failed to load: ...

Точная формулировка зависит от версии, а некоторые из этих строк безвредны: загрузчик пробует несколько путей, и неудача на одном из них не страшна, если следующая строка сообщает, что библиотека загружена. Важно, продолжит ли сервер запуск. Если он останавливается, значит, пригодный steamclient.so найти не удалось.

Сервер поставляется со своей копией в linux64/, а стандартный start_server.sh перед запуском указывает загрузчику на неё. Главные строки этого скрипта:

start_server.sh
export templdpath=$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATHexport SteamAppId=892970./valheim_server.x86_64 -nographics -batchmode -name "Longship Crew" \    -port 2456 -world "Midgard" -password "herring-barrel-42" -public 1export LD_LIBRARY_PATH=$templdpath

Что это ломает:

  • Запуск бинарного файла напрямую. Если вызывать ./valheim_server.x86_64 из юнита systemd или собственного скрипта без LD_LIBRARY_PATH, исправление не сработает. Либо запускайте start_server.sh, либо задайте те же переменные в юните через Environment=.
  • Относительные пути из не той папки. ./linux64 - относительный путь. Если служба не задаёт рабочий каталог папкой сервера, поиск идёт не там. Укажите WorkingDirectory= в юните.
  • Нет `SteamAppId`. 892970 - это app ID игры (ID установки сервера - 896660). Без него Steam API может инициализироваться не для того приложения.
  • Копия в sdk64. Распространённый дополнительный шаг - создать ~/.steam/sdk64/ для пользователя, от которого работает сервер, и скопировать туда linux64/steamclient.so. Вреда нет, а в конфигурациях, где загрузчик настаивает именно на этом пути, помогает.

Недостающие системные библиотеки вызывают похожие ранние остановки. В Debian и Ubuntu в минимальном образе может не хватать библиотек, которые ожидает среда выполнения Unity. Обычно это libatomic1 и клиентская библиотека PulseAudio; установите их менеджером пакетов и повторите попытку. В строке лога указано имя недостающего .so - ищите в пакетах дистрибутива именно этот файл, а не гадайте.

Правила для пароля и названия#

Valheim отказывается запускать сервер, пароль которого нарушает правила, и делает это одной строкой, мгновенно пролетающей в логе. Правила:

  • Не меньше пяти символов.
  • Пароль не должен встречаться в названии сервера.
  • Пароль не должен встречаться в названии мира.

Сервер Bjorn's Hall с паролем bjorn остановится сразу. Так же поступит мир Asgard с паролем asgard1. Выберите пароль, в котором нет общих слов ни с тем, ни с другим. Если хотите запустить сервер совсем без пароля - например, скрытый через -public 0 в доверенной сети, - проверьте это на своей версии, а не полагайтесь на догадки: поведение пустых паролей различалось между версиями и конфигурациями, а длинный пароль ничего не стоит.

Важны и кавычки. Название с пробелами в командной строке нужно брать в кавычки, а пароль со знаками, которые оболочка трактует особо ($, !, обратные апострофы), на Linux нужно брать в одинарные кавычки. Ошибка с кавычками не всегда даёт сообщение: она может тихо превратить остаток строки в часть названия. Все аргументы и их правила перечислены в справочнике аргументов запуска Valheim.

Ошибки загрузки мира#

Если Steam инициализируется, а сервер останавливается при загрузке мира, подозревайте файл мира. Мир Valheim - это два файла в worlds_local: Name.fwl (название, seed, несколько сотен байт) и Name.db (всё остальное). Признаки повреждения мира:

  • Исключение при загрузке мира - EndOfStreamException и подобные - после которого сервер завершается.
  • Файл .db нулевого размера или намного меньше, чем вчера.
  • Файл .fwl нулевого размера; сервер вообще не может прочитать метаданные мира.

Почти всегда это следствие некорректной остановки во время сохранения: процесс убили, пропало питание или заполнился диск, пока писался мир. У игры есть прежние копии для восстановления: Name.db.old и Name.fwl.old от предыдущего сохранения, а также автоматические резервные копии вида Name_backup_auto-20261011120000.db в той же папке.

Восстановление по порядку:

  1. Остановите сервер. Скопируйте всю папку worlds_local в безопасное место, прежде чем что-либо трогать.
  2. Переименуйте повреждённый Name.db в сторону, затем скопируйте Name.db.old в Name.db. То же сделайте с .fwl, если повреждён он.
  3. Запустите сервер и проверьте в логе, что мир загрузился.
  4. Если и это не помогло, так же восстановите самую новую автоматическую копию или настоящую резервную копию, хранящуюся вне сервера.

Остальное по теме - флаги резервного копирования, что покрывают автоматические копии и что нет, и как правильно восстанавливать - относится к статье резервные копии Valheim и повреждение мира, поэтому здесь не повторяется.

Несовпадение названия мира, которое выглядит как сброс

Не каждая проблема с миром - это падение. Если -world не совпадает с именем файла в точности - с учётом регистра и без расширения, - сервер не падает, а создаёт новый мир под новым названием, и игроки попадают на пустую карту. Исходные файлы при этом на месте. Исправьте название и перезапустите.

Порт уже занят#

Два сервера Valheim не могут делить один игровой порт на одном адресе, и второй запущенный либо падает, либо ведёт себя странно. Причины:

  • Процесс-призрак. Предыдущий сервер не завершился, часто после закрытия терминала или неудачного перезапуска службы. Он по-прежнему держит порт.
  • Два сервера с одним и тем же `-port`. Каждому серверу на одной машине нужна своя пара - 2456, 2466, 2476 и так далее, с query-портом на единицу выше у каждой.
  • Что-то ещё в этом диапазоне. Бывает редко, но другое программное обеспечение может занимать UDP-порты из этого диапазона.

На Linux узнайте, кто держит порт:

bash
$ ss -ulpn | grep -E ':245[6-8]'$ pgrep -a valheim_server

Если старый valheim_server.x86_64 всё ещё работает, остановите его корректно - kill -INT <pid> просит его сохраниться и выйти - и переходите к kill -9 только если он не уходит. В Windows ID процесса показывает Диспетчер задач или netstat -ano с findstr 2456. Как разнести несколько серверов на одном IP, описано в статье порты Valheim 2456-2458.

На хостинг-панели такое случается редко, потому что каждый сервер - отдельный контейнер со своими выделенными портами.

BepInEx и preloader#

Сервер с модами добавляет этап, который выполняется до самой игры. Первым загружается инжектор Doorstop из BepInEx, затем preloader патчит игру, и только после этого стартуют Valheim и плагины. Сбой в этой цепочке останавливает сервер до появления какого-либо вывода Valheim или роняет его через несколько секунд исключением с именем мода.

Где обычно ломается:

  • Не тот стартовый скрипт. С BepInEx на Linux сервер нужно запускать из start_server_bepinex.sh. Запуск из start_server.sh даёт ванильный сервер: падения нет, но и модов нет, что приводит к другой путанице.
  • Скрипт не запускается. Permission denied означает, что он не исполняемый: chmod +x start_server_bepinex.sh. bad interpreter: /bin/bash^M значит, что файл сохранён с windows-окончаниями строк; преобразуйте его через dos2unix или заново распакуйте сборку.
  • Не хватает файлов. Папка doorstop_libs из сборки и, на Windows, winhttp.dll должны лежать в корне сервера рядом с бинарным файлом. Распаковка в подпапку - классическая ошибка.
  • Мод собран под другую версию. После патча игры моды, скомпилированные под старую версию, могут выбрасывать MissingMethodException или TypeLoadException при загрузке. Исключение называет плагин.
  • У мода нет зависимости. Большинству контентных модов нужен Jotunn или похожая библиотека; BepInEx пишет в лог, что плагин пропущен из-за отсутствующей зависимости.

Полная трассировка лежит в BepInEx/LogOutput.log. Быстрее всего найти плохой плагин делением пополам: уберите половину BepInEx/plugins, запустите и повторите с той половиной, на которой сбой остался. Патч ломает моды повсеместно; общий порядок действий описан в статье что делать, если обновление мода всё сломало, а сама установка BepInEx - в статье моды Valheim с BepInEx на сервере.

Остановка из-за нехватки памяти#

Большому миру нужна память уже при загрузке: сервер читает в память весь .db, и долго живущему миру с большими постройками и изменённым рельефом может потребоваться несколько гигабайт ещё до прихода первого игрока. Если лимит ниже, процесс убивает ядро, а не Valheim, и лог просто обрывается - часто посреди загрузки мира, без какой-либо ошибки от игры.

Признаки на вашей Linux-машине:

bash
$ dmesg -T | grep -i -E 'out of memory|killed process'$ journalctl -k | grep -i oom

Строка с именем valheim_server - это и есть ответ. Код выхода 137 от контейнера или менеджера служб означает то же самое: убит сигналом SIGKILL, почти всегда из-за памяти. Почему ядро выбирает именно этот процесс, объясняет статья swap в Linux и OOM killer.

Что делать, в порядке попыток:

  1. Выделите больше памяти. Как подобрать объём под размер группы и возраст мира, описано в статье сколько RAM нужно серверу Valheim.
  2. Уберите тяжёлые моды для проверки. Контентные моды добавляют префабы и занимают память; если мир загружается без модов и падает с модами, ответ найден.
  3. Проверьте неконтролируемый рост. Если .db внезапно разросся, настоящей проблемой может быть что-то в мире - предметы, оставленные фермой, или мод, порождающий объекты.

На RE:NODE сервер, достигший лимита памяти, останавливается и чисто перезапускается, а не уходит в swap, так что вы увидите перезапуск, а не сервер, еле ползущий по диску. Это также значит, что остановка из-за нехватки памяти - это убийство процесса, а не сохранение: всё, что произошло после последнего сохранения, теряется, и это ещё одна причина держать -saveinterval коротким на большом мире.

Когда сервер всё время перезапускается#

Одно падение - загадка; сервер, падающий при каждом запуске, - это цикл, и обращаться с ним нужно иначе. Каждая попытка перезаписывает лог, может затереть .old-копию мира чем-то худшим, а на хостинге может сработать защита. На RE:NODE наблюдатель за сбоями проверяет сервер каждые две минуты, и три незапрошенных перезапуска за час выводят предупреждение на странице сервера и автоматически открывают тикет; шесть приостанавливают сервер до разбирательства. Перезапуски, которые вы запросили сами, не считаются.

Поэтому, если сервер ходит по кругу:

  1. Остановите его. Не давайте ему продолжать попытки.
  2. Скопируйте с сервера лог и папку worlds_local.
  3. Измените что-то одно - уберите плагины, восстановите .old-мир, добавьте память - и запустите один раз.

Общая методика описана в статьях почему ваш игровой сервер всё время перезапускается и циклы сбоев игровых серверов; специфичные для Valheim причины перечислены выше.

Другие сбои запуска#

Несколько более редких случаев, кратко:

  • Нет `-nographics -batchmode`. Без них безголовый Linux-сервер может попытаться открыть дисплей и остановиться. Оба аргумента должны быть в каждой строке запуска выделенного сервера.
  • Недокачанное обновление. Обновление, прерванное на середине загрузки, оставляет несогласованные файлы. Для исправления выполните steamcmd +force_install_dir <dir> +login anonymous +app_update 896660 validate +quit.
  • Права доступа. Папка сервера, скопированная от root и запущенная от другого пользователя, не может записать мир или лог. Выполните chown -R для папки на пользователя, от которого работает сервер.
  • `-savedir` указывает в никуда. Путь, которого нет или в который нельзя писать, останавливает сохранения, а в некоторых конфигурациях и запуск. Значения по умолчанию описаны в статье savedir Valheim и расположение файлов.

FAQ#

Почему мой сервер Valheim закрывается сразу после запуска без ошибки?

Обычно потому, что ошибка есть, но она пролетела мимо: классический случай - правило о пароле. Запустите с -logFile, указывающим на файл, и прочитайте его с начала. Если лог действительно обрывается на середине строки, процесс убили снаружи, чаще всего из-за памяти.

Всегда ли ошибка steamclient.so фатальна?

Нет. Загрузчик пробует несколько мест и пишет об ошибке для каждого, которое не подошло. Если следующая строка сообщает, что библиотека загружена, а сервер идёт дальше к загрузке мира, игнорируйте её. Она важна, только если сервер останавливается сразу после неё.

Может ли мод помешать запуску ванильного сервера?

Только если в цепочке есть BepInEx. Ванильный Valheim папку BepInEx полностью игнорирует. Запуск ванильным скриптом - быстрый способ проверить, виноваты ли моды.

Мир не загружается. Потеряю ли я прогресс, если восстановлю .old?

Вы потеряете то, что произошло между двумя последними сохранениями - при интервале по умолчанию до тридцати минут. Это обычно намного меньше, чем при восстановлении суточной копии, поэтому сначала пробуйте пару .old.

Сколько свободного места на диске нужно серверу Valheim?

Достаточно для мира в несколько раз большего размера: рабочий .db, его .old-копия и автоматические копии лежат рядом. Для большинства миров комфортно иметь несколько гигабайт свободного места сверх размера установки.