If you want to understand the issue Canoeboot had with GNU Boot, please read the about page and the Libreboot Binary Blob Reduction Policy. Basically, the FSF decided to attempt a hostile fork of Libreboot, which they announced on 19 March 2023 at their 2023 LibrePlanet conference. You can read about that and more of the history between GNU/FSF and Libreboot, by also reading the 10-year anniversary history page on libreboot.org - Canoeboot started in self defense, to provide a project that is as technically superior to GNU Boot as possible, while adhering to GNU Free System Distribution Guidelines as policy, which is the same policy that GNU Boot uses, in contrast to Libreboot’s Binary Blob Reduction Policy.
Canoeboot is aggressively developed, rebasing upon each new release of Libreboot and, thus, maintaining absolute sync with Libreboot. It does this by providing all of the same boards and features, minus those boards/features or behaviours that are not in line with GNU policy. As a result, Canoeboot has weaker hardware support, but it provides a solution to those hardcore diehards who absolutely must have everything adhere to GNU.
tl;dr as of 26 October 2023, Canoeboot code is about 1 year ahead of GNU Boot in terms of development, and about 2 years ahead in terms of documentation. Read on, if you want details. GNU Boot is also known as gnuboot. The purpose of Canoeboot is to demonstrate the inferiority of GNU policy, by providing the highest quality releases possible, based on Libreboot, keeping sync with Libreboot while showing what boards/features would have to be removed from Libreboot, if it were to comply with GNU Boot. In other words, Canoeboot is the logical conclusion of what is possible under GNU policy.
Libreboot’s Binary Blob Reduction Policy provides an alternative, where users have boot firmware that is as much free software as possible, while not being dogmatic about it. You can learn more by reading that policy.
Canoeboot and GNU Boot are both forks of Libreboot, designed to comply with the GNU Free System Distribution Guidelines. This page is maintained, to show the differences between these two projects.
This current version of the page pertains to Canoeboot 20231026 versus GNU Boot 0.1 RC. You can find GNU Boot (“gnuboot”) on the GNU Savannah website.
You can also read the Canoeboot 20231101 changelog; that release only came out 7 days after the 20231026 release, so the rest of this page is more or less accurate, when combined with the facts on the 20231101 announcement.
This fact is very important; nonGeNUine Boot’s 20230717 changelog is relative to Libreboot 20220710, and Canoeboot 20231026’s changelog is relative to nonGeNUine Boot 20230717’s changelog.
Therefore, this page will analyse differences in both projects, at these two points. First, let’s analyse GNU Boot, with the tag reset to
0.1-rc1, which corresponds to commit ID
a64d284fd798d843133c9d7274bba17bd7837174. Since GNU Boot also contains the Libreboot history that it forked from, it contains the Libreboot 20220710 release tag, so we can do this:
git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' --abbrev-commit 20220710..0.1-rc1
Within the GNU Boot git repository, this would yield the following response:
* a64d284 .gitignore: order alphabetically
* 0df4fe5 GRUB: config from HDD/SSD: Add support for gnuboot_grub.cfg
* ce13d22 GRUB: Use GNU Boot logo
* 74b678c GRUB: Say the name GNUBoot in the grub menu
* eeddd2b build/dependencies: debian: adding python-is-python3 to build seabios properly
* 58b8e09 coreboot/fam15h: don't build ada toolchain for generic platforms
* f7c0fec coreboot/fam15h: update code base, deblob, unset CONFIG_STM (see bug #64535)
* de9297f coreboot/fam15h: fix crossgcc acpica build on newer hostcc
* c38348d coreboot/fam15h: fix for gcc/gnat building
* 0d77d99 coreboot/fam15h: fixing binutils not building properly
* b773079 coreboot/default, coreboot/fam15h: use GNU mirror for acpica
* bf17993 Continue Libreboot under the GNU project
And that’s all. The fam15h-related fixed are actually merged from the
fsdg20230625 branch of Libreboot, made during July 2023. See: https://browse.libreboot.org/lbmk.git/log/?h=fsdg20230625
The other patches are also merged (cherry-picked) from Libreboot! The above commit log is all that GNU Boot did, for their 0.1 RC1 release.
Therefore, to know the differences between Canoeboot and GNU Boot, I will copy all items first from the nonGeNUine Boot 20230717 change log, and then the Canoeboot 20231026 change log, but I will skip those entries that define features which GNU Boot already has.
On this day, GNU Boot’s current commit ID (in the
main branch) is
54c6ae497d49c233b654c171978baa77b90ffe17 from 12 October 2023. Most of the changes since 0.1 RC1 up to that commit are just documentation changes, and even still, only cherry-picking minor patches here and there that were already done in Libreboot, in some cases years ago. It’s worth noting that the GNU Boot documentation is based on Libreboot documentation from late 2021 or at most, very early 2022.
I don’t need to compare documentation, and it would take too long. Their documentation is 2 years out of date, what more is there to say?
Now, feature comparisons in the build systems:
Canoeboot has these boards fully supported, that GNU Boot currently lacks support for:
d862695f5f432b5c78dada5f16c293a4c3f9fce6, 12 October 2023
1c13f8d85c7306213cd525308ee8973e5663a3f8, 16 June 2021
e58b870ff926415e23fc386af41ff81b2f588763, 3 October 2023
1e1da7a963007d03a4e0e9a9e0ff17990bb1608d, 24 August 2023
4459ed60cb1e0562bc5b40405e2b4b9bbf766d57, 2 October 2023
b2e8bd83647f664260120fdfc7d07cba694dd89e, 17 November 2021
1c13f8d85c7306213cd525308ee8973e5663a3f8, 16 June 2021
f7564844f82b57078d601befadc438b5bc1fa01b, 25 October 2021
1281e340ad1d90c0cc8e8d902bb34f1871eb48cf, 24 September 2021
As you can see, Canoeboot’s revisions are a lot newer.
Canoeboot 20231026 contains a heavily patched version of GRUB, which contains argon2 support. This allows full decryption of LUKS2 volumes, without having to switch to different key derivation (PBKDF2) and without needing to use LUKS1. You can simply use the default LUKS2 setup provided by any distro, and it will work. More information is available about GRUB cryptomount, in the GNU+Linux guide - search on that page for LUKS2 or argon2.
GNU Boot completely lacks this feature, as of 26 October 2023. It can only support LUKS2 if the key derivation is downgraded to PBKDF2 (insecure, or to LUKS1 (also insecure).
For all intentions, the average user cannot have a fully encrypted system on GNU Boot. They must leave
/boot unencrypted on GNU+Linux distros.
With Canoeboot, you can have encrypted
/boot very easily. This is a boon for security, because it reduces the chance of someone tampering with your data successfully, and combined with other steps, can be used to reduce the risk of evil maid attacks (by making it infeasible).
GRUB 2.12 also supports detached LUKS headers, whereas GRUB 2.06 does not. GNU Boot currently uses GRUB 2.06 as its payload. Canoeboot and Libreboot both use GRUB 2.12 as a payload.
Canoeboot can build firmware images for RP2040 and STM32 microcontrollers, using
stm32-vserprog respectively. This can be used to set up an SPI flasher of high quality, but these parts are low-cost.
GNU Boot does not support this feature, as of 26 October 2023.
There are 9 shell scripts in Canoeboot 20231026, versus about 50 in GNU Boot 0.1 RC1, because GNU Boot uses the pre-audit design; Libreboot used to have lots of very simple scripts, but ended up with a lot of code repetition.
The new lbmk design generalises all of the logic, doing away with the very hacky logic that existed in the old build system design.
The interface in Canoeboot’s build system is much easier to use. For example, the commands are shorter, and easier to remember. See: cbmk maintenance manual tells you everything about the Canoeboot build system.
GNU Boot doesn’t even have a maintenance manual, in their version. Their documentation exists in the same repository as code, but their version of
docs/maintain/ does not actually contain any instructions, at least as of commit ID a64d284fd798d843133c9d7274bba17bd7837174 on 17 August 2023.
Canoeboot has much better documentation, but this is obvious if you’ve been paying attention. As already stated: GNU Boot’s documentation is horribly out of date, even relative to the version of Libreboot that they’re using! (which itself is also horribly out of date)
Smaller doesn’t mean worse; in fact, Canoeboot’s build system is more efficient. It’s about 1250 sloc (source lines of code), when counting shell scripts in the core of the build system. Libreboot, Canoeboot and GNU Boot build systems all use the same design, written in shell scripts.
1250 sloc in Canoeboot, versus 2111 in gnuboot; gnuboot however lacks many of the features and improvements that you’re about to see below. The Canoeboot build system does several times as many things, in half the amount of code! The code is generally just more reliable, less error prone, and easier to work with, in Canoeboot. GNU Boot uses a very old version of the Libreboot build system design, from long before I started any massive audits. There have been three Libreboot build system audits in 2023, as of 26 October 2023.
Three audits, and Canoeboot has inherited the improvements of all of them. GNU Boot’s design is based on the pre-audit lbmk codebase.
Build system / performance improvements in Canoeboot:
--mtime and option options in GNU Tar (if it is actually GNU Tar), when creating Tar archives. This results in partially reproducible source archives, and consistent hashes were seen in testing, but not between distros.
.git within lbmk, for the build system itself, if Git history was removed as in releases. This work around some build systems like coreboot that use Git extensively, and are error-prone without it.
grub.cfg, because it causes trouble in some non-interactive setups where the user sees an errant message on the screen and has to press enter. This fixes boot interruptions in some cases, allowing normal use of the machine. The pager was initially enabled many years ago, to make use of cat a bit easier in the GRUB shell, but the user can just enable the pager themselves if they really want to.
include/, and main scripts in
script/, called by the main
setvars function defined under
config/git are now concatenated, traversing recursively through the target directory; files first, then directories in order, and for each directory, follow the same pattern until all files are concatenated. This same logic is also used for patches. This now enables use of subdirectories, in some config/patch directories.
cp to copy links.
err, or just something that belongs on the error output (instead of standard output).
-B option in make commands.
/tmp, because it might be a tmpfs with little memory available; clone into
tmp/gitclone instead, within lbmk, and
mv it to avoid unnecessary additional writes (
mv is much more efficient than
cp, for this purpose).
target.cfg handling in vendor scripts, because they use the concatenated config format instead (they always have).
resources/scripts/ is now
resources/ was renamed to
config/; ifd and gbe files were also moved to
config/ifd/. Commands are now 1-argument instead of 2, for example the
./build boot roms command is now
read command that is built into
sh, reading each line. This is more efficient, and provides more robust handling on lines with spaces in them.
config/git have had certain
depend items removed, if a given project already defines it under
.gitmodules (within its repository).
target.cfg files in multi-tree projects coreboot, SeaBIOS and U-Boot. Unified to all such projects, under one script, and with improved error handling.
./build dependencies x commands still work as root (they’re the only commands available as root).
list command has been mostly unified, making it easier to tell (from lbmk) what commands are available, without having to manually poke around under
-T0 flag is now used, universally, on xz commands. This makes
xz run on multiple threads, greatly speeding up the creation of large tar archives.
-j in make commands, for multi-threading, but it relies on
nproc to get thread count, so this only works if you have
nproc (you probably don’t, if you run BSD; BSD porting is still on TODO for Canoeboot)
.gitcheck; now, a global git name/email config is always required. The only behaviour (setting local config, and unsetting) was quite error-prone under fault conditions, where cleanup may not have been provided, or when execution was interrupted, resulting sometimes in accidentally committing to
lbmk.git as author named
err is used to provide such behaviour. This results in all exits from lbmk being consolidated to
err, under fault conditions. - zero exits are also consolidated, going only through the main script, which has its own exit function called
lbmk_exit that provides
err function (and functions that use it) inside
include/err.sh; there is also
x_ which can be used to run a command and exit automatically with non-zero status, useful because it provides more verbose output than if you just relied on
set -e, and it still works when a script does not use
set -e - however, it is not used on all functions, because it works by executing
$@ directly, which can break depending on arguments. Therefore, some scripts just default to
|| err for providing breakage in scripts.
bin/, when it comes to flashing coreboot ROM images; it tells them to use
bin/ because those images do contain payloads, whereas the ones under
elf/ do not.
elf/, as are payloads, then they are joined separately by the usual ROMs build script, and these cached ROMs contain many changes in them that were previously handled by
moverom in the main ROM build script. Under the new design, repetitive steps are avoided; payloads are inserted into a copy of the cached ROMs under
TMPDIR, before being copied for keymaps and small files; this eliminates delays caused by slow compression (LZMA is always used, when inserting payloads). After crossgcc and the payloads are compiled, the ROM with coreboot builds in under a minute, whereas it would have previously taken several minutes on most Canoeboot-supported hardware.
include/ and its functions are called by the main build script, which provides a stub for this.
script/, inheriting the
TMPDIR variable set (and exported) by lbmk.
/tmp handling; a universal
TMPDIR is set (environmental variable) and exported to all child processes running lbmk scripts. On exit, the main tmp directory is purged, cleaning all tmp directories under it.
-e option in
sh was heavily relied upon to catch errors, but now errors are handled much more verbosely. Many fault conditions previously did not make lbmk exit at all, let alone with non-zero status, and zero status was sometimes being returned under some edge cases that were tested. Error handling is more robust now.
ich9gen) was removed, thus eliminating about 3000 source lines (of C code) from lbmk. The
nvmutil program, also provided by and originating from the Canoeboot project, can already change GbE MAC addresses. Coreboot’s bincfg can generate ich9m descriptors, and ifdtool can manipulate them; so the features provided by ich9utils were superfluous, since they are available in other projects that we ship. We now ship pre-built ifd/gbe configs on these machines, which can be modified or re-assembled manually if you want to. This eliminates a moving part from Canoeboot, and speeds up the build a little bit.
elf directory contains these, and the existing
bin directory still holds the full ROM images (containing payloads) when compiled.
build/boot/roms_helper script - the new style is much cleaner, mandating that logic be top-down, with a
main() function defined; it’s basically inspired by the OpenBSD coding style for C programs, adapted to shell scripts.
grub.elf is now used on all ROM images. The
grub.cfg goes in GRUB memdisk now, but can be overridden by inserting a
grub.cfg in CBFS; many behaviours are also controlled this way, for example to change keymaps and other behaviours. This results in much faster builds, because a different GRUB payload doesn’t have to be added to each new ROM image; such takes time, due to time-expensive LZMA compression. This, plus the optimised set of GRUB modules, also makes GRUB itself load much faster. All of the fat has been trimmed, though still quite a lot more than a Crumb.
/tmp at all, but now it’s pretty reliable.
cros: Disable coreboot-related BL31 features. This fixes poweroff on gru chromebooks. Patch courtesy of Alper Nebi Yasak.
u-boot: Increase EFI variable buffer size. This fixes an error where Debian’s signed shim allocates too many EFI variables to fit in the space provided, breaking the boot process in Debian. Patch courtesy Alper Nebi Yasak
util/spkmodem-recv: New utility, forked from GNU’s implementation, then re-written to use OpenBSD style(9) programming style instead of the originally used GNU programming style, and it is uses OpenBSD
pledge() when compiled on OpenBSD. Generally much cleaner coding style, with better error handling than the original GNU version (it is forked from coreboot, who forked it from GNU GRUB, with few changes made). This is a receiving client for spkmodem, which is a method coreboot provides to get a serial console via pulses on the PC speaker.
extra.sh directly from given coreboot tree. Unused by any boards, but could allow expanding upon patching capabilities in lbmk for specific mainboards, e.g. apply coreboot gerrit patches in a specific order that is not easy to otherwise guarantee in more generalised logic of the nonGeNUine Boot build system.
util/e6400-flash-unlock: New utility, that disables flashing protections on Dell’s own BIOS firmware, for Dell Latitude E6400. This enables nonGeNUine Boot installation without disassembling the machine (external flashing equipment is not required). Courtesy Nicholas Chin.
cbutils: New concept, which implements: build coreboot utilities like cbfstool and include the binaries in a directory inside lbmk, to be re-used. Previously, they would be compiled in-place within the coreboot build system, often re-compiled needlessly, and the checks for whether a given util are needed were very ad-hoc: now these checks are much more robust. Very centralised approach, per coreboot tree, rather than selectively compiling specific coreboot utilities, and makes the build system logic in nonGeNUine Boot much cleaner.
gru_kevin chromebooks, U-Boot is used instead of Google’s own depthcharge bootloader. It has been heavily modified to avoid certain initialisation that is replaced by coreboot, in such a way that U-Boot is mainly used as a bootloader providing UEFI for compliant GNU+Linux distros and BSDs. Courtesy Alper Nebi Yasak.
sh (though, many dependencies still use GNU extensions, such as GNU Make, so this portability is not directly useful yet, but a stepping stone. nonGeNUine Boot eventually wants to be buildable on non-GNU, non-GNU/Linux systems, e.g. BSD systems)
nvmutil - can randomise the MAC address on Intel GbE NICs, for systems that use an Intel Flash Descriptor
grub.cfg files on the HDD/SSD.
So, in conclusion: this page is not trying to tell you why you should use Canoeboot; rather, it’s just telling you that someone worse exists. Canoeboot and GNU Boot are both inherently flawed in their designs; both projects are completely inferior to the Libreboot project, for all the reasons laid out in the Binary Blob Reduction Policy - the Canoeboot project is provided, specifically, to prove the merits of that policy, by showing what Libreboot would have been by now if it continued adhering to GNU policy, instead of changing to its current Blob Reduction Policy.
Libreboot provides all of the same blob-free configurations as Canoeboot, when possible on any given mainboard, and that is the preference, but the FSF/GNU dogma states that the user must never run any proprietary software. This dogma is wrong; a more correct approach is to say that proprietary software is bad, because it restricts the user’s freedom to study and modify the software; it removes their power to say no when the developer wants to change the program in a bad way, it leaves them at the mercy of that developer - the point is this:
Free software is good, and we should be promoting as much of it as possible. This means that a hardline no-blob approach like the policy implemented by Canoeboot (or GNU Boot for that matter), is entirely misguided, because it will only alienate those who just want some free software. Most people like the idea of software freedom but cannot go all the way yet; we should encourage people to make the right choices, but otherwise just help them in whatever way we can, meeting people where they’re at right now.
And that is why Libreboot exists in the way that it does. Canoeboot serves as an example of what would happen in the best-case scenario if Libreboot never changed its policy. The best possible release of Canoeboot will still be missing a ton of boards and features from Libreboot. Indeed, the Canoeboot 20231026 and nonGeNUine Boot 20230717 both illustrate that quite nicely.
Dubbed Canoeboot 20240102, though it’s not actually a release. For context, first read: https://libreboot.org/news/audit4.html
Canoeboot imported these changes, in revision
102ce12cea023783729d6a2cd1576afc95bf7540 on 2 January 2024. This revision is referred to unofficially as Canoeboot 20240102.
These changes add the following noteworthy improvements, that benefit Canoeboot users:
git am failing does not cause the build system to exit. The build continues, erroneously. Libreboot fixed this in audit 4, and Canoeboot has imported this.
target.cfg files. This could enable use of crossgcc, if you set
xarch, and make/cmake/autoconf arguments are now all configurable in
target.cfg - previously, this file was only possible for multi-tree projects.
grub.cfg: the default config scanning now also searches for syslinux configs, in addition to extlinux, though it still looks for GRUB configs first. GRUB can parse syslinux/extlinux configuration files. Canoeboot’s GRUB is also now configured to search for configs on the ESP (EFI System Partition), both on USB media and on the installed system. With these changes, Canoeboot now boots distros much more reliably, especially UEFI-based ones, even though UEFI is not implemented in Caneoboot on x86 yet.
These and other/subsequent changes will be merged with the lists above, when the next Canoeboot release comes out. The main lists of changes above are for the current binary release of Canoeboot, versus GNU Boot.
The article above compares Canoeboot 20231107 and GNU Boot 0.1 RC1. It should be noted that 0.1 RC3 is now available, but it doesn’t really add any major changes, and most of the changes are documentation changes. Here is a brief list of changes that would be beneficial to users:
CONFIG_USE_BLOBS setting was disabled on all coreboot configs - it is an extra setting that reduces the chance of the coreboot build system accidentally downloading blobs.
GNU Boot 0.1 RC has not altered the coreboot code on any machines, nor the GRUB code, and in fact it seems to be vanilla GRUB 2.06. Most of the changes by 0.1 RC3 have been further integration of the Untitled Static Site Generator maintained by Leah Rowe, adapting Untitled (which builds the Libreboot, Canoeboot and GNU Boot websites) so that it can be used with the GNU Savannah infrastructure more easily (as of 2 January 2024, the GNU Boot project is considering adapting the website for use with Haunt instead of Untitled).
GNU Boot’s code complexity increased, considerably. Counting build scripts, the GNU Boot build system is 3216 lines of code, as of 0.1 RC3 - whereas, the Canoeboot 20240102 build system is 1127 lines of code. That’s about 3x smaller, but don’t let size fool you. Canoeboot’s design is highly efficient. It does a lot more than GNU Boot currently does. You’ll note that this figure of 1127 is lower than the one given for Canoeboot version 20231107, above. That is because Canoeboot became more efficient since then!
Despite the considerable reduction in code size, by comparison, the Canoeboot build system is much more powerful. It does a lot more, patching and building a lot more projects, including U-Boot, and it handles cross compilation too, for ARM - it also integrates Serprog firmware projects, for STM32 and RP2040 devices, and has much better support for autoconf/cmake-based projects.
The Canoeboot build system is so vastly efficient due to its design. GNU Boot is based upon and expanded from Libreboot 20220710, which used a much more complicated build system design. The Canoeboot build system inherits changes from Libreboot Build System Audit 1, 2, 3 and 4, the purpose of which was (and is) to reduce build system complexity, improving efficiency and reliability, while adding many more features. Essentially, Canoeboot generalises a lot more logic, handling codebases (download, patch, configure, compile) more generically with a single script, whereas GNU Boot has separate scripts for each project, and thus duplicates a lot of logic. While the latter design of GNU Boot is more flexible in some ways, it does result in much higher complexity.
It should be noted that GNUBoot’s code complexity increased a lot, relative to Libreboot 20220710 which it forked, while not actually adding any new functionality (none that will be beneficial to most users). The 20220710 build system was 2117 lines of code, versus GNU Boot’s 3216, Canoeboot’s 1127 and Libreboot’s (on 2 January 2024) 1562!
That’s all. The information above, and more, will be properly merged into this page when the next release of Canoeboot comes out, or when/if GNU Boot makes considerable technical improvements to their project.
As of 2 January 2024, GNU Boot is still about 1 year behind on code and about 2 years behind on documentation, when comparing to the technical progress of Libreboot; the same numbers also apply to Canoeboot vs GNU Boot.
Markdown file for this page: https://canoeboot.org/gnuboot.md
This HTML page was generated by the Untitled Static Site Generator.