Romania XPlayZM.CSBlackDevil.COM # Zombie Plague UltimateX [ Respawn + FDL + VIP 22-12PM + POINTS] ® 31/32
Unknown ❤ RESPAWN.ZAFEST.RO | VIP FREE | FREE FOR ALL ❤ 0/32
France EMIRATES.KiNGS 亗 GAMEAREA ||͇̿P͇̿U͇̿B͇̿L͇̿I͇̿C͇̿| ✪ 32/32
Promote server
59 lines 5.6 KiB Markdown Source Rendered Raw Permalink History
---
title: "How to Install SteamCMD on Linux for HLDS"
excerpt: "Install SteamCMD on Linux and use app_update 90 to download a CS 1.6 dedicated server, including the 32-bit libraries people forget."
category: "installation"
tags: "steamcmd, linux"
image: ""
read_time: "8 min read"
---
<p>SteamCMD is Valve's command-line content downloader &mdash; the tool you use to install and update a Half-Life Dedicated Server (HLDS) and CS 1.6, which is Steam app <strong>90</strong>. It runs anonymously (no Steam login needed for HLDS) and is the foundation under every CS 1.6 install method, including panels and LinuxGSM. This guide installs SteamCMD on a Linux box and uses it to pull down CS 1.6.</p>
<h2>1. Create a non-root user</h2>
<p>Never run SteamCMD or a game server as root. Create a service account:</p>
<pre>sudo adduser steam
sudo su - steam</pre>
<p>Do the rest as this user, in its home directory.</p>
<h2>2. Install the 32-bit dependencies</h2>
<p>SteamCMD and the CS 1.6 engine are 32-bit. On a 64-bit Debian/Ubuntu host you must enable the i386 architecture and install the 32-bit C runtime, or SteamCMD will not run:</p>
<pre>sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y lib32gcc-s1 lib32stdc++6 ca-certificates</pre>
<p>On older releases the package is <code>lib32gcc1</code> rather than <code>lib32gcc-s1</code>; install whichever your distro provides. On CentOS/RHEL the equivalents are <code>glibc.i686</code> and <code>libstdc++.i686</code>.</p>
<h2>3. Download and extract SteamCMD</h2>
<p>Fetch the official tarball from Valve's CDN and unpack it:</p>
<pre>mkdir ~/steamcmd && cd ~/steamcmd
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz</pre>
<p>That leaves <code>steamcmd.sh</code> in the directory. The first time you run it, SteamCMD downloads its own updates before giving you a prompt &mdash; that is normal.</p>
<h2>4. Run SteamCMD and log in anonymously</h2>
<pre>./steamcmd.sh</pre>
<p>At the <code>Steam&gt;</code> prompt, log in anonymously &mdash; HLDS (app 90) is available without an account:</p>
<pre>login anonymous</pre>
<p>You should see <code>Waiting for user info...OK</code>. If it hangs here, it is almost always the missing 32-bit libraries from step 2.</p>
<h2>5. Download CS 1.6 (app 90)</h2>
<p>Set the install directory first, then update the app. Order matters &mdash; <code>force_install_dir</code> must come <em>before</em> <code>app_update</code>:</p>
<pre>force_install_dir /home/steam/hlds
app_update 90 validate
quit</pre>
<p><code>app_update 90 validate</code> downloads CS 1.6 and verifies every file. This is the single command at the heart of every CS 1.6 install. App 90 is known to sometimes report success with an incomplete <code>cstrike</code> folder; if that happens, run <code>app_update 90 validate</code> again &mdash; it resumes and fills the gaps rather than re-downloading everything.</p>
<h2>6. Do it all in one non-interactive line</h2>
<p>For scripts and cron, pass the same commands as arguments so SteamCMD runs unattended:</p>
<pre>./steamcmd.sh +login anonymous +force_install_dir /home/steam/hlds +app_update 90 validate +quit</pre>
<p>This is exactly what LinuxGSM and Pterodactyl eggs run under the hood. To update the server later, run the same line again &mdash; it only downloads changed files.</p>
<h2>7. Keep SteamCMD and the server separate</h2>
<p>Install SteamCMD in its own directory (<code>~/steamcmd</code>) and the game in another (<code>~/hlds</code>), as the commands above do. Mixing them means a SteamCMD self-update can overwrite server files, and it makes backups messier. Keeping them apart also lets you run one SteamCMD against several install directories &mdash; just change <code>force_install_dir</code> per invocation. When Valve pushes a CS 1.6 update, stop the server, re-run the non-interactive line from step 6, and start it again; because <code>validate</code> checks every file, it also repairs a server whose files were corrupted by a bad shutdown or a full disk.</p>
<h2>Troubleshooting</h2>
<ul>
<li><strong>"steamcmd.sh: No such file or directory" though it exists</strong> &mdash; the 32-bit loader is missing. Install <code>lib32gcc-s1</code>/<code>lib32stdc++6</code>; a 32-bit binary on a 64-bit host with no i386 libs fails this way.</li>
<li><strong>Hangs at "Waiting for user info..."</strong> &mdash; same missing 32-bit libraries, or no outbound network. Confirm the deps and that the host can reach Steam's CDN.</li>
<li><strong>"ERROR! Failed to install app '90' (Missing file permissions)"</strong> &mdash; the install dir is not writable by the <code>steam</code> user, or you ran an earlier step as root and left root-owned files. Fix ownership with <code>chown -R steam:steam /home/steam/hlds</code>.</li>
<li><strong>cstrike folder incomplete after "Success"</strong> &mdash; a known app-90 quirk. Re-run <code>app_update 90 validate</code>.</li>
<li><strong><code>force_install_dir</code> ignored</strong> &mdash; you put it after <code>app_update</code>. It must come first.</li>
</ul>
<h2>Verification</h2>
<p>Confirm the download landed:</p>
<pre>ls /home/steam/hlds/hlds_run
ls /home/steam/hlds/cstrike/maps/de_dust2.bsp</pre>
<p>Both should exist. Then launch the server to prove the files are complete:</p>
<pre>cd /home/steam/hlds
./hlds_run -game cstrike +map de_dust2 +maxplayers 12</pre>
<p>If it reaches <code>Console initialized</code> and loads the map, SteamCMD did its job. From here, configure the server with the full <a href="/tutorials/install-cs16-dedicated-server-linux-steamcmd">Linux dedicated-server guide</a>, or hand the whole lifecycle to <a href="/tutorials/install-linuxgsm-cs16">LinuxGSM</a>, which wraps this exact SteamCMD flow.</p>