Root on ZFS with native encryption: Difference between revisions
(replace linux-vanilla with linux-lts) |
(update to reflects steps for latest version v3.12) |
||
Line 1: | Line 1: | ||
= | = 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` | |||
/dev/ | |||
== | 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 [https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#5-security-aspects the weakest link in this setup]. | You will have to enter your passphrase at this point. Choose wisely, as your passphrase is most likely [https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#5-security-aspects the weakest link in this setup]. | ||
Line 57: | Line 57: | ||
A few notes on the options supplied to zpool: | 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: | After completing this, confirm that the pool has been created: | ||
# zpool status | |||
Should return something like: | 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/ | |||
=== Enable ZFS' services === | |||
rc-update add zfs-import sysinit | |||
rc-update add zfs-mount sysinit | |||
== Install Alpine Linux == | |||
setup-disk /mnt | |||
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda # write mbr so we can boot | |||
== Reboot and enjoy! == | |||
😉 | |||
'''NOTE:''' | |||
If you went with the optional step, be sure to disable root login after you reboot. |
Revision as of 22:54, 11 July 2020
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/
Enable ZFS' services
rc-update add zfs-import sysinit rc-update add zfs-mount sysinit
Install Alpine Linux
setup-disk /mnt dd if=/usr/share/syslinux/mbr.bin of=/dev/sda # write mbr so we can boot
Reboot and enjoy!
😉
NOTE: If you went with the optional step, be sure to disable root login after you reboot.