The OS
MarlinOS is FreeBSD with a kernel config, a CAN networking stack, the fleet agent, the WAKE detection daemons, and a set of platform YAML files. The host stays small; package mass lives in the jails, picked per workload.
Base system
We track FreeBSD-CURRENT and ship a custom kernel config plus a short list of additions. No fork: MarlinOS installs on top of the FreeBSD pkgbase stream.
- Hardened base
- GENERIC minus debug, ZFS-only root with boot-environment rollback, PF composed from platform + overlay,
fleetdas unprivileged_fleetdwith path-scoped sudoers. No extra userland attack surface on the host beyond what the platform YAML declares. - MARLINOS kernel config
- Derived from
GENERICwith debug options removed (include "std.nodebug"), plus the NetCAN device modules built in. Built for both architectures. - pkgbase delivery
- Base system and kernel ship as
pkg-installable sets frompkg.marlinos.io. Upgrades arepkg upgrade; rollback is a ZFS boot environment. - Dual architecture, native builds
- Both
FreeBSD:16:amd64andFreeBSD:16:aarch64are built on native Poudriere runners. - ZFS root, boot environments
- ZFS is the only supported root filesystem. Each base upgrade produces a new boot environment; a failed upgrade rolls back from the loader.
What MarlinOS adds
Two delivery channels: pkgbase for the kernel and base system (MARLINOS kernel config + NetCAN userland), ports for everything else. Linux gets the ports layer only, with naming and coverage in Linux support below.
| Component | Where | What it does |
|---|---|---|
| MARLINOS kernel + NetCAN | pkgbase | GENERIC minus debug, plus NetCAN (can, can_raw, can_nmea2000, vcan, ahc0512). See NetCAN. |
| CAN userland | pkgbase | canconfig, candump, cansend, slcand, n2kdump. Ship with the base system. |
| fleetd | fleetd | Device agent. Talks to fleetserver, applies platform YAML, reports drift. |
| fleetserver | fleetserver | Headless REST API + enrollment broker. Required on one node. |
| fleet-cli | fleet-cli | fleetctl for operators. Multi-namespace, fan-out for list verbs. |
| fleet-platforms | fleet-platforms | Eight YAML platforms (hosting, nas, identity, wake-edge, soc-console, vpn-hub, build-worker, racing-boat) plus their default app_configs/. See Platforms. |
| fleet-backup | fleet-backup | Sanoid/syncoid wrapper with engine helpers (MariaDB, PostgreSQL). |
| rsyslog | rsyslog | FreeBSD’s rsyslog rebuilt with our SIMD TurboVM patches against liblognorm, plus the WAKE modules mmenrich / mmsigma / mmwake. |
| WAKE | wake | waked + libwake + the WAKE rsyslog rulebases. See WAKE. |
| host-defaults | host-defaults | Canonical /usr/local/etc/* for common tools. |
| Racing daemons | compute-daemon, assistant | Fill the compute and vis jails on racing-boat. |
hosting platform
pulls in PHP 8.4, MariaDB clients, Redis, Nextcloud, WordPress,
Dolibarr, certbot, and Stalwart, one jail at a time.
Linux support
No image, no MARLINOS kernel, no jails: on Linux the ports layer drops
onto whatever base install is already there. amd64 only, on the
dev channel, one package repo per distro on
pkg.marlinos.io.
Package names differ only where they would collide with a distro
package: Linux ships marlinos-fleetd,
marlinos-fleetserver, and marlinos-fleet-cli.
rsyslog, wake, and libwake keep
those names everywhere. Alpine carries the rsyslog + WAKE stack only,
no fleetd or fleetserver. See Get it for
the repo setup on each distro.
Flatcar is a different shape: read-only /usr, no apt/apk,
so the detection stack ships as two OCI images
(marlinos-rsyslog, marlinos-waked) instead of
packages. journald stays the host logger; rsyslog tails it. No fleetd
here either, same operator-managed config model as Alpine. See
Get it for the docker load
+ compose steps.
Primitives
Each platform picks the primitives it needs. None of these is universal.
- Bastille jails
- Used by multi-service platforms -
hosting(5 jails),racing-boat(5 jails), andidentity(itskeycloak-dbjail). Synthesized server-side from the platform YAML.thin/thick/linux/cloneare supported;vnetis intentionally not. The others (nas,wake-edge,vpn-hub,soc-console,build-worker) run services directly on the host. - NATS message bus
- Used by
racing-boatonly - the gateway/compute/persistence/vis jails communicate over it. No other shipped platform brings in NATS today. - ZFS datasets with sanoid policy
- Every FreeBSD platform uses ZFS root. Datasets are declared in the platform YAML with their Sanoid retention inline;
fleet-backuphands off to engine-specific helpers (MariaDB, PostgreSQL) for consistent snapshots;syncoidships them elsewhere when needed. - PF + dual-stack IPv6
- FreeBSD platforms compose PF rules from platform + overlay, with synthesized RDR anchors per jail. ULA IPv6 with NPTv6 across the fleet’s WireGuard fabric where used.
- WireGuard transport
- Fleet-managed mesh, opt-out per host.
nasandhostingon a LAN typically setwireguard_enable: NO;vpn-hubis the hub. See Fleet.
Build channels
| Channel | Path on pkg.marlinos.io | Use |
|---|---|---|
| current | FreeBSD:16:<arch>-current | Release channel. Cut from master. |
| dev | FreeBSD:16:<arch>-dev | Tracking channel. Cut from dev. Use for testing. |
| pkgbase | FreeBSD:16:<arch>/base_current | FreeBSD base + MARLINOS kernel as pkg sets. |