NixOS installation (LUKS and BTRFS setup)

Tue Aug 02 2022


I recently purchased a new computer to save weight during my commute : the Dell XPS 13 Plus, and a new computer equals a new way to procrastinate by installing yet another Linux distribution.

This time it is NixOS, I have used it on my servers and have wanted to use it on my laptop for some time, but I need my current laptop to function so I couldn't just erase everything and start tinkering with NixOS.

I also decided to do a full-disk encryption on the new machine, and use btrfs as the filesystem for the underlying disk.

Thus, I merged installation details from and



The XPS was shipped with Ubuntu already installed, and had three partitions :

I didn't change the EFI partition as it is big enough, but it isn't much more work to recreate everything.

Using gdisk :

gdisk /dev/nvme0n1


Create a new LUKS partition and open it :

cryptsetup luksFormat /dev/nvme0n1p2
cryptsetup open /dev/nvme0n1p2 enc-pv

Initiate the LVM structure :

pvcreate /dev/mapper/enc-pv
vgcreate vg /dev/mapper/enc-pv

Create a partition for the swap :

lvcreate -L 16G -n swap vg

Create the root partition on the remaining space :

lvcreate -l '100%FREE' -n root vg

Format the partitions :

mkswap -L swap /dev/vg/swap
mkfs.btrfs /dev/vg/root


Create the subvolumes for the root partitions :

mkdir -p /mnt
mount /dev/vg/root /mnt

btrfs subvolume create /mnt/root
btrfs subvolume create /mnt/home
btrfs subvolume create /mnt/nix

umount /mnt

NixOS installation

Mount the partitions and subvolumes :

mount -o compress=zstd,subvol=root /dev/vg/root /mnt

mkdir /mnt/{home,nix}

mount -o compress=zstd,subvol=home /dev/vg/root /mnt/home
mount -o compress=zstd,noatime,subvol=nix /dev/vg/root /mnt/nix
mkdir /mnt/boot

mount /dev/nvme0n1p1 /mnt/boot

swapon /dev/vg/swap

Generate the configuration :

nixos-generate-config --root /mnt

Configuration changes

By default, NixOS doesn't recognize LUKS devices, so we need to add the following in the configuration :

  boot.initrd.luks.devices = {
luksroot = {
device = "/dev/disk/by-uuid/THE_UUID_OF_THE_LUKS_PARTITION";
preLVM = true;
allowDiscards = true;

The mount options for the filesystems are not detected automatically by the NixOS installer, so we need to add the following :

  fileSystems = {
"/".options = [ "compress=zstd" ];
"/home".options = [ "compress=zstd" ];
"/nix".options = [ "compress=zstd" "noatime" ];


The only thing left is to install NixOS and reboot.



Final configuration

The final NixOS configuration is located at .