Manual disk encryption on Ubuntu
Ubuntu makes it very easy to set up full disk encryption, but it requires you to wipe the entire disk if you want the wizard to do it for you, so this is how you can set it up manually.
One common reason you may want to do this is in a dual boot scenario, where one or several leading partitions are already taken – or maybe you simply want to keep whatever is there.
The option in the Ubuntu installer to “Encrypt the new Ubuntu installation for security” is only available when choosing “Erase disk and install Ubuntu”. So, if you don’t want to wipe the entire disk, but you still want to boot an encrypted root partition, it needs some preparation.
This also gives some useful insight into how the disk encryption is actually set up behind the scenes.
In this guide we will:
- Set up the partitions we want manually using
sgdisk
– but you can usegparted
or similar if you prefer. - Use
cryptsetup
to encrypt a partition - Decrypt (open) and mount this encrypted device, and set up LVM within it
- Have Ubuntu run its installation against the unlocked partition, like any normal installation.
- Manually configure the new installation to prompt the user for a passphrase to unlock the device on boot
This may sound like a lot, but it’s pretty straight forward.
This guide assumes that you already have, or that you will create, an EFI system partition. This is outside the scope of the guide.
Note: This post is heavily inspired by this post by Mike Kasberg.
Graphical representation#
| ### sda1 ### | ## sda2 ## | ######### sda3 ######### | -,
^-untouched ^-/boot ^- LUKS LVM (encrypted) |
|
| ####################### sda3 ####################### | <´
| ## swap (lv) ## | ########### root (lv) ########### |
Introduction#
In this example, /dev/sda1
is taken and we do not want to remove it.
After sda1
, there is free space available. You may very well have
multiple partitions “taken”. If so, the partitions you create might be
sda5
, or sda6
etc.
Partitions#
First, create a 2G
partition for /boot (we’re not encrypting this) on
/dev/sda
as partition 2
, which is the next free partition number
available in this example where only sda1
exists.
sgdisk --new=2:0:+2G /dev/sda
Let the next partition 3
fill the remaining space:
sgdisk --new=3:0:0 /dev/sda
Now set the name of 2
to /boot and 3
to rootfs
sgdisk --change-name=2:/boot --change-name=3:rootfs /dev/sda
Then set the typecode to 8300 on both (Linux filesystem)
sgdisk --typecode=2:8300 --typecode=3:8300 /dev/sda
At this point, we’re going to use LUKS to encrypt what will later become
our root disk (sda3
):
cryptsetup luksFormat --type=luks1 /dev/sda3
Then open it with the passphrase you chose and call it “root”, or whatever really:
cryptsetup open /dev/sda3 root
The naming root
makes the unlocked device available at
/dev/mapper/root
LVM#
We can now treat this meta-device as a regular HDD and create a physical volume for LVM as you would normally:
pvcreate /dev/mapper/root
Create a volume group, then one logical volume for swap, and use the rest for our root partition.
vgcreate ubuntu-vg /dev/mapper/root
lvcreate -L 4G -n swap ubuntu-vg
lvcreate -l 100%FREE -n root ubuntu-vg
Install Ubuntu#
Since this encrypted device is already unlocked and LVM has been prepared, we can use the normal GUI installation in Ubuntu to install into it.
If you want to double check at this point, you can run gparted
as root
which should show the partitions you just created.
Start the regular Ubuntu installation, select language, keyboard layout etc. and then select “Something else” when asked about how you want to install.
Here’s what we’ll do in the installation GUI:
- Edit
/dev/mapper/ubuntu--vg-root
, set to ext4 mounted at/
, and format it. - Edit
/dev/mapper/ubuntu--vg-swap
, set to swap area. - Edit
/dev/sda2
, set to ext4 mounted at/boot
, and format it.
Let the installation complete, but – do not – reboot or shut down the installation (select “Continue Testing”).
The reason we must keep the installation going is that the installation wizard does not understand that it has actually installed Ubuntu into an encrypted device, so we need to add some configuration to the installation we just did while it’s still open so that it will prompt the user for the passphrase to decrypt it.
chroot into the installation#
We’ll use /target
for mounting our installed system:
mount /dev/mapper/ubuntu--vg-root /target
mount /dev/sda2 /target/boot
for n in proc sys dev etc/resolv.conf; do mount --rbind /$n /target/$n; done
Before jumping into it, we need to figure out the UUID (not PARTUUID) of the encrypted partition (/dev/sda3). This can be found by running:
blkid /dev/sda3
Save this for later.
Since /target
is now a usable environment, we can chroot to it:
chroot /target
mount -a
Now create and edit /etc/crypttab
which likely does not exist and add
the name for the device, the device itself (by UUID, no quotes) and some
options:
root UUID=your_uuid_here none luks,discard
Save the file, then apply your changes by running:
update-initramfs -k all -c
This will re-generate your initrd images, and when done you’re ready to reboot. After the reboot, you should be greeted with a prompt asking you for the passphrase to decrypt “root”, and that’s it!