Installing Arch Linux with Full Disk Encryption
Let’s create an encrypted Arch Linux installation! You can follow this tutorial whether you plan to install Arch on an internal disk, a USB flash drive, an SD card, or an external drive. You will have to boot from either the official Arch ISO or an existing Arch Linux machine. This tutorial assumes that you’re working in a root-shell and that you’re already familiar with installing Linux distros and working on the command-line.
Partitioning
Feel free to come up with your own partitioning scheme and disk layout. In my
case I will install everything on an internal drive, known to my system as
/dev/sda. Make sure to replace every occurrence of sda with the correct
device name on your own system. It most likely will be different! Be careful not
to accidentally wipe any important data!
I’ve created three partitions on my drive:
- A placeholder partition for a legacy boot record (
/dev/sda1, size 1MB) - An EFI boot partition for UEFI systems (
/dev/sda2, size 512MB, typeef00) - My encrypted LUKS/root partition (
/dev/sda3, type8309)
Installer scripts
Let’s install the official Arch Linux installer scripts, which we’ll need to bootstrap the new system in a moment: (you can skip this step if you are installing from the official Arch ISO)
pacman -S arch-install-scriptsEncryption setup
Before creating our actual data volumes we need to initialize cryptsetup:
cryptsetup luksFormat --type luks2 /dev/sda3
cryptsetup open /dev/sda3 cryptlvmInstead of cryptlvm you can also use your own custom name, just make sure to
replace every occurrence of cryptlvm in this tutorial with it.
LVM setup
Let’s create a new LVM inside the encrypted partition:
pvcreate /dev/mapper/cryptlvm
vgcreate cryptvg /dev/mapper/cryptlvm
lvcreate -l 100%FREE cryptvg -n rootYou can use a custom name instead of cryptvg, just make sure to replace every
occurrence of cryptvg in this tutorial with it.
Filesystems
To keep it simple, I’ll create a regular ext4 filesystem inside the logical volume we just created, as well as a FAT32 system for the EFI boot partition:
mkfs.ext4 /dev/cryptvg/root
mkfs.fat -F32 /dev/sda2
mount /dev/cryptvg/root /mnt
mkdir /mnt/boot
mount /dev/sda2 /mnt/bootBootstrap Arch Linux
Let’s bootstrap a basic Arch Linux installation on /mnt:
pacstrap /mnt base linux linux-firmwareNext we’ll need to generate /etc/fstab:
genfstab -U /mnt >> /mnt/etc/fstabNow we got everything we need to use our fresh install as a self-contained
chroot:
arch-chroot /mntTime for the basic system configuration:
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
hwclock --systohcEdit /etc/locale.gen and enable your preferred system locale by uncommenting
its line. Then generate the locales for the first time:
locale-genEdit /etc/locale.conf and set your preferred locale as your system’s default:
LANG=en_US.UTF-8Set your system’s machine name in /etc/hostname and create a basic
/etc/hosts:
127.0.0.1 localhost
::1 localhost
127.0.1.1 mymachine.localdomain mymachineNext we’ll need to edit /etc/mkinitcpio.conf so we can generate an initramfs
which lets us decrypt our root partition during start-up. Change the HOOKS
definition to look like this:
HOOKS=(base systemd udev keyboard autodetect sd-vconsole modconf block sd-encrypt lvm2 filesystems fsck)We have to create an /etc/crypttab.initramfs to identify our encrypted volume.
Linux uses UUIDs to uniquely identify your data volumes, independent of the
system they’re attached to. Let’s figure out the UUID of our encrypted
partition:
ls -l /dev/disk/by-uuid | grep sda3Copy the UUID and edit /etc/crypttab.initramfs:
cryptlvm UUID=<your UUID> none luks2,discardWe can edit /etc/vconsole.conf to define the keyboard layout used for entering
our encryption passphrase during start-up:
KEYMAP=usLet’s generate a new initramfs image that contains everything we need for
decrypting our volume:
pacman -S lvm2
mkinitcpio -p linuxTime to set a root password:
passwdBoot-loader
Installing an EFI boot loader with systemd-boot is rather straight forward:
bootctl installWe will have to tell the boot loader which root partition to boot from. Look at
your /etc/fstab and copy the UUID of your root filesystem. Note that this is a
different UUID than the one we used before!
Edit /boot/loader/entries/arch.conf and add the following lines:
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=<your UUID> rwPackages
Last but not least, let’s install a few basic packages we may need:
pacman -S net-tools openssh wget htop dialog wpa_supplicantWe’re done! Exit the chroot and unmount the filesystems:
exit
umount -R /mnt
syncHooray, you’ve just finished installing an encrypted Arch Linux system! Try to boot it up and see if everything is working as expected.