Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/systemboot/systemboot
SystemBoot is a LinuxBoot distribution that works as a system firmware + bootloader, based on u-root
https://github.com/systemboot/systemboot
boot bootloader coreboot dhcp firmware kernel kexec netboot uefi vpd
Last synced: 10 days ago
JSON representation
SystemBoot is a LinuxBoot distribution that works as a system firmware + bootloader, based on u-root
- Host: GitHub
- URL: https://github.com/systemboot/systemboot
- Owner: systemboot
- License: bsd-3-clause
- Archived: true
- Created: 2018-04-23T17:26:07.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2019-07-07T18:08:29.000Z (over 5 years ago)
- Last Synced: 2024-08-02T02:15:02.823Z (3 months ago)
- Topics: boot, bootloader, coreboot, dhcp, firmware, kernel, kexec, netboot, uefi, vpd
- Language: Go
- Homepage:
- Size: 97.4 MB
- Stars: 112
- Watchers: 22
- Forks: 17
- Open Issues: 32
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# systemboot
[![Build Status](https://travis-ci.org/systemboot/systemboot.svg?branch=master)](https://travis-ci.org/systemboot/systemboot)
[![codecov](https://codecov.io/gh/systemboot/systemboot/branch/master/graph/badge.svg)](https://codecov.io/gh/systemboot/systemboot)
[![Go Report Card](https://goreportcard.com/badge/github.com/systemboot/systemboot)](https://goreportcard.com/report/github.com/systemboot/systemboot)> Note: systemboot [has been merged into u-root](https://github.com/u-root/u-root/pull/1255).
> This repository is now read-only and staying only for historical reasons, but you should build
> your bootloader entirely from u-root.
> How? The CLI tools have been moved under [u-root/cmds/boot](https://github.com/u-root/u-root/tree/master/cmds/boot/){fbnetboot,localboot,uinit},
> the libraries under [u-root/pkg/]{bootconfig,booter,checker,crypto,recovery,rng,storage,vpd}.
> [u-root/tools/vpdbootmanager](https://github.com/u-root/u-root/tree/master/tools/vpdbootmanager) and
> [u-root/examples/fixmynetboot](https://github.com/u-root/u-root/tree/master/examples/fixmynetboot).SystemBoot is a distribution for LinuxBoot to create a system firmware + bootloader. It is based on [u-root](https://github.com/u-root/u-root). The provided programs are:
* `netboot`: a network boot client that uses DHCP and HTTP to get a boot program based on Linux, and uses kexec to run it
* `localboot`: a tool that finds bootable kernel configurations on the local disks and boots them
* `uinit`: a wrapper around `netboot` and `localboot` that just mimicks a BIOS/UEFI BDS behaviour, by looping between network booting and local booting. The name `uinit` is necessary to be picked up as boot program by u-root.This work is similar to the `pxeboot` and `boot` commands that are already part of u-root, but approach and implementation are slightly different. Thanks to Chris Koch and Jean-Marie Verdun for pioneering in this area.
This project started as a personal experiment under github.com/insomniacslk/systemboot but it is now an effort of a broader community and graduated to a real project for system firmwares.
The next sections go into further details.
## netboot
The `netboot` client has the duty of configuring the network, downloading a boot program, and kexec'ing it.
Optionally, the network configuration can be obtained via SLAAC and the boot program URL can be overridden to use a known endpoint.In its DHCP-mode operation, `netboot` does the following:
* bring up the selected network interface (`eth0` by default)
* make a DHCPv6 transaction asking for network configuration, DNS, and a boot file URL
* extract network and DNS configuration from the DHCP reply and configure the interface
* extract the boot file URL from the DHCP reply and download it. The only supported scheme at the moment is HTTP. No TFTP, sorry, it's 2018 (but I accept pull requests)
* kexec the downloaded boot programThere is an additional mode that uses SLAAC and a known endpoint, that can be enabled with `-skip-dhcp`, `-netboot-url`, and a working SLAAC configuration.
## localboot
The `localboot` program looks for bootable kernels on attached storage and tries to boot them in order, until one succeeds.
In the future it will support a configurable boot order, but for that I need [Google VPD](https://chromium.googlesource.com/chromiumos/platform/vpd/) support, which will come soon.In the current mode, `localboot` does the following:
* look for all the locally attached block devices
* try to mount them with all the available file systems
* look for a GRUB configuration on each mounted partition
* look for valid kernel configurations in each GRUB config
* try to boot (via kexec) each valid kernel/ramfs combination found aboveIn the future I will also support VPD, which will be used as a substitute for EFI variables, in this specific case to hold the boot order of the various boot entries.
## uinit
The `uinit` program just wraps `netboot` and `localboot` in a forever-loop logic, just like your BIOS/UEFI would do. At the moment it just loops between netboot and localboot in this order, but I plan to make this more flexible and configurable.
## How to build systemboot
* Install a recent version of Go, we recommend 1.10 or later
* make sure that your PATH points appropriately to wherever Go stores the
go-get'ed executables
* Then build it with the `u-root` ramfs builder using the following commands:```
go get -u github.com/u-root/u-root
go get -u github.com/systemboot/systemboot/{uinit,localboot,netboot}
u-root -build=bb core github.com/systemboot/systemboot/{uinit,localboot,netboot}
```The initramfs will be located in `/tmp/initramfs_${platform}_${arch}.cpio`.
More detailed information about the build process for a full LinuxBoot firmware image
using u-root/systemboot and coreboot can be found in the [LinuxBoot book](https://github.com/linuxboot/book)
chapter 11, [LinuxBoot using coreboot, u-root and systemboot](https://github.com/linuxboot/book/blob/master/11.coreboot.u-root.systemboot/README.md).## Example: LinuxBoot with coreboot
One of the ways to create a LinuxBoot system firmware is by using
[coreboot](https://coreboot.org) do the basic silicon and DRAM initialization,
and then run Linux as payload, with u-root and systemboot as initramfs. See the
following diagram:![LinuxBoot and coreboot](resources/LinuxBoot.png)
(images from coreboot.org and wikipedia.org, diagram generated with draw.io)## Build and run as a fully open source bootloader in Qemu
Systemboot is one of the parts of a bigger picture: running Linux as firmware.
We call this [LinuxBoot](https://linuxboot.org), and it can be achieved in various
ways. One of these is by combining [coreboot](https://coreboot.org), [Linux](https://kernel.org),
[u-root](https://u-root.tk) and `systemboot`. Check out the instructions on the
[LinuxBoot using coreboot, u-root and systemboot](https://github.com/linuxboot/book/tree/master/11.coreboot.u-root.systemboot)
chapter of the [LinuxBoot Book](https://github.com/linuxboot/book).## TODO
* verified and measured boot
* a proper GRUB config parser
* backwards compatibility with BIOS-style partitions