Skip to content

flipperdevices/flipperos-installer-initramfs

Repository files navigation

flipperos-installer-initramfs

Buildroot builder for an initramfs-only ARM64 image that runs the flipperos-installer — the on-device installer for Rockchip RK3576 (Flipper One) boards.

The build produces a standalone initramfs archive in two forms:

  • output/images/rootfs.cpio — uncompressed
  • output/images/rootfs.cpio.zst — zstd-compressed (kernel must support CONFIG_RD_ZSTD)

There is no kernel and no bootloader here — just the initramfs the kernel unpacks and runs.

Layout

This repository is a Buildroot BR2_EXTERNAL tree (external.desc name: FLIPPEROS) with Buildroot itself vendored as a submodule:

.
├── Makefile                       # out-of-tree wrapper around the submodule
├── external.desc / Config.in / external.mk
├── configs/
│   └── flipperos_installer_defconfig
├── package/
│   └── flipperos-installer/       # the installer package (cargo-package)
│       ├── Config.in
│       └── flipperos-installer.mk
├── board/flipperos/
│   └── rootfs-overlay/
│       ├── etc/inittab            # BusyBox init: mounts, rcS/udev, run installer
│       └── usr/bin/flipperos-installer-launch  # ctty + frontend select + exec
└── buildroot/                     # submodule, pinned at release 2026.05.1

Prerequisites

A normal Buildroot host: make, gcc, git, wget, cpio, bc, rsync, unzip, plus network access (Buildroot downloads sources, and the installer's Cargo dependencies are vendored at download time).

Usage

# One-time: fetch the Buildroot submodule (if cloned without --recurse-submodules)
git submodule update --init buildroot

# Configure (auto-loads the defconfig) and build the initramfs
make

# Images:
ls output/images/          # rootfs.cpio  rootfs.cpio.zst

The toplevel Makefile forwards every target to the pinned Buildroot submodule, building out-of-tree into ./output with this directory attached as BR2_EXTERNAL. So any Buildroot target works:

make menuconfig                       # tweak the config
make savedefconfig                    # write changes back to configs/
make flipperos-installer-rebuild      # rebuild just the installer
make clean                            # clean the output/build tree
make distclean                        # remove ./output entirely
make O=/tmp/build                     # override the output directory

What's in the image

Component Provided by Why
flipperos-installer package/flipperos-installer (Cargo) the installer, default tui + gui features
BusyBox BR2_PACKAGE_BUSYBOX shell + core applets used by /init
libinput, libxkbcommon, fontconfig, freetype selected by the package GUI (Slint / LinuxKMS, software renderer) link deps
eudev (libudev) BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV /dev management + input hotplug for the GUI
btrfs-progs selected by the package mkfs.btrfs
parted selected by the package partprobe
util-linux (basic set) selected by the package blkdiscard (mount/umount/chroot come from BusyBox)

The GUI uses Slint's software renderer with the backend-linuxkms-noseat backend, so no Mesa/OpenGL or libdrm-dev stack is required at link time.

Boot flow

The image uses BusyBox init (BR2_INIT_BUSYBOX). For an initramfs Buildroot installs a pre-init /init that mounts devtmpfs and execs /sbin/init. BusyBox init then reads our /etc/inittab (from the overlay): it mounts proc/sys/devpts, runs rcS (which starts udevd and coldplugs devices), then respawns flipperos-installer-launch on the console.

The launcher (usr/bin/flipperos-installer-launch in the overlay):

  • resolves the real console device from /sys/class/tty/console/active (/dev/console itself cannot be a controlling terminal) and binds the installer's stdio to it, so the TUI gets a working /dev/tty;
  • picks the frontend from the kernel command line — installer=both (default), tui, gui, or shell (drop to a prompt);
  • runs flipperos-installer --no-dry-run. Because the inittab entry is respawn, init restarts the installer if it exits.

Note: the installer runs with --no-dry-run, i.e. it performs a real, destructive install on boot. Edit the launcher if you want a dry-run image.

If the on-device display has no configured KMS pipeline (kernel logs rockchip-drm … Cannot find any crtc), the GUI cannot start — boot with installer=tui to use the serial console until the display is fixed.

Pinning

  • Buildroot: git submodule pinned at release 2026.05.1 (https://github.com/buildroot/buildroot.git). To move to another release: cd buildroot && git fetch --tags && git checkout <tag>, then commit the updated submodule pointer.
  • flipperos-installer: tracks the upstream dev branch (FLIPPEROS_INSTALLER_VERSION = dev), with its flipctl-fonts submodule fetched automatically (_GIT_SUBMODULES = YES).

Notes

  • Building a single frontend: set FLIPPEROS_INSTALLER_CARGO_INSTALL_OPTS = --no-default-features --features tui in the package .mk (e.g. for a slim serial-only image).
  • Toolchain: Buildroot 2026.05.1 ships Rust 1.96.1 (host-rust-bin by default), which satisfies the installer's rustc 1.95 / GUI MSRV 1.92. If you bump the installer to a newer MSRV, move the Buildroot pin forward for a newer host-rustc.

About

Buildroot-based recipe to produce an initramfs image with the Flipper OS installer

Resources

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages