Gotchas at a glance
Configuration
Section titled “Configuration”- Unknown keys are ignored silently, at every level.
board:instead oftarget_board:does nothing. → Format -r/--runtimedoesn’t affect templating.{{ avocado.runtime }}, and a runtime’starget_board, come fromAVOCADO_RUNTIME, thendefault_runtime. → Templating{{ env.X }}withXunset becomes an empty string, not an error. That’s dangerous inpassword:. → Templating- A typo in an
avocado.*template is left in place, braces and all, with no error. → Templating - Overlay files aren’t templated unless the overlay sets
preprocess:. → Templating {{ avocado.kernel.version }}only works in package keys. → Templating- Quote versions:
version: 1.10becomes"1". YAML 1.2:yes/noare strings. → Format - An unrecognized object in
packages:is skipped without an error. → Format - Overrides replace lists; they don’t append, and a non-matching
target-/kernel-key is dropped silently. → Overrides rootfs.post_installreplaces all the defaults, including the usrmerge symlinks and the empty machine-id. → Schema
- Removing or renaming overlay files doesn’t remove them from the image, in merge or opaque mode. → Build state
- Removing an
enable_servicesentry leaves the service enabled. → Build state - Up-to-date checks only look at inputs. A bad image is reused until its inputs change.
--no-stampsre-runs steps but doesn’t remove stale files. → Build state - Don’t type out the kernel version in package names. Use
{{ avocado.kernel.version }}. → Kernel modules avocado cleanreplaces the build volume, anddocker run -v <old-name>creates an empty one. → Inspecting the volume- Templated kernel-module packages never make it into
avocado.lock. → Build state - Two runtimes on one target share extension sysroots through a symlink that follows the last runtime installed. → Build state
- Editing a compiled extension’s source doesn’t rebuild it unless the source is in
package_files. → Build state - A git
refthat isn’t a tag or branch builds the default branch. → Board variants sdk:2024is a moving tag. → Releases and channels
Device
Section titled “Device”modules-load.dandsysctl.din extensions don’t apply at boot. → Boot and mergeon_mergehas no shell, and a missing program fails the whole merge, so no extension services start. → on_merge- A failed
modprobe:only warns. → Kernel modules - networkd, resolved,
modules-load.dandsysctl.dnever see extension files at boot unless something orders them after the merge or reloads them. → Boot and merge on_mergeruns before D-Bus at boot, sonetworkctl reloadand friends silently do nothing there. Usesystemctl. → on_merge- A mask in an extension doesn’t stop that boot’s queued units, and prints
[FAILED]for the masked unit. Put masks in the rootfs. → Boot and merge modprobe:runs afterdaemon-reload, and changing only that list doesn’t rebuild the extension. → on_merge- machine-id is regenerated every boot, so
?hostnames and anything else derived from it change too. → Hostname and machine-id - Extension-only deploys don’t restart running services. The first reboot is the real test. → Deploy
- Keep a login path that doesn’t depend on extensions. → Boot and merge
Jetson
Section titled “Jetson”tegra-xudcloads late, so don’t gate a gadget onConditionPathExistsGlob. → Jetsonusbhidis built in, and Ctrl+Alt+Del ×7 forces a reboot even when masked. → Jetsonnvidia-drmnever loads by itself. → Jetson- The image ships a broken
getty@.servicelink that loops asgetty@gettyat every boot. → Jetson - The RTC can pull the clock back to 1970 after the merge. → Jetson
- The login console is
ttyTCU0, not thettyAMA0kernel messages may use. → Boot and merge - The Orin NX BSP extension leaves out CAN, Wi-Fi and camera modules that the Nano’s has. → Carrier boards
carrier.envneedsCARRIER_LABEL, or provisioning stops silently. → Carrier boardsnvbootctrllives in the BSP extension. An empty BSP breaks the merge. → Jetson- Only the first
carrier-bsp/is used, whole, and a carrier BSP’s slot shadows one staged in the runtime build directory. → Carrier boards - A target flashes one module SKU. Another module (an 8GB Orin NX on
jetson-orin-nx, for example) needs its owncarrier.envvalues, and the image’snvpmodel.confstays the default SKU’s. → Carrier boards kernel.cmdline_extraand the project’sinitramfs:never reach a Jetson device, on eitherdeployorprovision. → Jetson boot imageavocado deploynever carries the kernel or kernel DTB on Jetson, only the rootfs. Only a reflash (avocado provision) touches them. → Deploy