7.2 KiB
Isolated native Linux dedicated startup diagnostic
The stable Linux ArmaReforgerServer successfully compiled the frozen successor Core game scripts, loaded its scenario header and native MissionSystems, and reached prison phase during the 2026-09-19 08:32:13 local diagnostic. This establishes server compilation and empty-server mission preparation. It does not establish multiplayer, authentication, client replication, ordinary input, graceful shutdown, comparative performance or release readiness. Four native installed-asset resource errors remain; this was not an entirely error-free run.
Safe diagnostic route
The official startup parameter documentation documents -server with local -addons/-addonsDir, separately from -config. It describes -worldSystemsConfig as diagnostic-executable only. Installed GameStateTransitions.RequestScenarioChangeTransition accepts either a mission header or world resource. The bounded experiment confirmed that this regular dedicated executable also accepts the successor .conf header as the -server value; no special header flag or JSON configuration was necessary.
tools/dedicated_native.py is exclusively a disconnected diagnostic launcher. Its immutable command selections cannot add a JSON configuration, clients, credentials, public hosting, Workshop downloads or validation-disabling options. The native local-server route nevertheless logged 0.0.0.0:2001, fastValidation=false, despite CLI bind hints. These are native local-test defaults, not safe hosting configuration. Never remove the mandatory namespace isolation or repurpose this command for public/authenticated hosting. The separate review-only dedicated preflight plan retains its own fastValidation=true and BattlEye configuration; this experiment does not validate that configuration route.
The runner masks host home, /tmp and /run, clears inherited environment, mounts host root and runtime read-only, and exposes only private source/profile/home/temp paths for engine writes. Networking, PID, IPC and UTS namespaces are isolated. A native namespace-aware Python probe requires a different network namespace, only lo, no IPv4 routes and no non-loopback IPv6 route. It runs both before launch and immediately before exec; any failure prevents server launch. Reading /sys/class/net alone is insufficient because a read-only host sysfs mount can show host interfaces even inside a separate network namespace.
Each run owns a new process group and private PID namespace. It records the exact command, binary hash, source manifest before/after, raw stdout and native logs; its timeout terminates only that owned group. Runtime can be bounded to 1–110 seconds, followed by at most ten seconds cleanup. A lock prevents concurrent instances of this diagnostic. Backend is explicitly disabled and the network namespace independently prevents external traffic. No displays, audio server sockets, Steam account profile or original missions are exposed for writes.
Example after reviewing the source and installed private runtime:
python3 tools/dedicated_native.py \
--source /tmp/frozen-successor \
--runtime /tmp/erri-dedicated-runtime/server \
--archive /tmp/erri-dedicated-attempt-new \
--route header --seconds 90
The source, archive and runtime must be separate resolved /tmp paths. Archive must be new. Exit zero means bounded diagnostic collection finished, not that compilation or acceptance passed. Inspect raw errors and positive mission evidence. The separately enumerated vanilla-everon control route loads installed Missions/21_GM_Eden.conf without successor addon arguments; see the resource diagnosis. The alternative diag-world route remains available for a different bounded question but was not needed or executed in this result; it cannot establish ordinary-header startup by itself.
Archived observations
Development archive. Native log: profile/logs/logs_2026-09-19_08-32-13/console.log. The engine ran unmodified copied sources: 277 source/resource/document/tool files, all unchanged after the run. Binary SHA-256: 91fdf333ec49c266d309be358aabab4244a93a2f9cfa11853a600e026104001f (stable server app 1874900, private installed public payload).
Evidence from the native log:
- Line 61: backend services disabled.
- Line 94: game successfully created after native Game compilation; no
SCRIPT (E)entries captured. - Line 100: native SaveGameManager starts
{AD62322D5213C440}Missions/ERR_Everon_Base.conf. - Line 109: native world systems initialize
{C50579A2EC48E8EF}Configs/Systems/MissionSystems.conf. - Line 157: native RPL server starts inside the isolated namespace, with the local-test defaults described above.
- Line 307: successor transitions from preparation phase 0 to prison phase 1.
- Subsequent native statistics report zero players and 36 physical AI characters. The capped empty-server FPS is not a comparative performance benchmark.
The four captured (E) lines concern vanilla editor-helper resources: TransparentMat.emat referenced from installed Calvary content, Gizmo3D/sphere.xob referenced from installed Blast_small_Invisible_Trigger.et, and the resulting material-not-found/default-material pair. Raw surrounding resource stacks remain in the archive. No assets/errors were suppressed or replaced. Core preparation nevertheless completed; whether these packed-runtime resource errors affect any visible or released use still requires investigation.
The 90-second deadline ended via supervisor SIGTERM (exit=-15), not native mission-completion shutdown. A separate read-only host check confirmed the owned supervisor absent and no remaining ArmaReforgerServer executable process. The source manifest did not change. No real participant joined and no direct scripted RplSession.Mode observation was added to this frozen-source run.
Earlier failed isolation checks are preserved. The sandbox-local network namespace attempt returned NETLINK permission denied before any engine; the host namespace-only verification succeeded. Attempt 01 then failed before engine launch because a new mount destination could not be created under read-only root. Attempt 02 corrected destinations beneath private /tmp; both its preflight and immediate pre-exec probe passed. No isolation check was bypassed.
Source-local regression scope
python3 tests/test_dedicated_native.py exercises the actual pre-exec isolation gate with substituted namespace/interface/routes and proves refusal happens before exec, detects source mutation and rejects linked sources, and checks header versus diagnostic-world CLI separation. It does not execute a server or simulate multiplayer. The native archive separately establishes that the observed regular server startup accepted the header and initialized the mission.
The subsequent vanilla-only control reproduced all four initial asset errors without successor addons. This attributes those specific errors to the installed vanilla content; it does not make the first run entirely error-free or close other acceptance requirements. Exact stacks and control limitations are recorded in the resource audit.