Over the air

Updates

Software Update
A/Bboot slots
Ed25519signed manifest
SHA-512per file
3trial boots

On the device

Pipeline

How a device updates Fetch the signed manifest, verify its Ed25519 signature, parse it, pick the inactive slot, fetch each file and check its SHA-512, write to the inactive slot, flip /BOOTSLOT to the new slot with trial=1 and tries=3; on restart the loader consumes a try and boots the trial slot; the OS commits trial=0 when healthy, or the loader rolls back to the last-good slot once tries reach zero. On the device · updater Fetch manifest + .sig Verify Ed25519 signature Parse XUP1 manifest Pick slot inactive slot Fetch files SHA-512 each Write to inactive slot Flip /BOOTSLOT trial=1 tries=3 staged · awaiting restart Next boot · loader Restart on request Loader tries − 1 Trial boot <slot>/kernel.bin Commit trial=0 no commit → reboot, tries − 1 tries = 0 → rollback active = last-good slot /BOOTSLOT states active=B trial=1 tries=3 staged active=B trial=1 tries=2 trial boot active=B trial=0 tries=0 committed active=A trial=0 tries=0 rolled back How a device updates Fetch the signed manifest, verify its Ed25519 signature, parse it, pick the inactive slot, fetch each file and check its SHA-512, write to the inactive slot, flip /BOOTSLOT to the new slot with trial=1 and tries=3; on restart the loader consumes a try and boots the trial slot; the OS commits trial=0 when healthy, or the loader rolls back to the last-good slot once tries reach zero. On the device · updater Fetch manifest + .sig Verify Ed25519 signature Parse XUP1 manifest Pick slot inactive slot Fetch files SHA-512 each Write to inactive slot Flip /BOOTSLOT trial=1 tries=3 staged · awaiting restart Next boot Restart on request Loader tries − 1 Trial boot <slot>/kernel.bin Commit trial=0 no commit tries − 1 tries = 0 tries = 0 → rollback active = last-good slot /BOOTSLOT states active=B trial=1 tries=3 staged active=B trial=1 tries=2 trial boot active=B trial=0 tries=0 committed active=A trial=0 tries=0 rolled back
src/net/updater.c · boot/boot_uefi.c

/BOOTSLOT

active=A            # or B  -> which slot to boot
trial=1            # 1 = this slot is newly-updated and unconfirmed
tries=3            # boot attempts left before auto-rollback

UPDATER_DESIGN.md · updater design

XUP1

Manifest

manifest.txt

XUP1
version=<string>
slot=<kernel|data|full>
notes=<one line, optional>
file <relpath> <size> <sha512hex>
...

tools/xeris_update_sign.py

Magic
XUP1
Signature
manifest.sig · Ed25519 · 64 raw bytes
Per-file hash
SHA-512
Limits
24 000 files · 8 MB manifest (UPD_MAXFILES, UPD_MANBUF)
Version
forward only · equal = “already current” · older = refused
notes=
one line, optional

slot=

slot=PayloadLands atBoot slot
kernelkernel.bin/<slot>/kernel.binflips to the inactive slot · trial=1 tries=3
dataone runtime file/ (volume root)no flip
fullkernel.bin + XCRAFT.ELF UPDTST2.ELF ABOUT XKBMAP.TXT ari/<slot>/…flips to the inactive slot · trial=1 tries=3

src/net/updater.c · release.mk

Servers

Endpoints

URLServesTransport
updates.xerisos.com/manifest.txtsigned manifestHTTP · 301 to https followed
updates.xerisos.com/manifest.sigEd25519 signature, 64 raw bytes, over manifest.txtHTTP
updates.xerisos.com/<relpath>each payload file named in the manifest, SHA-512 checkedHTTP
components.xerisos.com/web/Web component · our Chromium build, CHROME.ELF, fetched on first useHTTPS manifest · HTTP files
components.xerisos.com/office/26.8.0/LibreOffice component · corresponding sourceHTTPS manifest · HTTP files

src/net/updater.c · src/net/component_url.h · tools/component.mk

COMPONENTS.TXT · shipped on the image

XCOMP1
# XerisOS runtime components. The OS fetches these on demand and verifies each
# against its own signed per-component manifest (Ed25519, same key as updates).
# Regenerate with: make -f tools/component.mk components-manifest
component web https://components.xerisos.com/web/ latest / CHROME.ELF

tools/stage_image.ps1 · · installing the browser · LibreOffice

Updates
updates.xerisos.com
Components
components.xerisos.com
Key
same Ed25519 key as updates
Browser
never on the OS image · downloaded on first use

On the device

Software Update

Software Update

Check for updatesInstall nowRestart nowDetails

src/apps/updater_ui.c

Terminal

update
open the Software Update window
update --check
check and report here; downloads nothing
update --install
run the full signed A/B update, then reboot
update --restart
restarting to apply the update
update --status
what this machine is running

src/core/shell.c

Now serving

0.20.20