-
Notifications
You must be signed in to change notification settings - Fork 63
Description
Moving this from ostreedev/ostree#1873
We've already hit problems in Silverblue with people having absolutely ancient GRUB2 UEFI binaries, see fwupd/fwupd#2084 (comment)
For FCOS today the bootloader is written at disk image image build time: https://github.com/coreos/coreos-assembler/blob/40c6d44497056b6af308ad7c7c9298a0ead3e975/src/create_disk.sh#L318
And then there is no mechanism we ship to update it (whether automatically or manually for that matter).
One thing that is nice is that since we shipped the aleph version marker we can at least reliably identify the versions of those binaries. (It would also be useful to have a tooling that checksums them and attempts to identify e.g. the RPM package version they came from).
I think my strawman is something like this:
- Write a new (theoretically distribution independent-ish) tool that takes ownership of this problem space, let's call it
bootupd
because we have lots of imagination - Write it in Rust, use e.g. https://github.com/coreos/afterburn/ as an example stub project
bootupd
can be passed a filesystem tree containing expected binaries (for UEFI) and replaces the bits increate_disk.sh
to write them to disk to start, and includes metadata about them, and also knows how to wrapgrub2-install
as needed for the MBR
Now, an important thing that needs to be discussed here is at what cadence we apply bootloader updates. It might be OK to simply do them whenever the distribution makes them, but we might also want to make that optional, because it is likely (without significant engineering effort) to be a "don't
turn off your computer right now" event.
It might be very useful for bootupd
to define its own little "upgrade graph" model, at least the ability to only apply updates if a bootloader is too old rather than doing it on every update.
And client side this should be configurable (and perhaps off by default).
Probably to start the simplest is for bootupd
to take as input a filesystem tree, a lot like /usr/lib/ostree-boot
rather than (like fwupd
and dnf/rpm-ostree
) defining its own mechanism for retrieving content from http etc.
For FCOS/RHCOS we can then e.g. choose to pin the bootloaders separately from the main ostree content, or ship them as they come in.