This is a basic procedure for setting up a linux system my preferred way.

By no means is this a tutorial or a full guide to installing Linux. There are many parts that have been excluded, since this mainly focuses on the disk layout and partitioning.

Many parts are optional, and many partitions are not strictly required. For example, the ESP partition can be shared with the /boot partition. I don't like to do that, since that requires that the kernel be stored on FAT32 which is icky, but it does reduce the complexity of the install. Also, LVM volumes for /var and /tmp can also be safely excluded.

This setup works great for Arch Linux and Gentoo, and likely for Debian as well.

Set up disks

Assuming /dev/nvme0n1p is our primary disk.

Disk Layout:

Partition Purpose Label Size
/dev/nvme0n1p1 EFI System Partition efi 512 MB
/dev/nvme0n1p2 initramfs + kernel boot 1024 MB
/dev/nvme0n1p3 LUKS + LVM lvm 500 GB

The rest of the volumes will be set up using LVM slices inside the LUKS container.

Build Partitions

parted -a optimal /dev/nvme0n1

    mklabel GPT

    mkpart primary 1 512
    name 1 efi
    set 1 boot on 

    mkpart primary 512 1536
    name 2 boot

    mkpart primary 1536 100%
    name 3 lvm

Create LUKS volume

cryptsetup luksFormat --type luks2 /dev/nvme0n1p3
cryptsetup open /dev/nvme0n1p3 cryptlvm

Create LVM device

pvcreate /dev/mapper/cryptlvm
vgcreate stor /dev/mapper/cryptlvm

LVM Config

LVM is flexible, and more or less containers can be added. Note: I like to have a separate /var/log mount point to improve system stability.

Volume Name Mount Point Size
swap [swap] 4 GB
root / 50 GB
var /var 50 GB
log /var/log 10 GB
home /home 360 GB

Create Volumes

lvcreate -L 4G  stor -n swap
lvcreate -L 50G stor -n root
lvcreate -L 50G stor -n var
lvcreate -L 10G  stor -n log
lvcreate -l 100%FREE stor -n home

View LVM config

vgs - show volume groups
lvs - show logical volumes

Format & Mount Volumes

Partition Path Mount Point Filesystem
/dev/nvme0n1p1 [EFI] fat32
/dev/nvme0n1p2 /boot ext2
/dev/stor/swap [swap] swap
/dev/stor/root / ext4
/dev/stor/var /var ext4
/dev/stor/log /var/log ext4
/dev/stor/tmp /tmp ext4
/dev/stor/home /home ext4

Initialize Filesystems

mkfs.fat -F 32 /dev/nvme0n1p1
mkfs.ext2 /dev/nvme0n1p2
mkfs.ext4 /dev/stor/{root,var,log,home}

Set up Swap

mkswap /dev/stor/swap
swapon /dev/stor/swap

Alternatively, swap can be an image file in the root filesystem.

fallocate -l 1G /mnt/gentoo/swap.img
chmod 0600 /mnt/gentoo/swap.img
mkswap /mnt/gentoo/swap.img
swapon /mnt/gentoo/swap.img

Mount Filesystems

Substitue the mount point with where your distribution targets the install. Example, gentoo uses /mnt/gentoo/

Root filesystem:

mount /dev/stor/root /mnt/

Var and Log filesystems:

mkdir /mnt/var
mount /dev/stor/var /mnt/var/

mkdir /mnt/var/log
mount /dev/stor/log /mnt/var/log

Temp filesystem

 mkdir -p /mnt/tmp
 mount -o nodev,noexec /dev/stor/tmp /mnt/tmp

Home filesystem

 mkdir -p /mnt/home
 mount /dev/stor/home /mnt/home

Bootloader and Initramfs

I prefer grub because it's boring. Other bootloaders can be used as well.

GRUB

Afer building/installing the grub2 binaries on the target systems, the ESP partition can be set up.

 mkdir -p /boot/efi
 mount /dev/nvme0n1p2 /boot/efi

Then grub2 can be installed into the ESP.

 grub-install -target=x86_64-efi --efi-directory=/boot/efi

The ESP can be unmounted after this. It generally does not need to be mounted.

umount /boot/efi

GRUB config

Edit the /etc/default/grub and add cryptlvm to the boot.

This may vary based on GRUB version and distribution. For Arch linux:

 GRUB_CMDLINE_LINUX="cryptdevice=/dev/nvme0n1p4:cryptlvm rw quiet"

Or, for Gentoo:

 GRUB_CMDLINE_LINUX="crypt_root=/dev/nvme0n1p4 init=/lib/systemd/systemd dolvm"

Then, the config is set up.

  grub-mkconfig -o /boot/grub/grub.cfg

Archlinux initcpio

For Arch, the simplest way to go is to use initcpio.

/etc/mkinitcpio.conf

HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck)

And then generate the initramfs:

mkinitcpio -p linux

Genkernel intramfs

Make sure that genkernel-next is installed. The cryptsetup USE flag must also be used.

/etc/portage/package.use

 sys-kernel/genkernel-next  cryptsetup

Then genkernel is reconfigured.

/etc/genkernel.conf

LVM="yes"
LUKS="yes"
UDEV="yes"
BOOTLOADER="grub"

And a new initramfs is compiled and installed.

  genkernel initramfs

Services

Make sure that UDEV and LVMETAD are running on boot.

Systemd:

systemctl enable lvm2-lvmetad

OpenRC:

rc-update add lvmetad boot

System Rescue

If the system doesn't boot correctly, you can get back in from the grub emergency shell.

   cryptsetup open /dev/nvme0n1p4 cryptlvm

   > luks passphrase...

   mount /dev/stor/root /new_root

Then the kernel will pick up from where it left off, and start the init system... Hopefully getting you back up and running.