emOS 0.6
emOS ships its own busybox, and provisioning a FireOS 6 device no longer
destroys the stock boot image. A controller built after this release cannot
build a FireOS 6 image against emOS 0.5 — it now requires busybox in the
payload bundle and refuses without it — so update this before the controller.
Our own busybox, because the old path depended on somebody else's
The FireOS 6 path starts DHCP with /sbin/udhcpc, and nothing ever shipped
one. It worked on the first v2 device only because amonet 2.0.0's OPTIONAL root
component had left a busybox behind. A plain stock FireOS 6 has toybox and no
busybox at all, so emOS booted, drove the combo chip, associated with our own
supplicant — and never got an address. ntpd, syslogd/klogd and em-wifi's
awk were all resolving through the same lookup.
The rule that produced: emOS must not depend on anything that is optional for
the unlock.
busybox 1.38.0, static ARM32, 397 applets, built on Alpine under qemu as a
native armv7 build. That is a deliberate exception to the pinned-NDK toolchain
the rest of this release uses: a static binary needs only the kernel's syscall
ABI, and busybox does not target bionic. Reproducible — three independent
builds produced the same binary.
Ours is searched FIRST on every layout. Everything else in that list belongs to
someone else — Amazon's on FireOS 5, a third-party root's on FireOS 6 — and
searching those first hands DHCP, the system log and NTP to a binary of unknown
vintage that a reflash can remove, with nothing reporting the swap.
GPL-2.0 source
busybox is GPL-2.0, the first thing this project distributes that obliges us to
ship SOURCE. The complete corresponding source accompanies the binary as
release assets, not as a link: busybox-1.38.0.tar.bz2 — the unmodified
upstream tarball this binary was built from, verified against its sha512 pin by
the release itself — together with busybox-LICENSE. The scripts used to
control compilation are emos/tools/build-busybox.sh in this repository. We
patch nothing; the build only configures, and it proves that by diffing the
tree it compiled against a fresh extraction.
The release fails if either asset is missing or the tarball does not match the
pin.
The stock boot image survives provisioning (FireOS 6 / amonet v2 only)
The wizard wrote the slot the device had BOOTED, which on a stock device is the
slot the stock image is in — so every provision destroyed it. That image is the
build reference for any future emOS image and the only way back to FireOS, and
we ship neither a kernel nor a userspace. Once both slots hold emOS there is
nothing left on the device to rebuild from.
Now each slot is classified from its own header: ANDROID! says there is a
boot image, and our own markers on the cmdline say it is ours. The stock one is
kept, emOS is written to the other, and the bootloader is pointed at it —
writing a slot does not select it, since Amazon's bootloader picks from a BCB
in misc.
If both slots already hold emOS, provisioning refuses, and names your
escrowed stock image as the way out. Every device provisioned before this
release is in that state. Keep the boot image you escrowed during
provisioning — on this hardware it is not recoverable from anywhere else.
emOS is also now PAIRED with the /system it was built beside: the packer
stamps emos.system=/dev/block/mmcblk0pN onto the image's own cmdline and init
mounts that, rather than assuming p13. Necessary because the boot slot and the
system slot are now deliberately different. A misparse there mounts a different
Amazon userspace and boots looking healthy, so cmdlinecheck is a fifth
off-target check covering it in CI.
FireOS 5 does not get stock preservation. v1's other-boot names the active
slot, so that flow still overwrites the stock image. Fixing it needs a v1
device to write against. Everything else here — busybox included — applies to
both.
Two console fixes
ANDROID_DATA is set, so commands stop printing two lines of tzdata warning
before their own output. console has a req, so an unexecutable shell logs
svc console absent once instead of respawning for ever — the failure mode
that hid the FireOS 6 system-as-root layout for a day.
Known, not a regression
ntpd runs and queries the router it got from DHCP, which serves no NTP, so it
backs off for ever. The clock stays at 2010 until the controller's ack
supplies the time.
What is published
emos-payload.zip — both inits, the three WiFi tools and busybox, with a
manifest of sha256s — plus the loose init for controllers that predate the
bundle, and the busybox source and licence.
What's Changed
- Release controller-ea 2.24.0-ea.1 by @wilbowes in #511
- Find the boot partition on an amonet v2 device, and refuse without its slot by @wilbowes in #514
- Release controller-ea 2.24.0-ea.2 by @wilbowes in #515
- Ask the recovery which tools it has, instead of assuming busybox by @wilbowes in #518
- Release controller-ea 2.24.0-ea.3 by @wilbowes in #519
- Ask dd whether it takes conv=, and notice when it has not run at all by @wilbowes in #521
- Make the read-back prove the partition, not the page cache by @wilbowes in #523
- Release controller-ea 2.24.0-ea.4 by @wilbowes in #522
- Journal the evening: emOS on FireOS 6, and the four builds getting there by @wilbowes in #526
- emOS ships its own busybox, and stops destroying the stock boot image by @wilbowes in #533
- Journal the day: our own busybox, and the stock boot image stops being collateral by @wilbowes in #534
Full Changelog: emos-v0.5...emos-v0.6