RE:NODE

Ошибки SteamCMD и их исправление: справочник для админов

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


Большинство сбоев SteamCMD сводится к пяти причинам: логин не владеет приложением, на диске нет места, у пользователя нет прав на запись в папку, сеть оборвалась посреди загрузки или кэшированные данные Steam о приложении устарели. Текст ошибки называет одну из этих причин, но обычно так, что поиск уходит в сторону. На этой странице разобраны сообщения, которые люди чаще всего ищут: что каждое означает и что стоит пробовать, в каком порядке. Предполагается, что базовая строка установки вам уже знакома. Если нет, в статье SteamCMD explained рассказано про app id, анонимный вход, validate, бета-ветки и скрипты обновления. Здесь речь о том, что делать, когда эта строка не срабатывает.

Как читать сбой SteamCMD#

Неудачный app_update заканчивается строкой одного из двух видов, и говорят они о разном.

code
ERROR! Failed to install app '896660' (Disk write failure)Error! App '896660' state is 0x202 after update job.

Строка первого вида содержит причину в скобках. Эта причина приходит из системы доставки контента самого клиента Steam и ближе всего к настоящему диагнозу. Строка второго вида лишь сообщает, в каком состоянии осталось приложение, в виде набора флагов в шестнадцатеричной записи. Она говорит, что обновление остановилось, но не почему. Оба вида разобраны ниже.

Прежде чем что-то менять, выясните три вещи:

  1. Весь вывод, а не последнюю строку. Прокрутите вверх. Тихо провалившийся логин или предупреждение о каталоге установки часто находятся за пятьдесят строк до ошибки, которую все цитируют.
  2. Свободное место и inode на томе, куда идёт установка. На Linux это df -h /srv/valheim и df -i /srv/valheim. Заполненная таблица inode даёт ту же ошибку, что и полный диск, хотя df -h показывает много свободного места.
  3. Кто владелец каталога установки и от чьего имени запущен SteamCMD. ls -ld /srv/valheim и whoami. Если они различаются, вы, скорее всего, нашли проблему.

У SteamCMD есть и собственные логи в его каталоге Steam: на Linux обычно ~/Steam/logs/, на Windows - папка logs рядом с steamcmd.exe. Файл content_log.txt в этой папке записывает каждое задание обновления подробнее, чем консоль, в том числе какой именно файл не удалось записать. Точные пути зависят от способа установки SteamCMD (пакет из дистрибутива кладёт всё в другой домашний каталог, чем архив tarball), поэтому, если файла нет на привычном месте, поищите его.

Одна настройка меняет то, что вы увидите. В скрипте, запущенном через +runscript, строка @ShutdownOnFailedCommand 1 заставляет SteamCMD остановиться на первой же ошибке. Без неё после неудачного app_update выполняется quit, процесс завершается, а обёртка, которая проверяет только код возврата, сообщает об успехе. Если об ошибках узнаёте не вы, а игроки, начните с этого. Привычка искать в выводе Success! App 'X' fully installed. объяснена в основной статье про SteamCMD, а чтение консоли учит в целом отличать причину от шума.

Missing configuration#

code
ERROR! Failed to install app '90' (Missing configuration)

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

  • Устаревший кэш информации о приложениях. SteamCMD хранит кэшированные метаданные каждого приложения в папке appcache внутри своего каталога. Когда этот кэш расходится с тем, что Steam публикует сейчас, установка проваливается ещё до начала загрузки.
  • Неверный app id. Указан id игры там, где нужен id серверной утилиты, или опечатка, попавшая на постороннее приложение.
  • Логин без доступа к этой конфигурации. Приложение может сообщить именно это, а не No subscription, если логин не видит его конфигурацию.
  • Платформа без депо. Некоторые приложения сообщают о missing configuration, а не Invalid platform, когда для вашей операционной системы просто нет сборки.
  • Временный сбой на стороне Steam. Такое бывает, и повтор через десять минут срабатывает.

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

  1. Запустите ту же команду ещё раз. Это не суеверие: первый запуск, обновивший кэш информации о приложении, часто успешно проходит со второй попытки.
  2. Сверьте app id с id серверной утилиты, а не игры. Сервер Valheim - 896660, игра - 892970, и устанавливается только первый.
  3. Остановите SteamCMD и удалите его папку appcache (не steamapps и не ваш каталог установки). При следующем запуске она будет создана заново.
  4. Попробуйте принудительно указать платформу, если приложение выпускается только для другой ОС - см. ниже.
  5. Если нужна учётная запись-владелец, войдите под ней.
bash
$ cd ~/steamcmd$ rm -rf appcache$ ./steamcmd.sh +force_install_dir /srv/hlds +login anonymous \    +app_update 90 validate +quit

Особый случай: Half-Life Dedicated Server

Приложение 90 - старый сервер GoldSrc, который используют Counter-Strike 1.6 и другие моды Half-Life, - знаменито этой ошибкой. Оно годами работает нестабильно, а давнее обходное решение сообщества - указать SteamCMD нужный мод через app_set_config и несколько раз подряд выполнить app_update 90 validate, пока не появится сообщение об успехе:

bash
$ ./steamcmd.sh +force_install_dir /srv/cs16 +login anonymous \    +app_set_config 90 mod cstrike \    +app_update 90 validate +app_update 90 validate +quit

Поведение со временем менялось и зависит от мода, так что считайте это тем, что стоит попробовать, а не гарантией. Если вам нужен просто работающий сервер CS 1.6, готовая установка проще, чем борьба с приложением 90: руководство по серверу Counter-Strike 1.6 рассказывает, что нужно серверу, когда файлы уже на месте.

Invalid platform

code
ERROR! Failed to install app '556450' (Invalid platform)

Здесь всё однозначно: у приложения нет сборки для операционной системы, на которой работает SteamCMD. Типичный пример - выделенный сервер The Forest, который выходит только в виде бинарного файла для Windows. На Linux можно всё равно скачать сборку для Windows и запускать её под Wine:

install-forest.txt
@ShutdownOnFailedCommand 1@sSteamCmdForcePlatformType windowsforce_install_dir /srv/theforestlogin anonymousapp_update 556450 validatequit

Настройка должна стоять до app_update и действует до конца этого запуска. Запуск Windows-сервера на Linux - отдельное решение со своими издержками; в статье Linux vs Windows game servers перечислено, каким играм это нужно.

No subscription#

code
ERROR! Failed to install app '223350' (No subscription)

Яснее, чем кажется: у вошедшей учётной записи нет лицензии на это приложение. К этому ведут три пути.

  • Анонимный вход для приложения, которое его не принимает. Чаще всего это DayZ (223350), Arma 3 (233780) и сервер Project Zomboid. Нужна учётная запись Steam, владеющая игрой.
  • Правильная учётная запись, не то приложение. Учётная запись владеет игрой, но устанавливает то, на что у неё нет лицензии, - часто из-за неверно набранного id.
  • Логин, который на самом деле не состоялся. Если шаг login не удался, каждая следующая команда выполняется от имени никого, а приложение, которому нужен владелец, сообщает No subscription. Прокрутите вывод вверх и найдите строку входа, оканчивающуюся на OK.

Исправление - войти под учётной записью, владеющей игрой: в первый раз интерактивно, чтобы пройти Steam Guard, а затем использовать её же в скриптах. Заведите запасную учётную запись, в которой нет ничего, кроме этой игры: сервер - неподходящее место для данных той учётной записи, которой вы платите за покупки.

На RE:NODE игры, которым нужен ваш собственный вход в Steam, - среди них Arma 3, DayZ, Project Zomboid и 7 Days to Die - создаются сразу, а затем ждут на вкладке Setup, пока вы не введёте учётные данные. Они хранятся в том виде, в каком введены, поэтому совет про запасную учётную запись справедлив и здесь.

Disk write failure и Missing file permissions#

code
ERROR! Failed to install app '896660' (Disk write failure)ERROR! Failed to install app '896660' (Missing file permissions)

Это два разных сообщения о пересекающихся проблемах, и проблема с правами может проявиться в любом из них. Проверьте четыре вещи в таком порядке:

ПроверкаКоманда или местоЧто исправляет
Свободное местоdf -h <dir>Освободите на 20-30% больше размера установки
Свободные inodedf -i <dir>Удалите мелкие файлы, старые логи
Владелецls -ld <dir>chown -R на пользователя SteamCMD
Монтирование только для чтенияmount, лог ядраПочините файловую систему, затем validate

Место - самая частая причина, и она менее очевидна, чем кажется. SteamCMD складывает скачанные фрагменты на том же томе перед фиксацией, поэтому обновлению нужно место для изменённых файлов сверх существующей установки. Диск с 2 ГБ свободного места может не справиться с обновлением на 1,5 ГБ. Обычно его занимают старый контент Workshop, дампы падений и ротированные логи; в статье что делать, когда диск заполнен есть список для очистки.

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

bash
$ sudo chown -R steam:steam /srv/valheim /home/steam/steamcmd$ sudo -u steam /home/steam/steamcmd/steamcmd.sh \    +force_install_dir /srv/valheim +login anonymous \    +app_update 896660 validate +quit

После этого больше никогда не запускайте его от root. Права доступа и владельцы файлов разбирают общий случай, включая серверы, которые пишут файлы от другого пользователя, не того, что их устанавливает.

На Windows обычные причины - каталог установки в C:\Program Files без повышенных прав, файл, заблокированный запущенным сервером, и антивирус, отправляющий в карантин только что записанный исполняемый файл посреди обновления. Остановите сервер перед обновлением, устанавливайте вне Program Files и исключите каталог установки из проверки в реальном времени, если сбои всегда приходятся на файлы .exe и .dll.

Коды состояния: 0x202, 0x402, 0x602 и другие#

code
Error! App '740' state is 0x602 after update job.

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

ФлагЗначение
0x2Требуется обновление
0x4Установлено полностью
0x200Обновление приостановлено
0x400Обновление начато

Читайте коды по этой таблице:

  • `0x202` = требуется обновление плюс обновление приостановлено. Задание остановилось, а приложению обновление всё ещё нужно. На практике это в подавляющем большинстве случаев нехватка места на диске; прежде всего проверьте df -h.
  • `0x402` = требуется обновление плюс обновление начато. Задание началось и не завершилось. Обычная причина - обрывы сети и таймауты.
  • `0x602` = требуется, приостановлено и начато. Обновление пошло, а потом остановилось. Это общее состояние "что-то пошло не так посреди обновления": место на диске, права, оборвавшееся соединение или убитый процесс.
  • `0x6` = требуется обновление установленного приложения, при этом обновление не идёт. Обычно видно, когда задание так и не успело начаться, - ищите в выводе выше сбой логина или получения информации о приложении.

Ни один из этих кодов не содержит причины. Поэтому три проверки в начале этой страницы - место, владелец, сеть - это ответ на все из них, и поэтому стоит открыть content_log.txt, когда очевидные проверки ничего не дали.

Те же флаги хранятся в манифесте приложения в виде десятичного числа. Откройте steamapps/appmanifest_<appid>.acf в каталоге установки и найдите StateFlags. У здоровой установки там "StateFlags" "4". Любое другое значение означает, что SteamCMD считает установку незавершённой, и правильный ход - следующий app_update с validate.

Строки прогресса во время загрузки используют другой набор кодов, что путает тех, кто их ищет:

code
 Update state (0x5) verifying install, progress: 12.40 (512 / 4130) Update state (0x61) downloading, progress: 45.22 (1868 / 4130) Update state (0x101) committing, progress: 98.10 (4052 / 4130)

Это фазы, а не ошибки. Читать нужно слово после кода. Строка прогресса, которая минутами стоит на одном числе во время downloading, - проблема пропускной способности сети или диска; во время committing или verifying на медленном диске это часто просто медленно, а прерывание такого процесса и приводит к 0x602.

Таймауты, сбои соединения и ошибки входа#

Сетевые проблемы проявляются в нескольких различимых формах.

SteamCMD не может обновить сам себя. При первом запуске или после долгого перерыва загрузчик сначала проверяет собственное обновление. Если он не может достучаться до серверов контента Steam, он останавливается на этом шаге с сообщением вроде Steam needs to be online to update. Проверьте разрешение DNS на хосте, исходящий HTTP и HTTPS через любой файрвол и прокси, если ваша сеть его требует. Частый виновник - хост с неработающей маршрутизацией IPv6 при рабочем IPv4.

Вход зависает или не удаётся. Строка входа заканчивается на OK или FAILED с причиной. Вот те, что вам встретятся:

code
Logging in user 'spareaccount' to Steam Public...FAILED (Invalid Password)Logging in user 'spareaccount' to Steam Public...FAILED (Rate Limit Exceeded)Logging in user 'spareaccount' to Steam Public...FAILED (Two-factor code mismatch)

Invalid Password означает именно то, что написано, но проверьте, не съела ли оболочка спецсимвол, если вы передавали пароль в командной строке. Rate Limit Exceeded означает слишком много попыток за короткое время; единственное исправление - остановиться и подождать, а каждая повторная попытка отодвигает окно дальше. Two-factor code mismatch значит, что код Steam Guard был неверным или просроченным, а это бывает и тогда, когда часы хоста ушли вперёд или назад. Один интерактивный вход вручную, подтверждение и кэширование учётных данных в SteamCMD - способ, которым автоматические запуски избегают всех трёх ошибок.

Загрузки, которые завершаются по таймауту. Большие обновления приложений иногда зависают, а загрузки Workshop истекают по таймауту гораздо чаще:

code
ERROR! Timeout downloading item 463939057

Крупным элементам Workshop на медленном канале обычно нужно две-три попытки. Повторите загрузку того же элемента, прежде чем предполагать, что что-то не так. Если один и тот же элемент не скачивается каждый раз, удалите steamapps/workshop/appworkshop_<gameappid>.acf и папку этого элемента, затем скачайте его заново. Другое сообщение, ERROR! Download item 463939057 failed (Failure)., чаще означает, что элемент приватный, удалён или требует логина владельца. Сторона Workshop подробно разобрана в статье моды Steam Workshop на выделенных серверах.

Linux: 32-битные библиотеки и steamclient.so#

SteamCMD на Linux - 32-битная программа. В свежей 64-битной системе без поддержки 32-битных пакетов сбой сбивает с толку, потому что файл, на который он жалуется, явно существует:

code
steamcmd.sh: line 38: /home/steam/steamcmd/linux32/steamcmd: No such file or directory

"No such file" здесь относится к 32-битному загрузчику, который нужен бинарному файлу, а не к самому бинарному файлу. Другая частая форма называет библиотеку:

code
linux32/steamcmd: error while loading shared libraries: libstdc++.so.6:cannot open shared object file: No such file or directory

Обе исправляются одинаково:

bash
# Debian and Ubuntu$ sudo dpkg --add-architecture i386$ sudo apt update$ sudo apt install lib32gcc-s1      # lib32gcc1 on older releases$ sudo apt install lib32stdc++6     # if libstdc++.so.6 is still missing# RHEL, Rocky, AlmaLinux$ sudo dnf install glibc.i686 libstdc++.i686

Названия пакетов меняются между релизами дистрибутивов, поэтому руководства расходятся. Если apt не находит lib32gcc-s1, у вас более старый релиз, где он называется lib32gcc1.

Связанная проблема возникает после успешной установки, когда стартует игровой сервер, а не SteamCMD:

code
[S_API FAIL] SteamAPI_Init() failed; unable to locate a running instanceof Steam, or a local steamclient.so.

Игровой сервер ищет steamclient.so в ~/.steam/sdk64/ (или sdk32 для 32-битного сервера) и не находит. SteamCMD поставляет эту библиотеку в своих папках linux64 и linux32. Стандартное исправление - сделать ссылку на неё в нужном месте:

bash
$ mkdir -p ~/.steam/sdk64$ ln -sf ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.so

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

Сообщения, которые можно игнорировать#

SteamCMD очень шумный, и несколько строк при каждом запуске выглядят как ошибки, ничего не означая. Знание их экономит вечер:

  • Redirecting stderr to '.../logs/stderr.txt' - информационное сообщение.
  • ILocalize::AddFile() failed to load file "public/steambootstrapper_english.txt". - выводится при первых запусках, безвредно.
  • dlmopen steamservice.so failed: steamservice.so: cannot open shared object file - SteamCMD он не нужен; выводится при каждом запуске на Linux.
  • Unable to determine CPU Frequency. Try defining CPU_MHZ. - косметическое, часто встречается в контейнерах и виртуальных машинах.
  • Please use force_install_dir before logon! - тут игнорировать нельзя. Текущие сборки предупреждают, когда force_install_dir стоит после login, и установка может пойти не туда, куда вы хотели. Поставьте его первым.

Практическое правило: если запуск заканчивается строкой Success! App 'X' fully installed. или Success! App 'X' already up to date., строки выше были шумом.

Когда validate помогает, а когда нет#

validate пересчитывает хеши всех файлов установки по манифесту Steam и заменяет те, что не совпадают. Он исправляет:

  • установку, оставшуюся недописанной из-за полного диска, убитого процесса или оборвавшегося соединения, - семейство 0x602;
  • сервер, который падает при запуске сразу после "успешного" обновления;
  • файлы, повреждённые на диске.

Он не исправляет:

  • ничего из списка выше про логины, лицензии, платформы и app id - он выполняется после того, как эти проверки пройдены;
  • диск, который всё ещё полон, или каталог, в который пользователь по-прежнему не может писать;
  • сломанный мод, плагин или файл конфигурации, которые вы добавили, поскольку их нет в манифесте. Для этого используйте что делать, когда обновление мода всё ломает;
  • несовпадение версий с клиентами. Это вопрос ветки, он разобран в статье закрепление версий и откаты.

Помните также, что он возвращает любой файл, поставлявшийся с приложением, в том числе стартовый скрипт или конфигурацию по умолчанию, которые вы правили на месте. Храните копию.

Если сам validate раз за разом не справляется с одним и тем же приложением, последнее средство перед чистой переустановкой - удалить steamapps/appmanifest_<appid>.acf в каталоге установки и запустить обновление снова. Тогда у SteamCMD нет записи об установке, и он скачивает всё заново, сохраняя файлы, не входящие в приложение. Сначала сделайте резервную копию сохранений.

На хостинге на основе контейнеров нужно назвать ещё одну причину. Если сервер упирается в лимит памяти во время установки или обновления, контейнер останавливается, а не уходит в swap, - на RE:NODE он чисто перезапускается, - и остаётся недописанная установка с состоянием вроде 0x602. Повторное обновление с validate её чинит. Если это повторяется, тариф слишком мал для шага установки этой игры; как это определить, объясняет статья почему ваш игровой сервер постоянно перезапускается. Консоль панели показывает вывод SteamCMD строка в строку и строит графики использования диска относительно лимита тарифа, чего обычно хватает, чтобы понять, какая из причин выше ваша; где это найти, показывает руководство по консоли.

FAQ#

Missing configuration - это проблема моего сервера?

Обычно нет. Это значит, что SteamCMD не смог получить от Steam пригодную конфигурацию приложения - чаще всего из-за устаревшего кэша информации о приложениях, неверного app id или временного сбоя. Повторите один раз, убедитесь, что id принадлежит выделенному серверу, а не игре, затем удалите папку appcache в каталоге SteamCMD и запустите снова.

Что значит "state is 0x202 after update job"?

Обновление остановилось, пока приложению оно всё ещё нужно: флаг 0x2 - это "требуется обновление", а 0x200 - "обновление приостановлено". На практике это почти всегда диск, на котором кончилось место во время загрузки. Освободите место на томе установки, оставьте запас 20-30% и запустите обновление с validate.

Почему SteamCMD пишет "No subscription", если сервер бесплатный?

Потому что серверная утилита для этой игры недоступна бесплатно для анонимных входов. DayZ, Arma 3 и Project Zomboid требуют учётную запись Steam, владеющую игрой. То же сообщение появляется, если вход тихо не удался раньше в выводе, поэтому проверьте, что строка входа закончилась на OK.

Стоит ли запускать SteamCMD от root, чтобы избавиться от ошибок прав?

Нет. Это лишь заставит следующее обновление упасть, потому что записанные файлы принадлежат root, а пользователь службы не может их заменить. Запускайте SteamCMD от того же обычного пользователя, под которым работает сервер, один раз выполните chown каталога установки на этого пользователя, и ошибки прав прекратятся.

Можно ли безопасно удалить папку appcache SteamCMD?

Да. Это кэш метаданных приложений, который SteamCMD пересоздаёт при следующем запуске, в нём нет ни файлов игры, ни сохранений, ни учётных данных. Не путайте её с steamapps внутри каталога установки, где лежат манифест приложения и записи Workshop.

Как исправить SteamCMD на свежей 64-битной установке Linux?

Включите 32-битные пакеты и установите 32-битную среду выполнения C и C++: на Debian и Ubuntu это dpkg --add-architecture i386, затем apt install lib32gcc-s1 (или lib32gcc1 на старых релизах) и lib32stdc++6, если жалобы остаются. В системах семейства RHEL - glibc.i686 и libstdc++.i686.