Skip to main content

Update Process

This page describes the end-to-end OS bundle update flow that occurs when a runtime with a different os_build_id than the running system is activated.

End-to-End Update Flow​

1. Extract Bundle​

The .aos file (a tar.zst compressed archive) is extracted to a staging directory at /var/lib/avocado/.os-update-staging/. Any previous staging artifacts are cleaned up first.

2. Parse bundle.json​

The bundle.json file is read and parsed. See Bundle Format for the full specification.

3. Check If Already Up-to-Date​

If a verify configuration is present, avocadoctl checks the current system's /etc/os-release (or /sysroot/etc/os-release in initrd scope). If the field already matches the expected value, the update is skipped.

4. Detect Current Slot​

The configured slot detection strategy determines the currently active boot slot:

  • uboot-env -- Reads the U-Boot environment variable.
  • command -- Runs the configured command and reads stdout.
  • sdboot-efi -- Checks which EFI partition is mounted.

5. Determine Inactive Slot​

For an A/B strategy, the inactive slot is the opposite of the current slot (e.g., if current is "a", target is "b").

6. Write Artifacts​

Each artifact is written to the inactive slot's target partition:

  1. The artifact file's SHA-256 hash is verified against the expected value.
  2. For GPT targets: the partition is identified by PARTLABEL.
  3. For MBR targets: the partition offset is resolved from the layout configuration.
  4. The artifact is written to the target device/partition using buffered I/O with fsync.

7. Activate New Slot​

The activate actions are executed in order to update the boot configuration:

  • U-Boot environment variables are set.
  • Shell commands are executed.
  • MBR partition tables are rewritten.
  • EFI boot entries are updated.

8. Write Pending Update Marker​

A pending-update.json file is written to the avocado base directory containing:

{
"os_build_id": "avocado-os-20260312",
"initramfs_build_id": "initramfs-20260312",
"verify": {
"type": "os-release",
"field": "AVOCADO_OS_BUILD_ID",
"expected": "avocado-os-20260312"
},
"verify_initramfs": {
"type": "os-release",
"field": "AVOCADO_INITRAMFS_BUILD_ID",
"expected": "initramfs-20260312"
},
"rollback": [],
"previous_slot": "a",
"layout": {},
"runtime_id": "a1b2c3d4-e5f6-7890-abcd-ef0123456789"
}

The runtime_id field identifies which runtime to activate after successful verification.

9. Reboot​

The system must be rebooted to boot into the new OS image on the inactive slot.

10. Post-Boot Verification​

On the next boot, avocadoctl checks for pending-update.json:

  1. If present, reads the verify configuration.
  2. Checks /etc/os-release for the expected field value.
  3. If verification succeeds: activates the runtime (switches the active symlink) and refreshes extensions.
  4. If verification fails: executes rollback actions to restore the previous boot slot.

Streaming Mode​

When stream_os_to_partition = true is set in the configuration, OS bundle artifacts are streamed directly from HTTP to the target partition during a TUF-based update. This skips the intermediate staging step.

Trade-offs:

  • Reduces disk I/O and temporary storage requirements.
  • Disables resumable downloads for the OS bundle (the entire artifact must be re-downloaded on failure).
  • Extension images are still staged normally.

Cleanup​

After a successful update (or skip), the staging directory at /var/lib/avocado/.os-update-staging/ is removed.