Files
sprout/README.md

170 lines
6.8 KiB
Markdown
Raw Normal View History

<div align="center">
2025-10-01 16:45:04 -07:00
2025-10-24 16:49:34 -07:00
![Sprout Logo](assets/logo-small.png)
2025-10-14 22:58:02 -07:00
# Sprout
</div>
2025-10-14 22:58:02 -07:00
2025-11-01 02:04:52 -04:00
Sprout is a programmable UEFI bootloader written in Rust.
2025-10-19 20:25:47 -07:00
2025-11-01 02:04:52 -04:00
It is in use at Edera today in development environments and is intended to ship to production soon.
2025-10-14 22:58:02 -07:00
2025-11-01 02:04:52 -04:00
The name "Sprout" is derived from our company name "Edera" which means "ivy."
2025-10-19 00:25:11 -07:00
Given that Sprout is the first thing intended to start on an Edera system, the name was apt.
2025-10-19 00:38:36 -07:00
It supports `x86_64` and `ARM64` EFI-capable systems. It is designed to require UEFI and can be chainloaded from an
2025-10-19 00:25:11 -07:00
existing UEFI bootloader or booted by the hardware directly.
2025-10-19 00:38:36 -07:00
Sprout is licensed under Apache 2.0 and is open to modifications and contributions.
2025-11-02 19:26:02 -05:00
**NOTE**: Sprout is still in beta. Some features may not work as expected.
Please [report any bugs you find](https://github.com/edera-dev/sprout/issues/new/choose).
2025-10-24 14:49:11 -07:00
## Background
At [Edera] we make compute isolation technology for a wide variety of environments, often ones we do not fully control.
2025-11-01 02:04:52 -04:00
Our technology uses a hypervisor to boot the host system to provide a new isolation mechanism that works
with or without hardware virtualization support. To do this, we need to inject our hypervisor at boot time.
2025-10-24 14:49:11 -07:00
2025-11-01 02:04:52 -04:00
Unfortunately, GRUB, the most common bootloader on Linux systems today, uses a shell-script like
2025-10-24 14:49:11 -07:00
configuration system. Both the code that runs to generate a GRUB config and the GRUB config
itself is fully turing complete. This makes modifying boot configuration difficult and error-prone.
Sprout was designed to take in a machine-readable, writable, and modifiable configuration that treats boot information
like data plus configuration, and can be chained from both UEFI firmware and GRUB alike.
Sprout aims to be flexible, secure, and modern. Written in Rust, it handles data safely and uses unsafe code as little
as possible. It also critically must be easy to install into all common distributions, relying on simple principles to
simplify installation and usage.
2025-10-20 10:34:55 -07:00
## Documentation
2025-11-02 19:26:02 -05:00
### Setup Guides
Some guides support Secure Boot and some do not.
We recommend running Sprout without Secure Boot for development, and with Secure Boot for production.
| Operating System | Secure Boot Enabled | Link |
|------------------|---------------------|-------------------------------------------------------|
| Fedora | ✅ | [Setup Guide](./docs/setup/signed/fedora.md) |
2025-11-02 19:52:25 -05:00
| Debian | ✅ | [Setup Guide](./docs/setup/signed/debian.md) |
| Ubuntu | ✅ | [Setup Guide](./docs/setup/signed/ubuntu.md) |
| openSUSE | ✅ | [Setup Guide](./docs/setup/signed/opensuse.md) |
2025-11-02 19:26:02 -05:00
| Fedora | ❌ | [Setup Guide](./docs/setup/unsigned/fedora.md) |
| Alpine Edge | ❌ | [Setup Guide](./docs/setup/unsigned/alpine-edge.md) |
| Generic Linux | ❌ | [Setup Guide](./docs/setup/unsigned/generic-linux.md) |
| Windows | ❌ | [Setup Guide](./docs/setup/unsigned/windows.md) |
### Project Documentation
2025-10-20 10:34:55 -07:00
- [Development Guide]
- [Contributing Guide]
- [Sprout License]
- [Code of Conduct]
- [Security Policy]
2025-10-19 00:38:36 -07:00
## Features
### Current
- [x] Loadable driver support
- [x] Basic [Bootloader specification (BLS)](https://uapi-group.org/specifications/specs/boot_loader_specification/) support
2025-10-19 00:38:36 -07:00
- [x] Chainload support
- [x] Linux boot support via EFI stub
2025-10-20 20:35:13 -07:00
- [x] Windows boot support via chainload
2025-10-19 00:38:36 -07:00
- [x] Load Linux initrd from disk
- [x] Basic boot menu
- [x] BLS autoconfiguration support
- [x] [Secure Boot support](https://github.com/edera-dev/sprout/issues/20): beta
- [x] [Bootloader interface support](https://github.com/edera-dev/sprout/issues/21): beta
- [x] [BLS specification conformance](https://github.com/edera-dev/sprout/issues/2): beta
2025-10-19 00:38:36 -07:00
### Roadmap
- [ ] [Full-featured boot menu](https://github.com/edera-dev/sprout/issues/1)
- [ ] [UKI support](https://github.com/edera-dev/sprout/issues/6): partial
- [ ] [multiboot2 support](https://github.com/edera-dev/sprout/issues/7)
- [ ] [Linux boot protocol (boot without EFI stub)](https://github.com/edera-dev/sprout/issues/7)
2025-10-19 00:38:36 -07:00
## Concepts
- drivers: loadable EFI modules that can add functionality to the EFI system.
- autoconfiguration: code that can automatically generate sprout.toml based on the EFI environment.
2025-10-19 00:38:36 -07:00
- actions: executable code with a configuration that can be run by various other sprout concepts.
- generators: code that can generate boot entries based on inputs or runtime code.
- extractors: code that can extract values from the EFI environment.
- values: key-value pairs that can be specified in the configuration or provided by extractors or generators.
- entries: boot entries that will be displayed to the user.
- phases: stages of the bootloader that can be hooked to run actions at specific points.
2025-10-19 00:25:11 -07:00
## Usage
Sprout is provided as a single EFI binary called `sprout.efi`.
It can be chainloaded from GRUB or other UEFI bootloaders or booted into directly.
Sprout will look for \sprout.toml in the root of the EFI partition it was loaded from.
See [Configuration](#configuration) for how to configure sprout.
## Configuration
Sprout is configured using a TOML file at `\sprout.toml` on the root of the EFI partition sprout was booted from.
### Command Line Options
Sprout supports some command line options that can be combined to modify behavior without the configuration file.
```bash
# Boot Sprout with a specific configuration file.
$ sprout.efi --config=\path\to\config.toml
# Boot a specific entry, bypassing the menu.
$ sprout.efi --boot="Boot Xen"
# Autoconfigure Sprout, without loading a configuration file.
$ sprout.efi --autoconfigure
```
2025-10-19 00:25:11 -07:00
### Boot Linux from ESP
```toml
# sprout configuration: version 1
version = 1
# add a boot entry for booting linux
# which will run the boot-linux action.
[entries.boot-linux]
title = "Boot Linux"
actions = ["boot-linux"]
# use the chainload action to boot linux via the efi stub.
# the options below are passed to the efi stub as the
# kernel command line. the initrd is loaded using the efi stub
# initrd loader mechanism.
[actions.boot-linux]
chainload.path = "\\vmlinuz"
chainload.options = ["root=/dev/sda1"]
chainload.linux-initrd = "\\initrd"
```
### Bootloader Specification (BLS) Support
```toml
# sprout configuration: version 1
version = 1
# load an EFI driver for ext4.
[drivers.ext4]
path = "\\sprout\\drivers\\ext4.efi"
# global options.
[options]
# enable autoconfiguration by detecting bls enabled
# filesystems and generating boot entries for them.
autoconfigure = true
2025-10-19 00:25:11 -07:00
```
2025-10-20 10:34:55 -07:00
2025-10-24 14:49:11 -07:00
[Edera]: https://edera.dev
2025-10-20 10:34:55 -07:00
[Development Guide]: ./DEVELOPMENT.md
[Contributing Guide]: ./CONTRIBUTING.md
[Sprout License]: ./LICENSE
[Code of Conduct]: ./CODE_OF_CONDUCT.md
[Security Policy]: ./SECURITY.md