9
ubuntu@ubuntu:~$ lsblk -po NAME,SIZE,TYPE,FSTYPE,PARTLABEL
NAME          SIZE TYPE FSTYPE   PARTLABEL
/dev/loop0    1.9G loop squashfs 
/dev/loop1   27.1M loop squashfs 
/dev/loop2     55M loop squashfs 
/dev/loop3  240.8M loop squashfs 
/dev/loop4   62.1M loop squashfs 
/dev/loop5   49.8M loop squashfs 
/dev/sda    465.8G disk          
├─/dev/sda1   292M part vfat     CLR_BOOT
├─/dev/sda2   512M part swap     CLR_SWAP
├─/dev/sda3 108.6G part ext4     CLR_ROOT
├─/dev/sda4    16M part          Microsoft reserved partition
├─/dev/sda5    79G part ntfs     Basic data partition
└─/dev/sda6 277.4G part ntfs     Basic data partition
/dev/sdb     30.2G disk iso9660  
├─/dev/sdb1   2.5G part iso9660  
├─/dev/sdb2   3.9M part vfat     
└─/dev/sdb3  27.7G part ext4     
/dev/sr0     1024M rom           
ubuntu@ubuntu:~$ 
nazar2sfive
  • 1,335
  • 1
    Your question should probably explain exactly what bootloader you want. Saying "I don't want GRUB" is a bit like saying "I don't want pipes running through the walls of my home." You need to explain your plan for running water if you want useful advice. – user535733 Apr 10 '20 at 05:04
  • See http://manpages.ubuntu.com/manpages/cosmic/man7/systemd-boot.7.html & https://manpages.debian.org/testing/systemd/systemd-boot.7.en.html & systemd-boot (f. gummiboot) https://blobfolio.com/2018/06/replace-grub2-with-systemd-boot-on-ubuntu-18-04/ You have to copy kernel(s) from /boot into ESP & create your own configuration file. – oldfred Apr 10 '20 at 14:20

1 Answers1

6

After following this guide:

# Everything in this tutorial should be done as root:
sudo -i

Now hop on into the EFI partition root.

cd /boot/efi

Configuration files will go here:

mkdir -p loader/entries

And kernels will go here:

mkdir ubuntu

Put the following into /boot/efi/loader/loader.conf (change the timeout value to your pleasing)

default ubuntu
timeout 1
editor 0

Put the following to /etc/kernel/postinst.d/zz-update-systemd-boot Make sure to change the CHANGEMEs.

#!/bin/bash
#
# This is a simple kernel hook to populate the systemd-boot entries
# whenever kernels are added or removed.
#

The UUID of your disk.

UUID="CHANGEME"

The LUKS volume slug you want to use, which will result in the

partition being mounted to /dev/mapper/CHANGEME.

VOLUME="CHANGEME"

Any rootflags you wish to set.

ROOTFLAGS="CHANGEME"

Our kernels.

KERNELS=() FIND="find /boot -maxdepth 1 -name 'vmlinuz-*' -type f -print0 | sort -rz" while IFS= read -r -u3 -d $'\0' LINE; do KERNEL=$(basename "${LINE}") KERNELS+=("${KERNEL:8}") done 3< <(eval "${FIND}")

There has to be at least one kernel.

if [ ${#KERNELS[@]} -lt 1 ]; then echo -e "\e[2msystemd-boot\e[0m \e[1;31mNo kernels found.\e[0m" exit 1 fi

Perform a nuclear clean to ensure everything is always in perfect

sync.

rm /boot/efi/loader/entries/*.conf rm -rf /boot/efi/ubuntu mkdir /boot/efi/ubuntu

Copy the latest kernel files to a consistent place so we can keep

using the same loader configuration.

LATEST="${KERNELS[@]:0:1}" echo -e "\e[2msystemd-boot\e[0m \e[1;32m${LATEST}\e[0m" for FILE in config initrd.img System.map vmlinuz; do cp "/boot/${FILE}-${LATEST}" "/boot/efi/ubuntu/${FILE}" cat << EOF > /boot/efi/loader/entries/ubuntu.conf title Ubuntu GNOME linux /ubuntu/vmlinuz initrd /ubuntu/initrd.img options cryptdevice=UUID=${UUID}:${VOLUME} root=/dev/mapper/${VOLUME} ro rootflags=${ROOTFLAGS} EOF done

Copy any legacy kernels over too, but maintain their version-based

names to avoid collisions.

if [ ${#KERNELS[@]} -gt 1 ]; then LEGACY=("${KERNELS[@]:1}") for VERSION in "${LEGACY[@]}"; do echo -e "\e[2msystemd-boot\e[0m \e[1;32m${VERSION}\e[0m" for FILE in config initrd.img System.map vmlinuz; do cp "/boot/${FILE}-${VERSION}" "/boot/efi/ubuntu/${FILE}-${VERSION}" cat << EOF > /boot/efi/loader/entries/ubuntu-${VERSION}.conf title Ubuntu GNOME ${VERSION} linux /ubuntu/vmlinuz-${VERSION} initrd /ubuntu/initrd.img-${VERSION} options cryptdevice=UUID=${UUID}:${VOLUME} root=/dev/mapper/${VOLUME} ro rootflags=${ROOTFLAGS} EOF done done fi

Success!

exit 0

If your setup is simple, you might do without any ROOTFLAGS and VOLUME and the appropriate line in the script might be as follows: options root=UUID=${UUID} ro

Take care of permissions:

chown root: /etc/kernel/postinst.d/zz-update-systemd-boot
chmod 0755 /etc/kernel/postinst.d/zz-update-systemd-boot
cd /etc/kernel/postrm.d/ && ln -s ../postinst.d/zz-update-systemd-boot zz-update-systemd-boot
[ -d "/etc/initramfs/post-update.d" ] || mkdir -p /etc/initramfs/post-update.d
cd /etc/initramfs/post-update.d/ && ln -s ../../kernel/postinst.d/zz-update-systemd-boot zz-update-systemd-boot

Your /boot/efi/loader/entries/ubuntu.conf should then look something like this (obviously, you need to cahnge the UUID):

title   Ubuntu GNOME
linux   /ubuntu/vmlinuz
initrd  /ubuntu/initrd.img
options root=UUID=81c4bc1c-1a7e-4822-acae-220bbe572240 ro

to see UUID

ubuntu@ubuntu:~$ lsblk -f
NAME   FSTYPE   LABEL                  UUID                                 FSAVAIL FSUSE% MOUNTPOINT
loop0  squashfs                                                                   0   100% /rofs
loop1  squashfs                                                                   0   100% /snap/snapd/7264
loop2  squashfs                                                                   0   100% /snap/core18/1705
loop3  squashfs                                                                   0   100% /snap/gnome-3-34-1804/24
loop4  squashfs                                                                   0   100% /snap/gtk-common-themes/1
loop5  squashfs                                                                   0   100% /snap/snap-store/433
sda                                                                                        
├─sda1 vfat                            1A74-A270                             113.2M    61% /media/ubuntu/1A74-A270
├─sda2 swap                            10842320-1286-413f-bf08-3e0ca76bcf2f                [SWAP]
├─sda3 ext4                            81c4bc1c-1a7e-4822-acae-220bbe572240   87.6G    13% /media/ubuntu/81c4bc1c-1a
├─sda4                                                                                     
├─sda5 ntfs                            80D47B63D47B59FC                                    
└─sda6 ntfs     router_data            4416017316016770                                    
sdb    iso9660  Ubuntu 20.04 LTS amd64 2020-04-23-07-51-42-00                              
├─sdb1 iso9660  Ubuntu 20.04 LTS amd64 2020-04-23-07-51-42-00                     0   100% /cdrom
├─sdb2 vfat                            1AC3-20ED                                           
└─sdb3 ext4     writable               b8474e17-164a-4fb3-94ff-d4e68f2e1548   25.7G     0% /var/crash
sr0

Look up your current kernel and reinstall it to trigger the hooks you just created: sudo apt install --reinstall linux-image-5.13.0-22-generic.

Actually Install systemd-boot For most people, installation consists of a single command:

Again, this should go to the EFI partition:

bootctl install --path=/boot/efi

To verify the bootloaders installed on the system — and their order — run:

efibootmgr

reboot

once everything ok you can remove the existence of grub in your system

# Purge the packages.
apt-get purge grub*

Purge any obsolete dependencies.

apt-get autoremove --purge

nazar2sfive
  • 1,335
  • for the CHANGEMEs are adding information for the boot partition or root partition? – Moyo Freeman Jan 05 '23 at 15:42
  • Thank you for the guide, but I think I am lost because my system does not boot using systemd-boot

    nvme0n1

    ├─nvme0n1p1 │ vfat FAT32 205A-4B07 226M 56% /boot/efi ├─nvme0n1p2 │ ext4 1.0 7c1b4f71-a3aa-4394-8c93-de5adf80d801 7.4G 56% /var/snap/firefox/common/host-hunspell │ / └─nvme0n1p3 ext4 1.0 c859be11-26eb-43ec-b0eb-8be05c7cdde3 14.5G 92% /home

    – Moyo Freeman Jan 05 '23 at 17:13
  • For hibernation, this only requires changing the ubuntu.conf to add another option resume=UUID=[swap-device-uuid] or equivalent just before ro. Great! – digikar Aug 08 '23 at 19:21