What ships to the device
Two binaries, side by side (see Build Omega for how to produce them):
Keep the two binaries together — by default the launcher is expected alongside
omega-agent. Also place the device’s profile (say /etc/omega/config.yaml) and make sure its cert_dir is writable by the account the service runs as.
Install as a service
One command, on the device, as root/Administrator:- Everything after the known flags (here
--client /etc/omega/config.yaml) is forwarded verbatim as the service’s runtime arguments — exactly what you’d pass toomega-agentby hand. --name <service>sets the service name (defaultomega). Use distinct names to run more than one instance on a host.--launcher-path <path>points atomega-launcherif it isn’t next to the agent binary.
What it creates, per OS
install-service writes a native service definition and enables it. Here’s exactly what lands where, and how to operate it afterward.
- Linux (systemd)
- macOS (launchd)
- Windows (Service Control Manager)
Writes Requires root (writing under
/etc/systemd/system/{name}.service, runs systemctl daemon-reload and systemctl enable. The unit is Type=simple, ExecStart = the launcher + your args, with:Restart=on-failure,RestartSec=5After=network.target- Hardening:
ProtectSystem=full,PrivateTmp=true,NoNewPrivileges=true,ProtectHome=read-only
/etc/systemd/system).When a service won’t start
A profile Omega can’t honor is fatal by design — it will not run half-configured (see Configure → validation). On a fresh install that shows up as a service that starts and immediately exits. Omega makes that legible rather than silent:- Exit code 78 (
EXIT_STARTUP_FAILED) — a config/startup problem, distinct from a crash. - A written
startup-error.lognext to the profile, with the exact reason (which module or capability the build doesn’t provide, a malformed field, a denied broker subscription). - On Windows, the same reason is also written to the Event Log, because
sc.exe’s own “did not start” message says nothing useful.
startup-error.log (or the Event Log entry), fix the profile, re---validate, restart the service. There is no auto-fallback to a previous config — a device that’s up is one running exactly the profile you gave it.
Production checklist
- Ran
omega-agent --validate --client <profile>and it exited 0. -
connection.server_urlismqtts://…(TLS/mTLS), not plaintext. -
security.signed_control.enabled: true, with the HMAC key supplied viakey_env(not inline). -
security.capabilitieslists only what this device needs — each one is validated against the build. - Secrets (
*_envfields) come from the environment or a secret manager, never committed with the profile. -
cert_diris stable and writable by the service account, so renewal can persist new certificates. - First-boot identity is ready: either a device certificate is already in
cert_dir, or aconnection.jitrblock plus the factory bootstrap key is present. - The service points at
omega-launcher(it does, if you usedinstall-service).
See also
- Build Omega — produce the binaries and pick a SKU.
- Configure Omega — the profile the service runs.
- Remote control — what the platform can do to a running device.