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.
Run the following:
setup-alpine
Answer all the questions, and hit ctrl-c when promted for what disk you'd like to use.
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.
apk add zfs sfdisk e2fsprogs syslinux
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
mdev -s
mkfs.ext4 /dev/sda1
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 enablesutf8only=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
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/
mkdir /mnt/boot/
mount -t ext4 /dev/sda1 /mnt/boot/
setup-disk /mnt
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda # write mbr so we can boot
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"
;)
NOTE If you went with the optional step, be sure to disable root login after you reboot.