Systems Software Engineer · Cologne, Germany

Umair
Ahmed Shah

I build systems software — embedded Linux, wireless firmware, edge infrastructure, OTA pipelines, and whatever else the project demands. This is where I write about what actually happened.

Embedded Linux Yocto Zephyr Rust Go IoT / Edge CI/CD

When the Kernel Outgrew the Bootloader: A Clean Install That Never Booted

A debug-info kernel overshoots U-Boot’s decompression buffer by 1.85 MiB. The bundle verifies at every layer, RAUC reports success, and the board silently falls back to the old slot, because the one property that mattered is only observable at bootm time on the device.

May 7, 2026 · 8 min · Umair Ahmed Shah

Moving RAUC's HTTPS Streaming Key into TPM2 via PKCS#11

Migrating RAUC’s mTLS client key from a file on disk to a TPM2-backed PKCS#11 URI. The recipe wiring was straightforward; the URI was not. module-path is a p11-kit URI extension that libp11 — the parser RAUC’s streaming path actually uses — rejects outright.

April 23, 2026 · 11 min · Umair Ahmed Shah

RAUC Streaming OTA: When the Sandbox User Can't Reach the TPM

Switching RAUC’s streaming mTLS client key from a file path to a PKCS#11 URI produced a one-line error with no obvious cause. The real problem was not the module path, not the engine, and not a missing PIN — it was the sandbox user’s group membership and what tpm2-pkcs11 needs to initialise.

April 21, 2026 · 7 min · Umair Ahmed Shah

Packaging Telegraf for Yocto: Build Tags, a Linker Collision, and Credentials That Can't Live in the Rootfs

No OE recipe for Telegraf exists upstream. What looked like a straightforward packaging task turned into a Go linker collision, a PIE/CGO conflict, and a credential problem that ruled out the obvious solution entirely.

April 15, 2026 · 8 min · Umair Ahmed Shah

Hardening OTBR: Reading a 4.1 systemd-analyze Score

Part 1 got OTBR running as a non-root user with three capabilities. Part 2 covers the hardening block in the service file — what each directive does, why one had to be an exception, and how to use systemd-analyze security as a decision tool rather than a score to chase. Part 2 of 2.

April 14, 2026 · 8 min · Umair Ahmed Shah

Running OTBR as Non-Root: Finding the Capability Floor

OpenThread Border Router assumes it runs as root. Getting it down to a least-privilege non-root user means figuring out exactly what it needs — which turned out to be a source code problem, not a trial-and-error problem. Part 1 of 2.

April 14, 2026 · 9 min · Umair Ahmed Shah