This article will show how to compile ZFS on Linux 0.8.2 on Ubuntu 18.04 on ARM64, specifically the FriendlyElec NanoPi M4 single board computer, which has a four port SATA HAT available. It works great on other single board computers too, and I’ve successfully compiled and used ZFS on the Raspberry Pi.
These instructions will most likely work on other architectures supported by ZFS on Linux, such as x86_64.
Install ZFS build requirements
apt to install the packages needed to build ZFS 0.8.2 from source:
$ sudo apt install -y \ alien \ autoconf \ automake \ build-essential \ dkms \ fakeroot \ gawk \ gdebi-core \ libacl1-dev \ libaio-dev \ libattr1-dev \ libblkid-dev \ libdevmapper-dev \ libelf-dev \ libselinux-dev \ libssl-dev \ libtool \ libudev-dev \ nfs-kernel-server \ python3 \ python3-dev \ python3-cffi \ python3-setuptools \ uuid-dev \ zlib1g-dev
Install Linux kernel headers
This step actually depends on what board and what distribution you are running. In this example, the package for the Linux kernel headers is called
rk3399 references the CPU used by the FriendlyElec NanoPi M4 (Rockchip RK3399).
I’ll provide both a generic command that should work on most boards and distributions, but please consult your board and distribution documentation for the specific package name.
$ sudo apt install -y linux-headers-$(uname -r)
FriendlyElec NanoPi M4:
$ sudo apt install -y linux-headers-rk3399
Get ZFS 0.8.2 source code
Go to the directory where you want to store the ZFS source code, download from GitHub and unpack the source code archive:
$ cd ~ # for example $ curl https://github.com/zfsonlinux/zfs/releases/download/zfs-0.8.2/zfs-0.8.2.tar.gz -O $ tar xfvz zfs-0.8.2.tar.gz
Build ZFS 0.8.2 source code
Configure the source code and build the Debian (
$ cd zfs-0.8.2 $ ./autogen.sh $ ./configure $ make $ make deb-utils $ make deb-dkms
Install ZFS 0.8.2 packages
Install all the packages built by the commands above:
$ for file in *.deb; do sudo gdebi -q --non-interactive $file; done
Enable and start ZFS 0.8.2 services
ZFS uses a bunch of services, enable and start them as follows:
$ sudo systemctl enable --now zfs-import-cache.service $ sudo systemctl enable --now zfs-import-scan.service $ sudo systemctl enable --now zfs-import.target $ sudo systemctl enable --now zfs-mount.service $ sudo systemctl enable --now zfs-share.service $ sudo systemctl enable --now zfs-zed.service $ sudo systemctl enable --now zfs.target
Done! ZFS is built from source code and is running. Now you can either create a new zpool or import an existing one.
Create a new zpool with and without native encrypt
The following creates a zpool with encryption (
aes-256-gcm algorithm with a passphrase), compression (lz4) and various recommended settings. The zpool (
tank) will be configured in RAID-Z1 (allowing one disk to fail without data loss) and made up of three vdevs (in this case three regular disks,
$ sudo zpool create -o ashift=12 \ -O acltype=posixacl \ -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 \ tank raidz sda sdb sdc
Without encryption is similar, but without the
$ sudo zpool create -o ashift=12 \ -O acltype=posixacl \ -O compression=lz4 \ -O dnodesize=auto \ -O normalization=formD \ -O relatime=on \ -O xattr=sa \ tank raidz sda sdb sdc
Import an existing zpool
Simply run (where
tank is the zpool name):
$ sudo zpool import tank
Please let me know if you have any issues and I’ll update the article! Good luck with ZFS on your ARM64 system.