You should follow the guide on the wiki alongside this guide as it will be certainly more up to date. The purpose of this guide is to provide a more straight forward installation guide, as the one in the arch wiki is sometimes a bit vague as it's designed to be useful for any installation.
The goal is to install ArchLinux with its root on a ZFS filesystem, using rEFInd as the boot manager to support easy dual-booting from separate HardDrives. Please keep in mind that this guide assumes a system using UEFI.
The Partition layout will be as follows:
| Partition | Filesystem | Size | Partition type | Mount point |
|---|---|---|---|---|
| DISKp1 | FAT32 | 512MiB - 1GiB | ef00 | /boot |
| DISKp2 | ZFS | REST | bf00 | / |
First, boot from the PC you are going to install ArchLinux to, and boot from the USB Stick. I would recommend starting an ssh server, to do that type systemctl start sshd.service then set a root password with passwd. To connect to the server type ssh root@IP where IP is the IP of your ssh server, to find it, type ip addr.
To start Partitioning type lsblk to find the device you want to partition. It will be referenced with DISK from now on. \
start partitioning with gdisk /dev/DISK (or any other tool)
in gdisk type:
>o => to start new gpt partition scheme
>y => to confirm
>n => to create a new partition (this will be our /boot partition)
> or 1 => to make it the first partition ( means nothing e.g. just press ENTER)
> => to start at the first usable sector
>+xGiB or +xMiB => to make the partition x GiB/MiB
>ef00 => to set the partition type to EFI system partition
now create the second partition for the system
>n => to create a new partition (this will be our / partition)
> or 2 => to make it the second partition ( means nothing e.g. just press ENTER)
> => to make it start at the first usable sector
> => to make it end at the last usable sector
>bf00 => to set the partition type to Solaris root
then type p to check the partition layout and then type w and y to confirm.
and format the /boot partition to FAT32 with mkfs.vfat -F 32 /dev/DISKp1,
for zfs we need to reference the disk by its id, to get it type ls -al /dev/disk/by-id and remember the id of your root partition e.g. DISK.xxxxxxxxxxxxxxxx-part2 (can have a different format depending on your disk)
now create the pool for your root with: \
|
|
Note that in this case the root pool is called zroot, same as in the arch wiki. But one may change it to something like rpool, like its typically called in solaris systems.
create the root and home datasets for zroot with
zfs create -o mountpoint=none zroot/data; \
zfs create -o mountpoint=none zroot/ROOT; \
zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/default; \
zfs create -o mountpoint=/home zroot/data/home; \
zfs create -o mountpoint=/root zroot/data/home/root;
now check if the any datasets are mounted with zfs get mounted and if so unmount them with zfs umount -a and optionally delete the created folders with rm -rf /mnt/*, then check if everything worked so far with zfs list. The output should look similar to this:
NAME USED AVAIL REFER MOUNTPOINT
zroot xxxK xxxG xxK none
zroot/ROOT xxxK xxxG xxK none
zroot/ROOT/default xxxK xxxG xxK /mnt
zroot/data xxxK xxxG xxK none
zroot/data/home xxxK xxxG xxK /mnt/home
zroot/data/home/root xxxK xxxG xxK /mnt/root
To confirm everything so far worked export and reimport the pool (in this case zroot). To do this type zpool export zroot to export the pool (to be able to export a pool make sure all datasets are unmounted, which we already made sure) and reimport it with zpool import -d /dev/disk/by-id -R /mnt zroot -N .
After being imported, the pool still needs to be mounted. In case you encrypted your pool, it first needs to be unlocked with zfs load-key zroot, which will prompt you for a password assuming you chose prompt as the key location for your root pool. Now make sure to first only mount the ROOT/default dataset with zfs mount zroot/ROOT/default as the order is important, then the remaining datasets with zfs mount -a.
create the mount mountpoint at /mnt/boot with mkdir /mnt/boot. Its worth mentioning that nowadays its more common to mount uefi systems at /efi but in our case /boot works better with rEFInd.
mount the efi partition at /mnt/boot with mount /dev/DISKp1 /mnt/boot and set the root to boot from for zroot with zpool set bootfs=zroot/ROOT/default zroot.
finally "install" the system with pacstrap /mnt PACKAGES where PACKAGES is a space separated list of packages you need in the new system, it should only contain necessary packages, the rest should be installed when chrooted. An example would be base base-devel neovim openssh opendoas and in some cases a networkmanager like NetworkManager or iwctl if you want to use wifi with systemd-networkmanager. You could also copy the ArchISO pacman.conf to the new system with cp /etc/pacman.conf /mnt/etc/
generate a fstab with genfstab -U -p /mnt >> /mnt/etc/fstab and edit it to exclude all the zfs datasets (should only contain efi partition) by commenting them out, the lines to comment out are most likely:
zroot/ROOT/default
zroot/data/home
zroot/data/home/root
chroot into the new system with arch-chroot /mnt.
now follow the instructions to add the arch-zfs repo to pacman. Do it by adding
[archzfs]
SigLevel = Never # Upstream is still working on signatures
Server = https://github.com/archzfs/archzfs/releases/download/experimental
to the pacman.conf. Then if the versions of archzfs and linux match just type pacman -S linux archzfs-linux. Should the key import fail download the key with curl --remote-name https://archzfs.com/archzfs.gpg and add it to the keychain with pacman-key -a archzfs.gpg then sign it with pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76 you may also delete the keyfile again with rm -f archzfs.gpg
If they don't match add the end.re repo if you don't want to manually install the right kernel version but keep in mind that this repo isn't official, so use with care.
generate an appropriate host id with: zgenhostid $(hostid) and create a zfs cache file with zpool set cachefile=/etc/zfs/zpool.cache zroot. Your system won't boot if you forget this step.
modify the kernel hooks in /etc/mkinitcpio.conf to HOOKS=(base udev autodetect modconf block keyboard zfs filesystems), that means adding zfs in front of filesystems and moving keyboard in front of both. You may optionally also remove fsck, as it's not needed when the root is on a zfs filesystem. Then generate the new hooks with mkinitcpio -p KERNEL where kernel is the name of your kernel, in most cases linux.
Also enable these services zfs.target, zfs-import-cache, zfs-mount, zfs-import.target with these commands
systemctl enable zfs.target
systemctl enable zfs-import-cache
systemctl enable zfs-mount
systemctl enable zfs-import.target
Lastly, set the root users password via passwd.
Before the next step, exit the chroot.
Install rEFInd with pacman -S refind and let it install its files to /boot with refind-install, then add "Standard boot options" "rw zfs=bootfs" to /boot/refind_linux.conf for further install options consider the arch wiki.
Don't forget to export and unmount the pools and partitions with umount /mnt/boot, zfs umount -a, zpool export zroot. If that fails consider using the -foption to force the unmount and export and if that also fails try using the legacy unmount option with the force flag like umount -l /mnt
Your system won't boot if you forget this!!!
the system is now ready to use and bootable but it should still be configured as shown in the vanilla arch install guide to be properly usable.