Running Unity 6000.x Headless Builds in a Linux Container: A Field Report (Including Licensing Workarounds) A developer got Unity 6000.3.26f1 (LTS) running fully headless in an Ubuntu 24.04 container, using the experimental Unity Hub CLI (v1.0.0-beta.13) for installation and OAuth-based license activation, then assembled a 3D scene from a C# editor script and produced a working Linux x86_64 game build. The report documents the working path — including an LD_PRELOAD shim to work around chown restrictions and running the Editor binary directly with -batchmode -nographics -executeMethod — and the dead end of manual .alf/.ulf license activation, which failed in a login redirect loop on 2026-10-09. Status: REVISED 2026-10-10 — every technical claim verified against the actual build artifacts install logs, auth outputs, editor scripts, binary . Hostile external AI critique applied 2026-10-10; valid points incorporated, untestable ones marked honestly. This documents a real pipeline built on a real machine, including the dead ends. It is a field report with a reproducible core — not a copy-paste guarantee: Unity's pages and CLI behavior drift, and several environment-specific behaviors are called out as such. If you follow it, verify each step's output before proceeding. On 2026-10-09 I got Unity 6000.3.26f1 LTS running fully headless in an Ubuntu 24.04 container — no display, no human at a keyboard — and used it to assemble a 3D scene from a C editor script and produce a working Linux x86 64 game build. The path that worked: gcc , curl and the experimental Unity Hub CLI v1.0.0-beta.13 . tar --no-same-owner the CLI's extractor chokes in containers, and plain tar fails on ownership . unity auth login browser OAuth — unity license activate --personal --accept-eula . unity projects new --template com.unity.template.3d . chown restrictions with an LD PRELOAD shim — Unity -batchmode -nographics -executeMethod ... . unity license status as a pre-flight check, not a one-time setup. The path that did not work: manual license activation .alf → upload → .ulf . On 2026-10-09 the upload flow at license.unity3d.com/manual-activation died in a login redirect loop for my Personal seat and never produced a .ulf — observed behavior, not a quoted policy. Don't sink an hour into it without checking Unity's current docs first I did, so you don't have to . Environment: Ubuntu 24.04.5 LTS, x86 64, unprivileged container user non-root , ~95 GB free disk, no GPU, xvfb available but not required for batch mode. Prerequisites have these before you start : a Unity account free Personal is enough , a Linux x86 64 container/VM with ~15 GB free disk, and a browser you can reach within ~5 minutes for the one-time OAuth in Step 3. system dependencies used in this guide sudo apt update && sudo apt install -y gcc curl gcc: only needed to compile the Step 5 LD PRELOAD shim curl: only needed for the Step 0 CLI installer Architecture what talks to what : php Developer machine browser -- one-time OAuth -- api.unity.com | | authenticated session cached in ~/.config/unityhub/ v Container/VM: Hub CLI ~/.local/bin/unity - downloads editor archive no login needed - unity license activate needs OAuth session Editor binary ~/Unity/Hub/Editor/6000.3.26f1/Editor - -batchmode -nographics -executeMethod ... license/auth state: ~/.config/unityhub/ <- PERSIST THIS DIR I wanted a CI-style pipeline: install Unity headless → create a project → assemble a scene from code → build a Linux player → verify the binary runs. No editor GUI, no clicking. This is bread-and-butter for CI/CD, but Unity 6000.x assumes an interactive user at several steps, and containers add their own permission quirks. My operating principle for the day: don't say "can't" without concrete evidence. Every wall gets a workaround attempt first. Unity now ships an official experimental, beta CLI designed for terminal/CI/agent workflows: curl -fsSL https://public-cdn.cloud.unity3d.com/hub/prod/cli/install.sh \ | UNITY CLI CHANNEL=beta bash installs to ~/.local/bin/unity, version was v1.0.0-beta.13 Key subcommands: unity install , unity build , unity run , unity license , unity auth . The CLI provides higher-level build / run commands that internally launch the Editor in non-interactive mode. For custom editor-scripting workflows, I used the Editor binary directly Unity -batchmode -nographics -executeMethod ... because it exposes the full Unity command-line surface — the CLI's wrappers are convenient but thinner. ~/.local/bin/unity install --help lists versions; 6000.3.26f1 was the latest LTS With Hub CLI v1.0.0-beta.13 and Unity 6000.3.26f1, the editor archive download completed before any authentication step scoped claim — this is what happened on 2026-10-09, not a promise about all versions : ~/.local/bin/unity install 6000.3.26f1 It streams JSON progress lines and pulls ~4.2 GB. The CLI downloaded 100% successfully, then failed at extraction: COULD NOT EXTRACT . The archive itself was valid; the target directory contained a partial extraction. Manual extraction also failed: Cannot change ownership to uid 1000: Operation not permitted Root cause: tar tries to preserve the archive's original file ownership, but we're an unprivileged container user — chown returns EPERM . Fix: wipe partial state first, then tell tar not to preserve ownership: rm -rf /home/hatch/Unity/Hub/Editor/6000.3.26f1 mkdir -p /home/hatch/Unity/Hub/Editor/6000.3.26f1 tar --no-same-owner -xJf ~/.config/unityhub/downloads/Unity-6000.3.26f1.tar.xz \ -C /home/hatch/Unity/Hub/Editor/6000.3.26f1/ Result: Unity Editor 6000.3.26f1 installed ~8.2 GB . Sanity check: