Each processor/chip architecture has its own procedure to boot the kernel. It works with desgined partition layout and vendor specific firmwares/bootloaders in the boot partition. We can learn the related knowledge from the Raspbian image for Raspberry Pi, which is the board we can obtain easily. However, the diversity between the special booting procedures with specific firmwares/bootloaders increases the complexity for distribution maintainers. It will be great if there is a way to make it more generic that can be applied to most of the chip architectures/boards to boot up the system.
After referring to some Linux distributions, we learned U-Boot may play a role in the solution. It splits the booting procedure into hardware specific and generic system parts. This helps distribution maintainers deploy the generic system with OSTree, including device trees.
Let’s deep dive into this magic booting procedure!
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
A Journey to Boot Linux on Raspberry Pi
1. A Journey to Boot Linux
on Raspberry Pi
Jian-Hong Pan (StarNight)
@ COSCUP 2020
2. Who am I
潘建宏 / Jian-Hong Pan (StarNight)
Endless OS Foundation
You can find me at
● http://www.slideshare.net/chienhungpan/
● GitHub: starnight
● Email:
jian-hong [AT] endlessm.com
starnight [AT] g.ncu.edu.tw
3. Outline
● History
● OSTree
● How does Raspberry Pi boot
● Device Tree
● Deploy Device Tree with OSTree
● Why U-Boot
● Wrap Up! Boot Endless OS on Raspberry Pi
● Demo
● Reference
4. History
Endless OS Foundation focuses on enabling people to harness the
power of computing everywhere.
● Develops a Linux-based operating system Endless OS as the payload
and pre-loads a lot of knowledge content and apps.
● The preloaded content and apps help people self-learning, especially
for the area without internet.
● Uses OSTree and flatpak as the key technology for system
deployment and update.
● Endless OS runs on general x86_64 computers, just like other Linux
distributions.
● Raspberry Pi is the wide spread low cost ARM based computer in
recent years. It is a good tool for education.
5. OSTree
Description from OSTree
Is both a shared library and suite of command line tools that combines a
"git-like" model for committing and downloading bootable filesystem
trees, along with a layer for deploying them and managing the
bootloader configuration.
● Transactional upgrades and rollback for the system
● Replicating content incrementally over HTTP via GPG signatures and
"pinned TLS" support
● Support for parallel installing more than just 2 bootable roots
● Binary history on the server side (and client)
● Introspectable shared library API for build and deployment systems
● Flexible support for multiple branches and repositories, supporting
projects like flatpak which use libostree for applications, rather than
hosts.
Another reference: The Fundamentals of OSTree
6. OSTree Example
$ ostree admin status
* eos 4c59454f03dbfe2c86858b0ade89caf36db3fba25233971484a4796a39e02d02.0
Version: 3.9.0~200702-230029
origin refspec: eos:os/eos/arm64/master
GPG: Signature made Fri 03 Jul 2020 07:50:23 AM CST using RSA key ID 9E08D8DABA02FC46
GPG: Good signature from "EOS OSTree Signing Key 1 <maintainers@endlessm.com>"
GPG: Key expires Sun 01 Jul 2029 12:18:11 AM CST
GPG: Signature made Fri 03 Jul 2020 07:50:26 AM CST using RSA key ID FCF17B17F1F8E157
GPG: Good signature from "EOS Flatpak Signing Key 1 <maintainers@endlessm.com>"
GPG: Key expires Wed 10 Jun 2026 01:47:38 AM CST
eos 1432c89ac02b1186ecbc0c3b6f1af2677aa09d4812cb97c4bd0fa46721342227.0 (rollback)
Version: 3.9.0~200621-230039
origin refspec: eos:os/eos/arm64/master
GPG: Signature made Mon 22 Jun 2020 07:56:54 AM CST using RSA key ID 9E08D8DABA02FC46
GPG: Good signature from "EOS OSTree Signing Key 1 <maintainers@endlessm.com>"
GPG: Key expires Sun 01 Jul 2029 12:18:11 AM CST
GPG: Signature made Mon 22 Jun 2020 07:56:57 AM CST using RSA key ID FCF17B17F1F8E157
GPG: Good signature from "EOS Flatpak Signing Key 1 <maintainers@endlessm.com>"
GPG: Key expires Wed 10 Jun 2026 01:47:38 AM CST
7. $ ls -l /ostree/deploy/eos/deploy/
total 16
drwxr-xr-x 14 root root 4096 Jun 22 08:08 1432c89ac02b1186ecbc0c3b6f1af2677aa09d4812cb97c4bd0fa46721342227.0
-rw-r--r-- 1 root root 41 Jun 22 08:08 1432c89ac02b1186ecbc0c3b6f1af2677aa09d4812cb97c4bd0fa46721342227.0.origin
drwxr-xr-x 14 root root 4096 Jul 6 16:13 4c59454f03dbfe2c86858b0ade89caf36db3fba25233971484a4796a39e02d02.0
-rw-r--r-- 1 root root 41 Jul 6 16:13 4c59454f03dbfe2c86858b0ade89caf36db3fba25233971484a4796a39e02d02.0.origin
$ ls -l /ostree/deploy/eos/deploy/4c59454f03dbfe2c86858b0ade89caf36db3fba25233971484a4796a39e02d02.0
total 48
lrwxrwxrwx 5 root root 7 Jun 22 08:01 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Jan 1 1970 boot
drwxr-xr-x 2 root root 4096 Jan 1 1970 dev
drwxr-xr-x 115 root root 4096 Jul 6 17:07 etc
lrwxrwxrwx 3 root root 9 Jun 22 08:01 home -> /var/home
lrwxrwxrwx 5 root root 7 Jun 22 08:01 lib -> usr/lib
lrwxrwxrwx 5 root root 9 Jun 22 08:01 lib64 -> usr/lib64
lrwxrwxrwx 3 root root 10 Jun 22 08:01 media -> /run/media
drwxr-xr-x 2 root root 4096 Jan 1 1970 mnt
lrwxrwxrwx 3 root root 8 Jun 22 08:01 opt -> /var/opt
lrwxrwxrwx 3 root root 15 Jun 22 08:03 ostree -> /sysroot/ostree
drwxr-xr-x 2 root root 4096 Jan 1 1970 proc
lrwxrwxrwx 3 root root 13 Jun 22 08:06 root -> /var/roothome
drwxr-xr-x 9 root root 4096 Jan 1 1970 run
lrwxrwxrwx 5 root root 8 Jun 22 08:03 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Jan 1 1970 srv
drwxr-xr-x 2 root root 4096 Jan 1 1970 sys
drwxr-xr-x 2 root root 4096 Jan 1 1970 sysroot
drwxrwxrwt 2 root root 4096 Jan 1 1970 tmp
drwxr-xr-x 12 root root 4096 Jan 1 1970 usr
drwxr-xr-x 11 root root 4096 Jan 1 1970 var
Filesystem Hierarchy Standard (FHS)
10. Start from Raspberry Pi 3
We started to enable Endless OS on Raspberry Pi 3 (RPi 3) first.
Key points:
● We want 64 bits system
● U-boot bootloader (RPi 3 & 4 ready)
● Linux mainline kernel including Device Tree
○ RPi 3 ready
○ RPi 4 boots up, but many parts are still under development
● OSTree
○ Generic for arm64 platforms
11. Boot Raspberry Pi 3
Understanding the Raspberry Pi Boot Process (Raspbian/Raspberry Pi
OS (Official), Arch Linux ARM, Fedora ARM, Ubuntu)
● Understanding the Raspberry Pi Boot Process
● The boot folder
● Boot sequence
1st stage
Boot from GPU with
firmware in ROM
and loads
bootcode.bin in FAT
2nd stage
Bootcode.bin
loads start.elf ...
3rd stage
Start.elf loads
DT, kernel …
and starts CPU
4th stage
Kernel boots
FAT boot partition
EXT4
partition
Raspbian for example
12. Device Tree
Description from devicetree.org
● The devicetree is a data structure for describing hardware.
● Rather than hard coding every detail of a device into an operating
system, many aspects of the hardware can be described in a data
structure that is passed to the operating system at boot time.
● The devicetree is used by OpenFirmware (OF)
Important events:
● Re: [GIT PULL] omap changes for v2.6.39 merge window on LKML
● Device trees I: Are we having fun yet? on LWN.net
16. Device Tree Blobs are Deployed like
$ ls /usr/lib/firmware/5.6.0-7-generic/device-tree/
actions amlogic broadcom intel qcom sprd
allwinner apm cavium lg realtek synaptics
altera arm freescale marvell renesas ti
amd bitmain hisilicon mediatek rockchip xilinx
$ ls /usr/lib/firmware/5.6.0-7-generic/device-tree/broadcom/
bcm2711-rpi-4-b.dtb bcm2837-rpi-3-b-plus.dtb stingray
bcm2837-rpi-3-a-plus.dtb bcm2837-rpi-cm3-io3.dtb
bcm2837-rpi-3-b.dtb northstar2
17. Single Device Tree? FIT for Generic arm64 OSTree
OSTree can deploy only one device tree file originally, so we gather all of
the boards’ DTBs into a single FIT-uImage as the deployment target.
/{
description = "Device Tree List";
#address-cells = <1>;
images {
qcom_msm8994-angler-rev-101.dtb {
description = "qcom_msm8994-angler-rev-101.dtb";
data = /incbin/("/boot/dtb/qcom/msm8994-angler-rev-101.dtb");
type = "flat_dt";
arch = "arm64";
compression = "none";
};
qcom_apq8096-db820c.dtb {
...
};
};
Make U-Boot load the FIT-uImage, then pick the designated device tree
in the FIT-uImage.
18. OSTree Supports Device Tree Directory Now
● OSTree can deploy only one device tree file originally
fdt_file=/ostree/eos-8e2b71f01721f41d806e96d158390aa8a52c0f2ddb
dfe2f6e7f043ce9ec3a2d7/devicetree-5.3.0-12-generic
● After opened the feature request ticket, OSTree can support Device
Tree directory deployment now! commit 5f08649f51fe (“deploy:
support devicetree directory”)
fdtdir=/ostree/eos-8a4f394fb3b8d81f37e1fdb62376335955fc807dc021
c9af6c0d59fa96a21dae/dtb
We have two ways to deploy the Device Trees now:
1. A single FIT-uimage → Endless OS chooses this way currently
2. Device Tree directory.
20. 4th stage
Kernel boots
Boot Raspberry Pi 3 with Endless OS
Raspbian’s firmwares
4th stage
U-Boot loads kernel, initramfs and
flattened device tree (FDT) in OSTree
and boots kernel with boot script
Reference:
● Boot loaders in Raspbian
● The boot folder
● Boot options in
config.txt
Note:
Start.elf loads kernel8.img,
which is the entry file for
arm64.
Most of other distributions
make it as the kernel
directly. Endless OS makes
it as U-Boot for some
reasons.
1st stage
Boot from GPU with
firmware in ROM
and loads
bootcode.bin in FAT
2nd stage
Bootcode.bin
loads start.elf ...
3rd stage
Start.elf loads
DT, kernel …
and starts CPU
U-Boot
21. Why U-Boot?
1. Endless OS comes with OSTree which includes kernel, initramfs and device
tree. They will be changed with different commits / revisions.
2. Because of OSTree, the booting will become failed to find the init daemon, if
the kernel image has no related built-in modules and there is no initramfs.
[ 2.939544] ---[ end Kernel panic - not syncing: No working init found. Try passing init=
option to kernel. See Linux Documentation/admin-guide/init.rst for guidance. ]---
[ 13.350160] WARNING: CPU: 0 PID: 10 at kernel/irq_work.c:102
irq_work_queue_on+0xe8/0x108
[ 13.360149] Modules linked in:
[ 13.365009] CPU: 0 PID: 10 Comm: rcu_preempt Not tainted 4.19.76-v8+ #1
3. Raspberry Pi’s firmware loads the Device Tree and passes it to the booting file
entry. However, it is not the Device Tree used by Linux mainline kernel.
So, Endless OS needs U-Boot as the middle step to boot kernel with the initramfs
and designated device tree. We prepared an U-Boot script to load device tree,
initramfs and kernel, then boot with some arguments.
26. 4th stage
Kernel boots
Boot Raspberry Pi 4 (new SoC) with Endless OS
Raspbian’s firmwares
4th stage
U-Boot loads kernel, initramfs and
flattened device tree (FDT) in OSTree
and boots kernel with boot script
1st stage
Boot from GPU with firmware in ROM
including bootcode.bin job in Second stage:
loads start4x.elf ... in FAT
3rd stage
Start4.elf loads DT,
kernel …
and starts CPU
U-Boot
28. arch/arm/boot/dts/bcm2711-rpi-4-b.dts
/ {
compatible = "raspberrypi,4-model-b", "brcm,bcm2711";
model = "Raspberry Pi 4 Model B";
chosen {
/* 8250 auxiliary UART instead of pl011 */
stdout-path = "serial1:115200n8";
};
/* Will be filled by the bootloader */
memory@0 {
device_type = "memory";
reg = <0 0 0>;
};
...
WHAT ???!
29. [U-Boot] rpi4: fix dram bank initialization (Denied)
● Found the memory → reg must be fixed up for the DRAM bank in
Raspberry Pi 4B’s Device Tree. Raspberry Pi 4B’s memory could be 1,
2, 4 and 8 GB. So, the reg should not be fixed values. The values
must be filled by someone dynamically.
● Raspberry Pi’s boot firmware must know how to fix the reg’s values.
Although, U-Boot does not know the values directly, it can be
launched by Raspberry Pi’s firmware. And, Raspberry Pi’s firmware
already puts the correct values in the memory stack during the
execution of U-Boot. I sent the patch, but it is denied.
● Because, there is already a better and generic way which is good!!!
○ commit 7a3f15e7 ("dm: Fix default address cells return value")
○ commit 8076fc29 ("libfdt: Allow #size-cells of 0")
○ commit 0ba41ce1 ("libfdt: return correct value if #size-cells property is not present")
○ commit ce2dae3a ("libfdt: fdt_address_cells() and fdt_size_cells()")
32. Reference
● Raspberry Pi 4 Preview Release | Endless OS 3.7.7~beta1
● Upstream Raspberry Pi 4 B support
● Raspberry Pi → Documentation → The boot folder
● RPi U-Boot
● OSTree
● Device Tree
● U-Boot