Gameserver mit SteamCMD installieren

Veröffentlicht am 14 Min. Lesezeit

SteamCMD ist der gemeinsame Unterbau fast aller Gameserver auf Steam. Diese Anleitung zeigt Installation, anonymen Login, app_update mit validate, Betrieb als systemd-Dienst und die typischen Fehlerbilder.

Wer einen Gameserver auf einem eigenen Rootserver betreibt, landet fast immer beim selben Werkzeug: SteamCMD. Ob Valheim, Rust, Counter-Strike 2, Palworld, Enshrouded oder ARK, die Serverdateien liegen bei Valve und werden über denselben Kommandozeilen-Client geladen. Wer SteamCMD einmal sauber aufgesetzt hat, installiert jedes weitere Spiel mit einer geänderten Zahl.

Diese Anleitung deckt genau die Stellen ab, an denen kürzere Tutorials aufhören: die 32-Bit-Bibliotheken auf 64-Bit-Systemen, die Unterschiede zwischen Debian, Ubuntu und der Red-Hat-Familie, die Fehlermeldungen im Wortlaut, ein Update-Verfahren das den Server nicht bei jedem Cronlauf neu startet, und der Betrieb als systemd-Dienst.

Was SteamCMD ist und was es nicht ist

SteamCMD ist der Steam Console Client, eine abgespeckte Kommandozeilenfassung des Steam-Clients ohne Oberfläche. Er kann genau eine Sache gut: Anwendungen aus dem Steam-Netz herunterladen, aktualisieren und deren Dateien prüfen. Er startet keinen Server, er konfiguriert nichts und er kennt die Spiellogik nicht. Nach dem Download landen die Serverdateien in einem Verzeichnis, danach ist das jeweilige Spiel dran.

Wichtig für das Verständnis der ganzen Bibliotheks-Thematik: Der Bootstrapper von SteamCMD ist bis heute ein 32-Bit-Programm. Auf einem reinen 64-Bit-System fehlen ihm die passenden Laufzeitbibliotheken, und genau daran scheitert der erste Start bei den meisten Leuten. Die heruntergeladenen Serverdateien selbst sind bei modernen Spielen fast immer 64-Bit.

Vorbereitung: eigener Benutzer statt root

Gameserver-Prozesse laufen niemals als root. Sie nehmen Verbindungen aus dem Internet an, laden bei vielen Titeln Mods aus dem Steam Workshop nach und führen fremden Code aus. Ein eigener, unprivilegierter Benutzer kostet drei Befehle und begrenzt den Schaden.

useradd -m -d /home/steam -s /bin/bash steam
mkdir -p /home/steam/steamcmd
chown -R steam:steam /home/steam/steamcmd

SteamCMD warnt beim Start als root ausdrücklich davor. Wer die Warnung ignoriert, bekommt das Problem später zurück: Sobald ein Verzeichnis einmal root gehört, scheitert der spätere Lauf als steam mit einem Schreibfehler, und die Fehlermeldung deutet nicht auf die Ursache hin.

Alle folgenden Befehle in diesem Artikel werden als root eingegeben und wechseln per runuser -u steam -- in den Dienstbenutzer. Auf Systemen mit sudo funktioniert genauso sudo -u steam. Wer sich vorher noch um die Grundabsicherung kümmern will, findet die Basis unter Neuen Rootserver einrichten und SSH absichern.

Die 32-Bit-Bibliotheken, je nach System verschieden

Hier trennen sich die Distributionen, und pauschale Befehlslisten aus dem Netz sind hier regelmäßig falsch.

Debian 12, Debian 13, Ubuntu 22.04 und Ubuntu 24.04

Auf allen vier Systemen reicht das Paket lib32gcc-s1 aus dem Hauptarchiv. Es ist ein amd64-Paket, das die 32-Bit-Laufzeit mitbringt, und es braucht keine zusätzliche i386-Architektur:

apt update
apt install -y ca-certificates curl tar file lib32gcc-s1 lib32stdc++6

lib32stdc++6 ist für SteamCMD selbst nicht immer nötig, aber etliche ältere Serverbinaries (alles auf Source-Engine-Basis, HLDS-Titel, einige Unity-Server) verlangen es. Es gleich mitzuinstallieren spart eine spätere Fehlersuche. file steckt in keinem der Minimalabbilder und wird weiter unten für die Fehlersuche gebraucht, deshalb steht es gleich mit in der Liste.

AlmaLinux 9, Rocky Linux 9, RHEL 9 und Oracle Linux 9

Dort heißen die Pakete anders und tragen das Suffix .i686:

dnf -y update
dnf install -y --allowerasing glibc.i686 libstdc++.i686 tar file curl

Beide Zusätze sind auf einer frischen Minimalinstallation nötig, sonst bricht der Befehl ab. Der Grund für --allowerasing: EL9 bringt curl-minimal mit, und das volle curl kollidiert damit. Ohne den Schalter endet der Aufruf auf AlmaLinux 9 und Rocky Linux 9 mit package curl-minimal ... conflicts with curl provided by curl ... conflicting requests. Wer curl ganz aus der Liste streicht, kommt ebenfalls ans Ziel, denn curl-minimal liefert /usr/bin/curl bereits mit. Der Grund für das vorgeschaltete dnf -y update: Ist der Systemstand älter als die Repositories, kollidiert das frische i686-Paket mit dem installierten 64-Bit-Paket, auf Rocky Linux 9 gemessen als file /usr/share/gcc-11/python/libstdcxx/v6/printers.py from install of libstdc++-11.5.0-14.el9.i686 conflicts with file from package libstdc++-11.4.1-2.1.el9.x86_64. Auf Oracle Linux 9 tritt keiner der beiden Konflikte auf, dort ist bereits das vollständige curl installiert.

EPEL wird nicht gebraucht, die Pakete liegen in den Standard-Repositories. Wer zusätzlich Werkzeuge wie htop möchte, findet den Weg dorthin unter htop auf AlmaLinux, Rocky und RHEL installieren.

AlmaLinux 10, Rocky Linux 10 und RHEL 10 sind für SteamCMD ungeeignet

Das ist kein Konfigurationsproblem, sondern eine Sackgasse: RHEL 10 und die davon abgeleiteten Distributionen haben die 32-Bit-x86-Architektur vollständig gestrichen. Es gibt dort in keinem Repository i686-Pakete, auch nicht mit --enablerepo=*, der Installationsbefehl endet mit No match for argument: glibc.i686. Da steamcmd.sh immer den 32-Bit-Bootstrapper linux32/steamcmd aufruft, lässt sich das nicht umgehen. Für einen Gameserver auf der Red-Hat-Seite ist deshalb die EL9-Familie zu wählen, also AlmaLinux 9, Rocky Linux 9 oder Oracle Linux 9.

Ein zweiter Stolperstein sehr schlanker EL-Installationen: Ist nur util-linux-core installiert, fehlt runuser, das in dieser Anleitung durchgehend benutzt wird. Dann vorher dnf install -y util-linux ausführen. Auf AlmaLinux 9, Rocky Linux 9, Oracle Linux 9 sowie auf allen Debian- und Ubuntu-Systemen ist runuser bereits vorhanden.

Warum nicht einfach das Paket steamcmd?

Ubuntu führt steamcmd in der Komponente multiverse, Debian in non-free, und in beiden Fällen ist das Paket ausschließlich für die Architektur i386 gebaut. Auf einem frisch installierten 64-Bit-Server läuft man deshalb zuverlässig in:

E: Unable to locate package steamcmd

Damit es überhaupt ein Kandidat wird, müssten erst die Komponente freigeschaltet und die Fremdarchitektur aktiviert werden. Auf Ubuntu ist multiverse in der Standardinstallation bereits aktiv, dort genügen die drei Zeilen:

dpkg --add-architecture i386
apt update
apt-cache policy steamcmd

Auf Debian fehlt zusätzlich die Komponente. Ohne sie liefert apt-cache policy steamcmd überhaupt keine Ausgabe, also nicht einmal eine Fehlermeldung. Vorher müssen contrib und non-free in die Paketquellen, seit Debian 12 üblicherweise in /etc/apt/sources.list.d/debian.sources in der Zeile Components:. Erst danach greift die Abfrage und meldet auf Debian 12 den Kandidaten 0~20180105-5 aus bookworm/non-free i386. Das apt update zwischen Architekturschalter und Abfrage ist zwingend, ohne den Lauf existieren die i386-Paketlisten nicht und der Kandidat bleibt (none).

Der Aufwand lohnt selten. Das Debian-Paket ist ein sehr alter Wrapper (Version 0~20180105-5 in Debian 13), der ohnehin nur denselben Bootstrapper herunterlädt, den man in zwei Zeilen selbst holt. Die manuelle Installation ist auf allen Systemen identisch und damit besser dokumentierbar.

SteamCMD installieren und den ersten Start deuten

runuser -u steam -- curl -sSLo /home/steam/steamcmd/steamcmd_linux.tar.gz https://media.steampowered.com/client/installer/steamcmd_linux.tar.gz
runuser -u steam -- tar -xzf /home/steam/steamcmd/steamcmd_linux.tar.gz -C /home/steam/steamcmd
runuser -u steam -- /home/steam/steamcmd/steamcmd.sh +quit

Der dritte Befehl ist der eigentliche Test. Beim allerersten Aufruf lädt SteamCMD sich selbst nach, zeigt eine Fortschrittsanzeige und beendet sich. Das sieht so aus:

[  0%] Checking for available update...
[----] Downloading update (0 of 58,393 KB)...
[100%] Download complete.
[----] Extracting package...
[----] Installing update...
[----] Verifying installation...
Steam Console Client (c) Valve Corporation - version 1751...
Loading Steam API...OK

Erfolgskriterium: Die letzte Zeile lautet Loading Steam API...OK. Erscheint stattdessen Loading Steam API...FAILED oder der Prozess bricht sofort ab, fehlen die 32-Bit-Bibliotheken aus dem vorigen Abschnitt. Der typische Wortlaut dazu ist:

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

Diese Meldung ist irreführend, denn die Datei existiert sehr wohl. Nicht gefunden wird der 32-Bit-Interpreter, den das Binary braucht. Prüfen lässt sich das mit file /home/steam/steamcmd/linux32/steamcmd, die Ausgabe lautet ELF 32-bit LSB shared object, Intel 80386, ... interpreter /lib/ld-linux.so.2 und nennt damit genau den fehlenden Interpreter. Fehlt file selbst mit command not found, wurde es im Installationsschritt oben vergessen. Die Variante error while loading shared libraries: libstdc++.so.6 zeigt dasselbe Problem, nur eine Ebene später.

Anonymer Login gegen Konto-Login

Die allermeisten dedizierten Server sind als eigene, kostenlose Steam-Anwendung veröffentlicht und lassen sich ohne Zugangsdaten laden:

+login anonymous

Das ist der Normalfall und der Weg, den man immer zuerst versuchen sollte. Kein Passwort auf dem Server, kein Steam Guard, keine gesperrten Konten nach einem Serverumzug.

Ein Konto-Login ist nur dann nötig, wenn der Serverbuild an den Besitz des Spiels gekoppelt ist. Erkennbar ist das an dieser Meldung:

ERROR! Failed to install app 'ID' (No subscription)

No subscription heißt immer: Dieses Konto darf diese App nicht laden. Bei anonymem Login bedeutet es, dass ein echtes Konto mit gekauftem Spiel nötig ist. Bei einem echten Konto bedeutet es, dass die Lizenz fehlt oder die falsche App-ID verwendet wurde.

Der Konto-Login läuft interaktiv, weil Steam Guard einen Code verlangt:

/home/steam/steamcmd/steamcmd.sh +login meinbenutzername

Nach der einmaligen Bestätigung liegt ein Sentry-File unter ~/.steam, danach funktionieren auch nicht interaktive Aufrufe. Drei Punkte dazu, die in der Praxis wehtun: Hinterlegen Sie für diesen Zweck ein separates Steam-Konto, das nur die Serverlizenz hält. Schreiben Sie das Passwort niemals in ein Cron-Skript. Und rechnen Sie damit, dass Steam nach längerer Inaktivität oder einem IP-Wechsel erneut nach einer Bestätigung fragt, wodurch ein automatisches Update stillschweigend hängen bleibt.

Getrennt davon ist der Game Server Login Token (GSLT) zu sehen. Er hat mit dem Download nichts zu tun, sondern damit, ob der laufende Server öffentlich in der Serverliste erscheint. Bei Counter-Strike 2 und anderen Valve-Titeln wird er im Steam-Konto erzeugt und in der Serverkonfiguration eingetragen, nicht in SteamCMD.

Ein Spiel installieren: Reihenfolge, validate und Branches

SteamCMD arbeitet die +-Argumente strikt von links nach rechts ab. Daraus folgt die wichtigste Regel überhaupt:

+force_install_dir muss vor +app_update stehen. Steht es dahinter, landen die Dateien im Standardpfad und das angegebene Verzeichnis bleibt leer.

Ein vollständiger Aufruf, hier am Beispiel des Valheim-Servers mit der App-ID 896660:

runuser -u steam -- mkdir -p /home/steam/valheim
runuser -u steam -- /home/steam/steamcmd/steamcmd.sh +force_install_dir /home/steam/valheim +login anonymous +app_update 896660 validate +quit

Beachten Sie, dass validate ohne Pluszeichen geschrieben wird, es ist ein Argument von app_update und kein eigener Befehl. validate vergleicht jede Datei mit der Prüfsumme aus dem Depot und lädt Abweichungen neu. Sinnvoll ist das bei der Erstinstallation, nach einem abgebrochenen Download und bei merkwürdigen Abstürzen. Bei jedem Routineupdate ist es überflüssig und teuer, weil der komplette Bestand gelesen wird. Zwei Nebenwirkungen sollte man kennen: Selbst geänderte Dateien, die zum Depot gehören, werden zurückgesetzt, und bei Spielen mit Mods im Installationsverzeichnis kann validate Fremddateien entfernen.

Als Erfolgskontrolle dient die Schlusszeile:

Success! App '896660' fully installed.

Ein anderer Branch, etwa ein öffentlicher Testzweig, wird direkt an app_update gehängt:

+app_update 896660 -beta public-test validate

Für einen passwortgeschützten Zweig kommt -betapassword dazu. Der Rückweg auf die Standardversion ist -beta none, ein schlichtes Weglassen des Parameters genügt nicht, weil die Branchwahl im Manifest gespeichert bleibt.

Wenn es schiefgeht: die Fehlermeldungen im Wortlaut

SteamCMD meldet Probleme als Hex-Status, der ohne Übersetzung nichts sagt. Die häufigsten:

  • Error! App '...' state is 0x202 after update job: Nicht genug Speicherplatz. Prüfen Sie mit df -h /home/steam. Denken Sie daran, dass SteamCMD zusätzlich zum Zielverzeichnis Platz für den Download-Zwischenspeicher braucht, in der Regel im selben Dateisystem unter steamapps/downloading. Bei großen Titeln kann der Spitzenbedarf während des Updates fast das Doppelte der Endgröße betragen. Wenn die Platte voll ist, hilft Festplatte voll unter Linux aufräumen.
  • Error! App '...' state is 0x606 after update job: Schreibfehler. In neun von zehn Fällen sind es Rechte, nicht die Hardware. Klassiker: Der erste Lauf erfolgte als root, der zweite als steam. Reparatur mit chown -R steam:steam /home/steam. Bei symbolischen Links auf ein zweites Laufwerk muss auch das Ziel dem Dienstbenutzer gehören.
  • Error! App '...' state is 0x402 after update job: Keine brauchbare Verbindung zu den Steam-Inhaltsservern. Meist eine ausgehende Firewallregel oder ein Nameserverproblem. SteamCMD braucht ausgehend TCP 443 sowie 27015 bis 27050.
  • No subscription: Lizenzthema, siehe voriger Abschnitt.
  • Failed to load steamclient.so oder [S_API FAIL] SteamAPI_Init(): Das Serverbinary sucht die Steam-Bibliothek an einer festen Stelle, die SteamCMD nicht befüllt. Betroffen sind praktisch alle Unreal-Engine-Server sowie Rust, Palworld und V Rising. Die Lösung sind zwei Verweise im Heimatverzeichnis des Dienstbenutzers.
runuser -u steam -- mkdir -p /home/steam/.steam/sdk64
runuser -u steam -- ln -sf /home/steam/steamcmd/linux64/steamclient.so /home/steam/.steam/sdk64/steamclient.so
runuser -u steam -- mkdir -p /home/steam/.steam/sdk32
runuser -u steam -- ln -sf /home/steam/steamcmd/linux32/steamclient.so /home/steam/.steam/sdk32/steamclient.so

Da es Verweise auf das SteamCMD-Verzeichnis sind, bleiben sie nach einem Selbstupdate von SteamCMD gültig. Ein häufiger Folgefehler ist das Anlegen dieser Verzeichnisse als root, wodurch der Dienst sie später nicht lesen kann.

Wenn ein Download dauerhaft klemmt, ist der letzte Hebel das Löschen von steamapps/appmanifest_<ID>.acf im Installationsverzeichnis. Danach hält SteamCMD die App für nicht installiert und lädt sie vollständig neu.

Updates automatisieren, ohne den Server sinnlos neu zu starten

Die verbreitete Empfehlung lautet, einmal täglich per Cron app_update laufen zu lassen und den Dienst neu zu starten. Das kostet jeden Tag eine Unterbrechung, auch wenn es gar kein Update gibt. Besser ist ein Vergleich der Build-ID. Die installierte steht in der Manifestdatei, die aktuelle liefert app_info_print:

runuser -u steam -- /home/steam/steamcmd/steamcmd.sh +login anonymous +app_info_update 1 +app_info_print 896660 +quit

Daraus wird ein Skript unter /usr/local/sbin/steam-update.sh:

#!/bin/bash
set -euo pipefail
APPID=896660
DIR=/home/steam/valheim
CMD=/home/steam/steamcmd/steamcmd.sh
UNIT=valheim

MANIFEST="$DIR/steamapps/appmanifest_${APPID}.acf"
installed=$(awk '/"buildid"/ {gsub(/"/,"",$2); print $2; exit}' "$MANIFEST" 2>/dev/null || echo 0)
latest=$(runuser -u steam -- "$CMD" +login anonymous +app_info_update 1 +app_info_print "$APPID" +quit \
  | awk '/"public"/{f=1} f && /"buildid"/ {gsub(/"/,"",$2); print $2; exit}')

if [ -z "$latest" ]; then
  echo "Konnte aktuelle Build-ID nicht ermitteln, breche ab."
  exit 1
fi

if [ "$installed" = "$latest" ]; then
  echo "Aktuell (Build $installed), kein Neustart."
  exit 0
fi

echo "Update von $installed auf $latest"
systemctl stop "$UNIT"
runuser -u steam -- "$CMD" +force_install_dir "$DIR" +login anonymous +app_update "$APPID" +quit
systemctl start "$UNIT"

Das Skript startet nur dann neu, wenn sich wirklich etwas geändert hat, und bricht sauber ab, wenn Steam gerade nicht antwortet. Ohne diese Prüfung würde ein leeres Abfrageergebnis als Update gedeutet und der Server grundlos gestoppt. Ausgeführt wird es per Cron oder besser per systemd-Timer, die Grundlagen dazu stehen unter Cronjob unter Linux einrichten.

Beachten Sie, dass viele Spiele nach einem Serverupdate auch aktualisierte Clients verlangen. Ein automatisches Update mitten in der Hauptspielzeit wirft alle Spieler heraus. Legen Sie den Lauf auf die frühen Morgenstunden.

Als systemd-Dienst betreiben

Ein Gameserver in einer screen-Sitzung überlebt keinen Neustart. Eine Unit unter /etc/systemd/system/valheim.service löst das:

[Unit]
Description=Valheim Dedicated Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam/valheim
Environment=LD_LIBRARY_PATH=/home/steam/valheim/linux64
Environment=SteamAppId=892970
ExecStart=/home/steam/valheim/valheim_server.x86_64 -nographics -batchmode -name "KernelHost" -port 2456 -world "Dedicated" -password "bitteAendern"
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=90
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now valheim
systemctl status valheim

Zwei Zeilen daran sind wichtiger, als sie aussehen. KillSignal=SIGINT sorgt dafür, dass der Server beim Stoppen speichert, denn etliche Spieleserver ignorieren SIGTERM und verlieren bei einem harten Abschuss den Spielstand der letzten Minuten. TimeoutStopSec gibt ihm dafür Zeit. Eine ausführliche Erklärung aller Felder finden Sie unter systemd-Service erstellen, das Vorgehen im Fall eines Java-Servers unter Minecraft-Server automatisch starten.

Falls der Server beim Start sofort wegen fehlendem Arbeitsspeicher stirbt, hilft ein Blick auf Swap einrichten. Die Ports gehören anschließend in die Firewall, siehe UFW einrichten, wobei Spieleserver fast immer UDP brauchen und ein reiner TCP-Eintrag typischerweise der Grund ist, warum der Server läuft aber niemand verbinden kann.

App-IDs der gängigen Spiele

Die ID ist die einzige Stelle, die sich zwischen den Spielen ändert. Anonym ladbar sind unter anderem:

  • 232250 Team Fortress 2
  • 4020 Garry's Mod
  • 222860 Left 4 Dead 2
  • 730 Counter-Strike 2 (Client und Server sind seit dem Wechsel von CS:GO dieselbe App, entsprechend groß ist der Download)
  • 258550 Rust
  • 376030 ARK: Survival Evolved
  • 896660 Valheim
  • 2394010 Palworld
  • 2278520 Enshrouded
  • 1829350 V Rising
  • 294420 7 Days to Die
  • 380870 Project Zomboid
  • 1690800 Satisfactory
  • 581330 Insurgency: Sandstorm
  • 233780 Arma 3
  • 1007 Steamworks SDK Redistributables, winzig und deshalb ideal als Funktionstest der Installation

Verwechseln Sie die Server-App nicht mit der Spiele-App. Bei ARK etwa ist 346110 das Spiel und 376030 der Server. Wer eine ID sucht, findet sie in der Dedicated Servers List im Valve Developer Wiki oder über SteamDB. Der schnelle Test ist immer derselbe: anonymer app_update, und wenn No subscription kommt, war es die Client-ID.

Woran Sie erkennen, dass es wirklich läuft

Vier Prüfungen, in dieser Reihenfolge:

  1. Dateien vorhanden. du -sh /home/steam/valheim muss eine plausible Größe zeigen, und in steamapps/appmanifest_896660.acf steht eine buildid. Ein Verzeichnis mit wenigen Megabyte bedeutet abgebrochener Download.
  2. Prozess lebt länger als eine Minute. systemctl status valheim zeigt active (running). Ein Dienst, der im Sekundentakt neu startet, steht auf activating (auto-restart), dann liefert journalctl -u valheim -n 50 den Grund.
  3. Port ist offen und zwar als UDP. ss -ulpn | grep 2456 muss den Prozess nennen. Nichts zu sehen heißt: Der Server ist noch in der Initialisierung oder an die falsche Adresse gebunden.
  4. Von außen erreichbar. Erst danach die Firewall prüfen und aus dem Spiel heraus verbinden. Viele Titel brauchen zusätzlich einen Query-Port, bei Valheim ist das der Serverport plus eins.

Wenn diese vier Punkte stimmen, ist der Unterbau in Ordnung und alles weitere ist Spielkonfiguration. Auf einem KernelHost-Rootserver im Rechenzentrum maincubes in Frankfurt am Main kommt der DDoS-Schutz aus dem eigenen Netz dazu, was gerade bei öffentlich gelisteten Gameservern relevant ist, weil eine öffentliche Serverliste die IP-Adresse für jeden sichtbar macht. Hintergründe dazu finden Sie unter Server vor DDoS-Angriffen schützen.

Häufige Fragen

Warum startet SteamCMD auf meinem 64-Bit-Server nicht?
Der Bootstrapper von SteamCMD ist ein 32-Bit-Programm. Ohne die passende Laufzeit meldet er sinngemäß "linux32/steamcmd: No such file or directory", obwohl die Datei existiert. Auf Debian und Ubuntu behebt das "apt install lib32gcc-s1 lib32stdc++6", auf AlmaLinux 9, Rocky Linux 9 und Oracle Linux 9 "dnf -y update" gefolgt von "dnf install --allowerasing glibc.i686 libstdc++.i686". Eine zusätzliche i386-Architektur ist auf Debian und Ubuntu nicht nötig. Auf der EL10-Familie (AlmaLinux 10 und verwandte) gibt es überhaupt keine i686-Pakete mehr, dort lässt sich SteamCMD nicht betreiben.
Brauche ich ein Steam-Konto für einen Gameserver?
In den meisten Fällen nicht. Dedizierte Server sind eigene, kostenlose Steam-Anwendungen und lassen sich mit "+login anonymous" laden. Ein echtes Konto ist nur nötig, wenn SteamCMD beim Download "No subscription" meldet. Davon zu unterscheiden ist der Game Server Login Token, der nichts mit dem Download zu tun hat, sondern darüber entscheidet, ob der laufende Server in der öffentlichen Serverliste erscheint.
Was bedeutet "App state is 0x606 after update job"?
Das ist ein Schreibfehler, der fast immer von falschen Dateirechten kommt und nicht von einem Plattendefekt. Typische Ursache ist ein erster Lauf als root und ein zweiter als Dienstbenutzer. "chown -R steam:steam /home/steam" räumt das auf. Der verwandte Status 0x202 steht dagegen für zu wenig freien Speicherplatz, dort hilft nur Aufräumen oder mehr Platz.
Soll ich validate bei jedem Update mitgeben?
Nein. Bei der Erstinstallation, nach einem abgebrochenen Download und bei unerklärlichen Abstürzen ist validate richtig. Im Routinebetrieb liest es bei jedem Lauf den gesamten Datenbestand und kostet unnötig Zeit und I/O. Außerdem setzt es selbst geänderte Dateien zurück und kann bei manchen Spielen Mods aus dem Installationsverzeichnis entfernen.
Wie aktualisiere ich automatisch, ohne den Server täglich neu zu starten?
Vergleichen Sie die Build-ID. Die installierte steht in steamapps/appmanifest_<ID>.acf, die aktuelle liefert "+app_info_update 1 +app_info_print <ID>". Nur wenn beide Werte auseinanderlaufen, wird der Dienst gestoppt, aktualisiert und wieder gestartet. Wichtig ist ein Abbruch, wenn die Abfrage kein Ergebnis liefert, sonst stoppt das Skript den Server bei einer Steam-Störung ohne Grund.
Warum findet apt das Paket steamcmd nicht?
Weil es bei Ubuntu in multiverse und bei Debian in non-free liegt und ausschließlich für die Architektur i386 gebaut ist. Ohne freigeschaltete Komponente und ohne "dpkg --add-architecture i386" erscheint "E: Unable to locate package steamcmd". Da das Paket ohnehin nur denselben Bootstrapper nachlädt, ist die manuelle Installation über das Tarball-Archiv der einfachere und auf allen Distributionen gleiche Weg.

SteamCMD Gameserver Linux Debian Ubuntu systemd Valheim Counter-Strike 2 Rootserver