All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Migration from scarthgap to wrynose (Yocto 6.0 LTS). This is a reflash, not an OTA — the RAUC compatible string does not guard the release-track jump.
- Yocto 6.0 LTS (wrynose) base: U-Boot 2026.01, mainline kernel 6.18.37,
systemd 259, GCC 15.2. Layers are SHA-pinned and checked out by kas into a
gitignored
.kas/via bare-mirror alternates. - Signed FIT-only boot (split model): a plain kernel image plus a separate FIT
assembly/signing recipe; U-Boot boots the FIT's signed
defaultconfig, and the config name is removed from the environment and OTA hooks. Three signing paths validated end-to-end — build-time file key, SoftHSM, and YubiKey (PIN+touch), including on-target boot of a YubiKey-signed FIT. - OTA U-Boot env self-heal: a bundle install reconciles the boot-critical env
vars from a canonical
uboot-env.txtit ships, so an OTA that changes the kernel boots the correct per-slot FIT without a manual env reset (production is already immune viaCONFIG_ENV_WRITEABLE_LIST). - Host-side target-checks runner (
scripts/run-target-checks.sh) that drives the on-target smoke/check scripts over SSH. - Additive SBOM/CVE overlay (
kas/cve.yml) gated byIOTGW_CREATE_SPDX_DISABLE.
- systemd-networkd replaces NetworkManager (br0 bridge + wlan0 via
wpa_supplicant@, systemd-resolved); provisioning drop-ins move to/data/iotgw/{network,wpa}. - Containers enabled: podman/crun/netavark/aardvark-dns from
meta-virtualization, nftables firewall driver, persistent graphroot on
/data. - Host tooling reorganized under
scripts/by subsystem; FIT signing is driven byscripts/fit-signing/sign_fit.py. - Wi-Fi association MAC defaults to the permanent hardware MAC (stable across reboots for a fixed appliance) instead of per-association randomization.
IOTGW_WIFI_IFACEis now a single source of truth iniotgw-common.inc, consumed by network-units, hardening, and the RAUC managed-path.scripts/release/release-manifest.shauto-detects the Yocto deploy directory instead of hardcoding it, and recordsdeploy_rootfor traceability (override withIOTGW_DEPLOY_ROOT).
- U-Boot A/B failover: a slot whose partition-UUID lookup fails now marks itself non-bootable and fails over to the other slot instead of looping forever (the attempt-counter decrement is persisted before reset).
- FIT signing: every configuration signature node must be signed, not just one; verification and the already-signed check match by key-name-hint so non-default hash/signature algorithms are not rejected.
- The non-FIT bundle path (bundle recipes, hook, and bootfiles archive) and the corresponding Make targets — FIT signed boot is the only flow.
- Layers meta-security, meta-lts-mixins, and meta-rust-bin; meta-rauc-community is absorbed into meta-iot-gateway.
0.4.0 - 2026-05-09
- U-Boot hardening framework with feature-gated posture tokens:
surface_reduce,fit_enforce,appliance_lockdown. - Production U-Boot lockdown profile with env write allowlist and
force-bypass blocking (
CONFIG_ENV_ACCESS_IGNORE_FORCE=y). - Production build guard for U-Boot FIT signing key policy
(
iotgw-uboot-prod-key-guard.bbclass). - Optional crash-debug kernel profile (
IOTGW_ENABLE_CRASH_DEBUG_DEV) layered on pstore persistence for deterministic reboot-on-oops/panic lab workflows. - Optional dedicated kernel BTF/CO-RE metadata lane
(
IOTGW_ENABLE_BTF_CORE_DEV->igw_btf_core_dev) withpahole-nativedependency gating. - U-Boot defconfig patch raising
CONFIG_SYS_BOOTM_LEN=0x8000000for larger FIT kernel decompression envelopes. - LSM/IMA feature gates and RPi EEPROM/VCIO integration switches.
- OTA/RAUC PKCS#11 and encrypted-bundle feature-gated plumbing.
- Release tooling:
docs/RELEASE.md,scripts/release/release-build.sh,scripts/release/release-manifest.sh, and arelease-hygieneGitHub Actions workflow runningshellcheckon tracked scripts andyamllint(config:.yamllint) on tracked kas configs and workflows, plus changelog/version-variable sanity gates.
- RAUC install/reconcile flow hardened; clean
fstabpreservation improved. - OTA updater/cert runtime behavior gated with shared OTA user model.
- U-Boot
iotgw_set_bootargsnow honorsEXTRA_KERNEL_ARGS; provisioning automation applies boot policy (IOTGW_UBOOT_BOOTDELAY,IOTGW_UBOOT_EXTRA_KERNEL_ARGS) with lockdown-aware behavior. - Recovery kernel feature set alignment tightened by removing unconditional observability-dev coupling.
- Telegraf startup now gates on non-empty credential files.
- RAUC environment handling tightened with enforced
/etc/fw_env.configvia overlay reconciliation.
- OTA updater key/cert preflight sequencing and key-option initialization fixes.
- OTA polling TPM updater gating and preflight behavior fixes.
- OTA cert provisioning behavior decoupled from PKCS#11 readiness checks.
tpm2packaging/runtime fixes for offlinepytssbuild and PKCS#11 tools.- Corrected patch metadata author attribution in
otbr-socket-dir.patch.
- Added/expanded U-Boot hardening architecture reference.
- OTA/RAUC docs refactored and provisioning script guidance updated.
- Kernel driver backport field guide added.
- U-Boot hardening and kernel configuration references updated for current
bootargs policy automation,
SYS_BOOTM_LENrationale, andigw_btf_core_devsemantics.
0.3.1 - 2026-04-08
- Release metadata alignment:
- distro default version bumped to
igw.0.3.0iniotgw-common.inc - build documentation release override example updated to
0.3.0
- distro default version bumped to
v0.3.0changelog entry amended to include observability stack rollout notes (influxdb,telegraf,mosquitto).
0.3.0 - 2026-04-08
- U-Boot bootstage userspace collector service (
iotgw-bootstage) with structured logging and environment export. - Stable RAUC slot udev links (
/dev/disk/by-rauc-slot/*) for early boot partition resolution. - Native observability service stack integration for gateway telemetry:
- InfluxDB
- Telegraf
- Mosquitto
- Raspberry Pi 5 U-Boot boot path optimized for appliance flow with script-first behavior.
- U-Boot boot interaction refined to a 2s keyed stop string (
igw) with image-variant bootdelay policy. - U-Boot diagnostics expanded with stage markers and bootstage reporting path for fleet timing analysis.
- Startup critical path improved by removing
udev-settledependency fromrauc-grow-data-partition. - Network boot wait behavior hardened by masking
NetworkManager-wait-onlineat rootfs build time. - Systemd preset installation path corrected to
${libdir}/systemd/system-presetfor deterministic application during image build. - Observability provisioning and OTA reconciliation flow hardened for native services and credential paths.
- Resolved RPi5 U-Boot init/probe regressions encountered during EFI/video/DM path tuning.
- Audit rule deployment moved away from fragile
pkg_postinstflow to deterministic rootfs deployment. - AArch64 audit rule compatibility fixed (invalid syscall usage removed), with reliable
augenrulesload. - File/dir audit monitoring switched to watch-form rules for stable boot-time rule activation.
develaccount password aging policy adjusted to avoid forced expiry lockouts on first login after OTA.- Overlay reconcile policy updated to enforce
/etc/login.defsconsistency across slot switches.
- Login policy hardening moved to
shadowpackage build-time patching (/etc/login.defs) for OTA-consistent behavior. - Audit policy profile clarified with image-profile lock mode handling (
-e 1dev/base, stricter prod policy support).
- Security documentation updated for current audit rules path and Lynis baseline workflow.
- Partition documentation updated for current grow-data detection/stamp behavior.
0.2.0 - 2026-04-01
- TPM 2.0 (Infineon SLB9672) integration with build-time gating across kernel/device-tree/userspace packaging.
- FIT recovery-kernel flow for signed multi-config boot updates.
- Rootfs-only dev bundle target for faster OTA iteration (
bundle-devpath).
- FIT custom ITS flow expanded to dual-kernel + dual-config policy (
conf-primary/conf-recovery). - OTA cert provisioning and RAUC install wrapper flow reconciled for HTTPS-driven installs.
- WIC/OTA layout moved to 128G default with 16G A/B rootfs slots and hardened streaming preflight behavior.
- Raspberry Pi 5 RTC support backported behind build-time gate (
IOTGW_ENABLE_RPI_RTC). - U-Boot boot path adjusted to skip unused EFI boot method probes for this product flow.
- Security and FIT signing documentation refreshed for current runtime policy and operator workflow.
- OTA follow-up notes and repository references aligned with merged implementation state.
0.1.0 - 2026-03-04
- Mainline Linux
6.18integration and FIT bundle flow for Raspberry Pi 5. - Signed FIT boot path support with runtime verification plumbing and key injection flow.
- RAUC bundle-hook bootfiles update path with U-Boot environment tracking.
- RAUC HTTPS streaming support in system config, including TLS paths and operator runbook coverage.
- OTA updater service/timer and OTA certificate provisioning pipeline with dev-CA support.
- Dedicated
uboot-envpartition support and RAUC slot/layout handling updates. - Adaptive OTA slot-alignment build validation gate for rootfs slots.
- Deterministic RAUC streaming preflight stages with TLS profile selection (
system/data). - RAUC D-Bus integration across updater, manual wrapper, and banner observability.
- Persistent machine-id flow for immutable rootfs (
/data/machine-id->/etc/machine-id) with consumer fallbacks. - OTBR host integration improvements, including hardened services, system user setup, telemetry flags, and
iotgw-otbrctl. - OTBR web UI integration and default/network policy gating by
IOTGW_ENABLE_OTBR. - Edge monitoring integration (
edge-healthd) with packagegroup gating and refactor to.inc + versioned .bb. - Platform support additions for container-host tuning and mosquitto security integration.
- Build workflow expanded with FIT-focused bundle targets (
bundle-dev-full-fit,bundle-base-full-fit-fast). - OTA cert trust source aligned to a single CA source-of-truth with runtime chain validation.
- RAUC config recipe selection hardened to avoid filename and
FILESPATHcollisions. iotgw-rauc-installexecution model hardened undersystemd-runwith explicit transient unit controls.- Wrapper audit behavior improved with dispatch profile and writable-path assumption logs.
- Image defaults updated to mask legacy
vconsoleand legacyrauc-mark-goodbehavior in favor of updated flow. - Packagegroups and image composition updated for OTA dependencies and developer tooling.
- First-boot bootargs regression that could carry stale static root arguments.
- Post-
uboot-envfollow-up service/image integration issues. - FIT boot reliability issues around stale bootfiles payload and signed image/runtime DTB consistency.
- U-Boot FIT hash verification compatibility (
sha256) path. - OTA overlay reconciliation reliability in slot hooks (
pre-install/post-install) and migration behavior. - OTBR web UI regressions (missing frontend assets, tested defaults, nft init behavior).
- SSH per-connection hardening side effect that blocked expected sudo usage.
- Build/QA issues in OTBR path (including buildpath QA and telemetry enablement).
- Broader service hardening and sandboxing coverage (systemd hardening drop-ins, namespace controls).
- NVMe module loading restrictions and related hardening updates.
- RAUC/manual install-path hardening for namespace-constrained contexts.
- OTA/update-path reliability hardening to reduce unsafe manual recovery scenarios.
- Firewall rule gating improvements for OTBR-enabled deployments.
- Expanded runbooks for build, security, partitions, RAUC OTA, FIT signing, and OTBR operation.
- Added adaptive OTA benchmark and troubleshooting guidance for field validation.
- Added HTTPS streaming OTA notes and refreshed operational docs for build/partition/security flows.