Commit Graph

12 Commits (d9415b0fb556e93e09ba5231604cd0f7b8e777e1)

Author SHA1 Message Date
Dustin d9415b0fb5 Set machine-id to uninitialized
An empty `/etc/machine-id` file does _not_ trigger systemd's "first
boot" logic.  This means with `ConditionFirstBoot=true` will not run,
and the unit preset policy will not be applied.  To ensure a first boot
behaves the way we want, we need to pre-populate the `/etc/machine-id`
file with the string `uninitialized\n`, per _machine-id(5)_ § _First
Boot Semantics_.
2025-09-03 09:48:20 -05:00
Dustin f838e9f0bd Do not run systemd preset-all at build time
Aimee OS/aimee-os/pipeline/head This commit looks good Details
Let systemd apply preset policy on first boot.  This keeps symlinks out
of the immutable image.
2025-09-03 08:30:19 -05:00
Dustin f3c6c71bfa Force built-in kernel overlayfs driver
Aimee OS/aimee-os/pipeline/head This commit looks good Details
As with the other "real" filesystems, we need the OverlayFS driver to be
built into the kernel so it is available in early boot.
2025-08-31 08:09:18 -05:00
Dustin 7d44d03279 Force built-in kernel support for filesystems
Aimee OS/aimee-os/pipeline/head This commit looks good Details
the `KCONFIG_ENABLE_OPT` macro will not switch a `=m` value to `=y`, so
if the downstream kernel configuration already enables these
filesystems as modules, they will not get built into the kernel image,
making the system unbootable.  We need to call `KCONFIG_SET_OPT` instead
to explicitly set them to be built-in.
2025-08-30 15:36:07 -05:00
Dustin 9d00ebfdba Use LINUX_IMAGE_NAME to find kernel file
Aimee OS/aimee-os/pipeline/head This commit looks good Details
It turns out, Buildroot already sets a variable, `LINUX_IMAGE_NAME`,
that holds the name of the Linux kernel image file.  Instead of figuring
it out for ourselves (incorrectly, it turns out), we can just use that.
2025-08-30 14:04:53 -05:00
Dustin 821ea84ea7 Implement system-update feature
The `system-update` and `install-update` scripts are the same as from
Aimee OS v1, with references to Gentoo replaced, of course.  We need
some additional kernel features in order to mount the firmware partition
and update the GRUB environment file, and of course the `grub-editenv`
tool itself.  We also need `wget` for now, since that's how the tool
downloads the specified update file from the network.

Eventually, `system-update` will be replaced by a much more robust tool,
with package URL discovery, signature verification, etc.  The shell
script will do for now while development is still proceeding rapidly.
2025-08-30 11:21:44 -05:00
Dustin 7e5a83ba28 configs/*: Move GRUB, kernel config to external.mk
The fewer required items in each defconfig file, the easier they will be
to maintain.
2025-08-29 20:29:43 -05:00
Dustin 44b2ce8a99 Begin persistent storage implementation
Aimee OS/aimee-os/pipeline/head This commit looks good Details
Most of the logic in the `init-storage` script is the same as it was in
Aimee OS v1 (Gentoo).  The major difference is now we are initializing
the data volume in the initramfs instead of in the real OS.  This allows
us to make all of `/etc` writable via OverlayFS, instead of having only
certain sub-directories writable via bind-mounts.

Buildroot doesn't really have any tools for building an initramfs,
unfortunately.  It does have a bit of infrastructure for running
`dracut`, but I'd really rather avoid having that much complexity in the
initramfs; all we need is to run the `init-storage` script and then
switch root.  Instead, the `mkinitramfs.sh` script, called in the
post-build stage, creates the CPIO archive from files in the target
directory.  The only particularly interesting bit is how it resolves
shared library dependencies, to make sure the appropriate resources are
available for the requisite commands.

I briefly considered building a statically-linked BusyBox just for the
initramfs.  Since it doesn't provide several important tools like
`btrfs`/`mkfs.btrfs`, I had to implement the dynamic link resolution
function anyway.  It made sense, then, to copy Dash and the necessary
Coreutils binaries themselves.
2025-08-29 20:17:52 -05:00
Dustin 8a2d305b04 grub2: Support setting rootflags in config
The `AIMEEOS_DEFAULT_ROOTFLAGS` kconfig option can be used to set the
default value for the `rootflags` GRUB2 environment variable.  The value
of this variable will be passed along as command-line arguments to
whatever kernel is chosen at boot.

Since post-image scripts do not have access to kconfig option values, we
need to build the GRUB2 environment file in the
`GRUB2_INSTALL_IMAGES_CMDS` script fragment instead.
2025-08-29 20:17:52 -05:00
Dustin 3a0d599ff6 gen-grub-cfg: Support different kernel file names
Different architectures and/or configurations can use a different name
for the Linux kernel image file.  The `gen-grub-cfg.sh` shell script
needs to be able to identify the correct file name in the GRUB
configuration fragment it embeds in the root filesystem image.
2025-08-29 20:13:18 -05:00
Dustin 9dae022788 First working revision
At this point, we can generate an SD card image that is composed of an
EFI system partition, a SquashFS root partition (a), a blank root
partition (b), and a data partition.  On the EFI system partition are
the Raspberry Pi firmware and device trees, U-Boot and GRUB.  The
SquashFS filesystem contains the kernel and the whole filesystem tree.

A Raspberry Pi can successfully boot from an SD card containing this
image.  It's not quite usable yet, because there's no writable storage
available, or indeed any way to log in.
2025-08-17 16:01:40 -05:00
Dustin e267f82db1 Initial commit 2025-08-17 10:30:19 -05:00