galeb-howtos

Какода документи за Галеб
Дневник | Датотеке | Референце | ЛИЦЕНЦА

чување 490dbd3ab23ee43a4cb1d2e0a567f8c06ac0648d
родитељ fb38763dea48e052d1f3f965df35f4241c682951
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Wed,  3 May 2023 22:38:05 +0200

booting.howto: New file from main Galeb repository (BOOTING)

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Abooting.howto | 219+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
измењених датотека: 1, додавања: 219(+), брисања: 0(-)

diff --git a/booting.howto b/booting.howto @@ -0,0 +1,219 @@ +Booting HOWTO +============= + +License notice +-------------- + +Copyright (c) 2023 Strahinya Radich. +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the file LICENSE. + + +Foreword +-------- + +One of the perhaps most frequent issues with configuring a Unix-like OS is +setting up boot configuration correctly. The perceived difficulty mostly comes +from not understanding the basic concepts behind booting. + + +Firmware type +------------- + +There are two firmware types: the older, BIOS, and newer, UEFI. Which one of the +two is used depends on your system. If you can run + + $ efibootmgr -v + +and it doesn't give an error message but a list of boot entries, then you have +UEFI. With Linux as kernel, a mounted efivarfs, usually at +/sys/firmware/efi/efivars, is also needed for the above command to work. + + +Partition table type +-------------------- + +There are two partition table types: older, Master Boot Record (MBR), and newer, +GUID Partition Table (GPT). UEFI systems usually use GPT, but other combinations +are also possible. + + +Boot loader +----------- + +The program which carries out the initial stage of booting an OS is called a +boot loader. This can be a program like GRUB, rEFInd, SYSLINUX, LILO and so on, +or, in the case of Linux with UEFI, the kernel itself (EFISTUB). + +* With BIOS, bootloaders are written into the (master or volume) boot records of + disk partitions themselves (BIOS/MBR) or BIOS boot partitions (BIOS/GPT), and + this is where the system will look for them. + +* With UEFI/GPT, bootloaders are normal files on an EFI System Partition (ESP). + In order for the system to find them, their boot entries must be written to + EFI variables. This can be done by the program efibootmgr(8), but it can also + be done by the UEFI interface or an UEFI shell. + + +Linux boot +---------- + +During the boot process, Linux executes the init program (usually /sbin/init) +on the system root partition. This can be done in two ways: + +* By creating an initial root partition (initramfs) having a temporary init + program, which if needed handles loading the necessary kernel modules + (drivers) to access the root partition. This method also supports advanced + partition selection, for example by their UUIDs or LABELs, and doesn't + require the support for filesystem type of the root partition to be compiled + into the kernel. initramfs is passed to EFISTUB through the kernel command + line: `initrd=\initramfs.img`, where the "root" directory is ESP. + + Note that UEFI uses DOS filesystem path separator, backslash (\), + instead of a slash (/) used on Unix-like systems. + +* By compiling the necessary filesystem modules and storage device drivers into + the kernel and specifying the root partition on the kernel command line. This + is more minimal, as it doesn't require initramfs. However, advanced partition + selection by UUIDs and LABELs is not supported (but see below), and licenses + for "binary blobs" (drivers/modules) usually clash with the requirements of + GPL (which is the license of the kernel), preventing them from being compiled + in the kernel in such a way. That's why initramfs is the most used option, and + recommended in Galeb. In Galeb, there is a script mkinitramfs(8), which can be + used to generate initramfs. Refer to [5]. + +Partition can always be specified by a device pathname, such as +`root=/dev/sda2`, which can lead to boot failure if the storage device driver +(kernel module) is inaccessible or the disk configuration is changed. For +example, this can happen when plugging in a USB flash drive or physically +connecting hard drives to different cables, and rebooting, or otherwise changing +the order of hard disks. + +Partition on GPT systems can also be specified by PARTUUID, which uniquely +identifies a partition: `root=PARTUUID=...`. This is the recommended approach. + + +Recommended setup in Galeb +-------------------------- + +The following is the basic recommended partition configuration in Galeb on the +traditional SCSI drives. It assumes an UEFI/GPT system. + + Partition Mountpoint Filesystem Type Size + -------------------------------------------------------------- + /dev/sda1 /boot vfat (32-bit) ~500MB + /dev/sda2 / ext4 Rest + +When configuring a boot entry, this means that the kernel command line will +include + + root=/dev/sda2 + +or + + root=PARTUUID=[PARTUUID of /dev/sda2] + +and that the ESP is in /dev/sda1, mounted later during the boot process to +/boot. This is where the kernel stub should go into, and will later be +accessible from the booted system at /boot/vmlinuz. + +When the partition /dev/sda2 exists, its PARTUUID can be obtained with the +command + + $ lsblk -no PARTUUID /dev/sda2 + +NVME SSDs require the nvme and nvme_core kernel modules, and the partition +device pathnames usually become /dev/nvme0n1p1 and /dev/nvme0n1p2, respectively: + + Partition Mountpoint Filesystem Type Size + -------------------------------------------------------------- + /dev/nvme0n1p1 /boot vfat (32-bit) ~500MB + /dev/nvme0n1p2 / ext4 Rest + + +Creating a boot entry in efibootmgr +----------------------------------- + +The necessary command line parameters will be briefly explained here. For more +information, see `man 8 efibootmgr` and `efibootmgr -h`. + + partuuid=$(lsblk -no PARTUUID /dev/sda2) + efibootmgr -c -d /dev/sda -l '\vmlinuz' -L 'Galeb EFISTUB' -p1 \ + -u 'initrd=\initramfs.img root=PARTUUID='${partuuid}' rw' + + +Explanation +----------- + +partuuid=$(lsblk -no PARTUUID /dev/sda2) + Obtain the PARTUUID of /dev/sda2 and store it in the shell variable + `partuuid`. + +-c Create a new boot entry. + +-d /dev/sda + Disk on which the root partition is (boot disk). + +-l '\vmlinuz' + Boot loader (our EFISTUB) is in the file vmlinuz on ESP. + +-L 'Galeb EFISTUB' + Label for the boot entry. + +-p1 ESP is the partition #1 on the boot disk (/dev/sda1). + +-u Treat the kernel command line as UCS-2. + +'initrd=\initramfs.img root=PARTUUID='${partuuid}' rw' + Kernel command line, quoted to prevent parsing by the shell. Value of + the shell variable `partuuid` is inserted where needed. + + +Boot image +---------- + +After the boot scripts have finished, you will be presented with a choice to +create a boot image. The boot image will be compressed with xz and needs to be +sent to a USB flash medium, for example: + + # xz -dc galeb-2.2-x86_64-20230417.raw.xz > /dev/sdb + +or, if you have pv[4]: + + # xz -dc galeb-2.2-x86_64-20230417.raw.xz | pv > /dev/sdb + +_Be careful when specifying the device you send the output to, in order to not +overwrite any existing partitions (your hard disk, etc)!_ You can find out the +correct device by using + + $ lsblk -f + +or + + $ blkid + +The boot image is designed for UEFI systems and will be partitioned as GPT. + +When you reboot, enter UEFI setup and choose to boot from USB flash. Fallback +shim will automatically create a boot entry for Galeb, which will set the device +specified as USBROOT in lib/env.sh as the root device for that entry. If the +boot fails, you need to reboot back into your original system, remove the UEFI +entry (for example, by using efibootmgr(8)), change USBROOT in lib/env.sh, rerun +the bootstrap scripts, copy the newly generated image to USB flash and reboot. + +You can safely remove the "Galeb USB" UEFI entry if you don't need it anymore, +since it will be automatically generated by fallback shim whenever you choose to +boot from the Galeb USB medium. + + +See also +-------- + +1. https://wiki.archlinux.org/title/Partitioning#Example_layouts +2. https://wiki.archlinux.org/title/EFI_system_partition +3. https://wiki.archlinux.org/title/EFISTUB +4. http://www.ivarch.com/programs/pv.shtml +5. https://git.sr.ht/~strahinja/galeb-mkinitramfs/