Ubuntu 24.04 LTS (Noble) is a fine host for a CS 1.6 server, but it is a pure 64-bit release that ships none of the 32-bit runtime HLDS is built against. Nearly every "installed but won't start" report on 24.04 comes from that gap. This guide is the 24.04-specific path; for the platform-agnostic detail see the general SteamCMD guide.
1. Create an unprivileged user
Do not run a 20-year-old network binary as root.
sudo adduser --disabled-password --gecos "" steam sudo su - steam
2. Enable i386 and multiverse, then install the runtime
On 24.04 the package names are the current ones — lib32gcc-s1, not the old lib32gcc1:
sudo dpkg --add-architecture i386 sudo add-apt-repository multiverse sudo apt update sudo apt install -y lib32gcc-s1 lib32stdc++6 libc6:i386 \ libncurses6:i386 libcurl4:i386 ca-certificates tar wget
The full reasoning and per-package breakdown is in the 32-bit library guide. Skip these and the server dies with ./hlds_linux: No such file or directory — which is the kernel reporting the missing 32-bit ELF loader, not a missing binary.
3. Install SteamCMD
Ubuntu packages SteamCMD in multiverse, which is the tidy option on 24.04:
sudo apt install -y steamcmd
That installs the steamcmd wrapper. (If you prefer the tarball, the manual method in the general guide works identically on 24.04.) Run it once so it self-updates:
steamcmd +quit
4. Download App 90
steamcmd +force_install_dir /home/steam/hlds \ +login anonymous \ +app_set_config 90 mod cstrike \ +app_update 90 validate \ +quit
Run the exact same command a second time. App 90's anonymous download regularly finishes the base Half-Life files and skips cstrike/ on the first pass; the second pass fills it in. If you see Error! App '90' state is 0x402 after update job., that means the download was interrupted — just re-run and SteamCMD resumes.
5. Verify the files exist
ls /home/steam/hlds/cstrike/liblist.gam ls /home/steam/hlds/hlds_run /home/steam/hlds/hlds_linux
All three must be present. liblist.gam is what tells the engine which game library to load; if it is missing, the mod did not download and you repeat step 4.
6. Minimal config and first start
Create /home/steam/hlds/cstrike/server.cfg with at least a hostname, an rcon password, and sv_lan 0 (a full annotated file is in the server.cfg guide). Then:
cd /home/steam/hlds ./hlds_run -game cstrike -strictportbind -ip 0.0.0.0 -port 27015 \ +map de_dust2 +maxplayers 20 +sv_lan 0
sv_lan 0 is mandatory to appear on the master list; with sv_lan 1 the server never heartbeats and Steam clients are refused.
7. Firewall with ufw
24.04 ships ufw. Open the game port for both protocols (UDP is gameplay, TCP is RCON):
sudo ufw allow 27015/udp sudo ufw allow 27015/tcp
Details and the optional HLTV/query ports are in which ports to open.
Why 24.04 needs this when older boxes did not
Old CS 1.6 tutorials assume a 32-bit or multilib-by-default distro, which is why they never mention the i386 packages. 24.04 dropped all of that: it is 64-bit only and installs no 32-bit userland at all. The HLDS binary has not changed — it is still the same 2003-era 32-bit ELF — so the fix is to add back the runtime it expects. This is a one-time step per host; once the i386 libraries are present, ReHLDS, ReGameDLL, Metamod and every AMXX module reuse them.
Harden the box while you are here
24.04 ships ufw disabled by default. If you enable it, set a default-deny inbound policy and then open only what you need, or you will lock yourself out of SSH:
sudo ufw allow OpenSSH sudo ufw allow 27015/udp sudo ufw allow 27015/tcp sudo ufw enable
Run the server as the unprivileged steam user (step 1), keep the OS patched, and put the launch behind a systemd unit rather than a login shell so a dropped SSH session never takes the server down with it.
Common errors on 24.04
./hlds_linux: No such file or directory— the i386 runtime is missing even though the file is clearly there. Install the packages in step 2. This is the number-one 24.04 issue.error while loading shared libraries: libstdc++.so.6: cannot open shared object file— you have the 64-bitlibstdc++6but notlib32stdc++6. Add the 32-bit one.steamcmd: command not found— multiverse is not enabled. Runadd-apt-repository multiverseandapt update.- SteamCMD complains it cannot find a 32-bit loader — the
steamcmdpackage pulls i386 deps, but if you added the repo after installing, runsudo apt install --reinstall steamcmd. - Server starts but nobody finds it —
sv_lanis 1, or the provider blocks inbound UDP. Confirm the bind withss -lunp | grep 27015.
Verification
ss -lunp | grep 27015
should show hlds_linux bound to the UDP port. Type status in the console for the map, hostname, and slot count, then from another machine run connect YOUR_IP:27015. Once you spawn, the base install is done. Next, put it behind a systemd service so it survives reboots, and upgrade the engine to ReHLDS.









