Skip to content

Instantly share code, notes, and snippets.

@danielb2
Last active July 9, 2022 16:26
Show Gist options
  • Save danielb2/597c175145d6b1ee39207668807d2e3d to your computer and use it in GitHub Desktop.
Save danielb2/597c175145d6b1ee39207668807d2e3d to your computer and use it in GitHub Desktop.
Alpine Linux with root on ZFS with native encryption

Setting up Alpine Linux using ZFS with a pool that uses ZFS' native encryption capabilities.

Download

Download the extended release from https://www.alpinelinux.org/downloads/ as only it contains the zfs kernel mods at the time of this writing (2020.07.10)

Write it to a USB and boot from it.

Initial setup

Run the following:

setup-alpine

Answer all the questions, and hit ctrl-c when promted for what disk you'd like to use.

OPTIONAL

This section is optional and it assumes internet connectivity. You may enable sshd so you can ssh into the box and copy and paste the rest of the commands into my terminal window from these instructions.

Edit /etc/ssh/sshd_config and search for Permit. Change the value after PermitRootLogin to read yes

save and exit to shell. Run service sshd restart

Now you can ssh in as root. Do not forget to go back and comment this line out when you're done since it will be enabled on your resulting machine. You will be reminded again at the end of this doc.

Add needed packages:

apk add zfs sfdisk e2fsprogs syslinux

Create our partitions

We're assuming /dev/sda here and in the rest of the document but you can use whatever you need to. To see a list, type: sfdisk -l

echo -e "/dev/sda1: start=1M,size=100M,bootable\n/dev/sda2: start=101M" | sfdisk --quiet --label dos /dev/sda

Create device nodes

mdev -s

Create the /boot filesystem

mkfs.ext4 /dev/sda1

Create the root filesystem using zfs

modprobe zfs
zpool create -f -o ashift=12 \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \
    -O encryption=aes-256-gcm -O keylocation=prompt -O keyformat=passphrase \
    -O mountpoint=/ -R /mnt \
    rpool /dev/sda2

You will have to enter your passphrase at this point. Choose wisely, as your passphrase is most likely the weakest link in this setup.

A few notes on the options supplied to zpool:

  • ashift=12 is recommended here because many drives today have 4KiB (or larger) physical sectors, even though they present 512B logical sectors

  • acltype=posixacl enables POSIX ACLs globally

  • normalization=formD eliminates some corner cases relating to UTF-8 filename normalization. It also enables utf8only=on, meaning that only files with valid UTF-8 filenames will be accepted.

  • xattr=sa vastly improves the performance of extended attributes, but is Linux-only. If you care about using this pool on other OpenZFS implementation don't specify this option.

After completing this, confirm that the pool has been created:

# zpool status

Should return something like:

  pool: rpool
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  sda2      ONLINE       0     0     0

errors: No known data errors

Create the required datasets and mount root

zfs create -o mountpoint=none -o canmount=off rpool/ROOT
zfs create -o mountpoint=legacy rpool/ROOT/alpine
mount -t zfs rpool/ROOT/alpine /mnt/

Mount the /boot filesystem

mkdir /mnt/boot/
mount -t ext4 /dev/sda1 /mnt/boot/

Install Alpine Linux

setup-disk /mnt
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda # write mbr so we can boot

Enable ZFS' services:

rc-update add zfs-import sysinit
rc-update add zfs-mount sysinit

Edit the /etc/mkinitfs/mkinitfs.conf file and append zfs module to the features parameter: features="ata base ide scsi usb virtio ext4 lvm zfs"

Reboot and enjoy!

;)

NOTE If you went with the optional step, be sure to disable root login after you reboot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment