Disclaimer: This is for personal reference, read up on the official documentation before you brick something you did not want bricked…
Create disk
sudo dd if=distro.iso of=/dev/sdX status_progress bs=1M
Boot live cd
Set keymap, then prepare disks
(If in virtualbox, make sure to activate EFI mode)
Partition drive
Use lsblk
or blkid
, fdisk -l
to get an overview of the current situation,
then create GPT table and partitions with:
sgdisk --zap-all /dev/sdX
sgdisk --clear \
--new=1:0:+550MiB --typecode=1:ef00 --change-name=1:EFI \
--new=2:0:0 --typecode=2:8300 --change-name=2:system \
/dev/sdX
Or use cgdisk
which is nice and interactive.
Create FAT32 filesystem for ESP on first partition:
mkfs.fat -F32 -n EFI /dev/diSk/by-partlabel/EFI
Cryptsetup
cryptsetup luksFormat /dev/sda2 --key-size 512 --iter-time 2000
cryptsetup luksOpen /dev/sda2 cryptroot
(Could also use /dev/disk/by-partlabel/...
instead of /dev/sda2
…)
mkfs.ext4 /dev/disk/by-partlabel/system
(Using ext4
because the Ubuntu installer ubiquity
will create subvolumes
for / → @
and /home → @home
by default if using btrfs
)
Start installation
ubiquity -b
Select language, keymap(de-latin1-nodeadkeys
), then for “Installation type”
select ”Something else”, use /dev/mapper/cryptroot
as /
with ext4
and
/dev/sda1
as esp
(EFI system partition)
Then click through the warnings, enter credentials.
Then DO NOT REBOOT, click “Continue testing”
Fix partitions
mount /dev/mapper/cryptroot /mnt
mkdir -p /mnt/boot/efi
mount LABEL=EFI /mnt/boot/efi
chroot
Before you chroot, mount the following filesystems from the live system:
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /dev /mnt/dev
mount --bind /run /mnt/run
mount --bind /dev/pts /mnt/dev/pts
Otherwise the cryptsetup
hook from update-initramfs
will fail later.
Finally
chroot /mnt
Fix fstab, crypttab
Find out UUID of root partition(not mounted filesystem!) with blkid
.
Remove the swap
entry from /etc/fstab
, then create /etc/crypttab
, replace
<UUID from blkid>
of course:
#/etc/crypttab
cryptroot UUID=<UUID from blkid> none luks
Check that /dev/mapper/cryptroot
is listed correctly in /etc/fstab
.
Update initramfs
Regenerate the initramfs:
update-initramfs -k all -u
Should run without any errors; if it complains about not seeing devices you
probably forgot to mount /dev
into the chroot target.
Then copy to ESP
cp /boot/initrd.img-* /boot/efi/initrd.img
cp /boot/vmlinuz-* /boot/efi/vmlinuz-generic
Bootloader
Install systemd-boot
to the ESP
bootctl --path=/boot/efi install
Then check efi vars with efibootmgr -v
, in case bootctl
failed to install
an entry, use
efibootmgr \
--create \
--disk /dev/nvme0n1 \
--gpt \
--loader "\EFI\systemd\systemd-bootx64.efi" \
--label systemdboot \
--part 1 \
--timeout 0 \
--write-signature \
--verbose
Set boot order if necessary, 0010
would be systemd-boot
efibootmgr -o 0010,0020
Configure bootloader in /boot/efi/loader/loader.conf
default ubuntu
# leave timeout to debug
timeout 2
# leave editor to debug
editor 1
Create boot entries
# /boot/efi/loader/entries/ubuntu.conf
title Ubuntu
initrd /initrd.img
linux /vmlinuz-generic
options r0 root=/dev/mapper/cryptroot quiet splash
Finishing
Unmount everything, exit chroot, shutdown, remove USB key, boot, enjoy.
If something is broken, hold down space at boot for systemd-boot
to halt, allowing editing of the kernel commandline by pressing e on
a boot entry.
Outlook
This setup will not install kernel updates by itself, you’ll need a hook that moves the updated initrd and kernel stubs onto the ESP and creates appropriate boot manager entries.
References