Setup a ZFS storage pool

Key Value
Summary Find out how to enable ZFS and create a storage pool on Ubuntu 16.04.
Categories server
Difficulty 2
Author Aden Padilla adenpadilla@gmail.com

Overview

Duration: 1:00

ZFS is a combined file system and logical volume manager originally designed and implemented by a team at Sun Microsystems led by Jeff Bonwick and Matthew Ahrens. Features of ZFS include protection against data corruption, high storage capacity (256 ZiB), snapshots and copy-on-write clones and continuous integrity checking to name but a few. If you are dealing with large amounts of data, or providing a backing filesystem for virtualisation, ZFS is a great choice.

This guide will go through the process of installing ZFS on Ubuntu 16.04 LTS and setting up a storage pool.

What youā€™ll learn

  • How to install ZFS
  • How to create a storage pool

What youā€™ll need

  • Ubuntu Server 16.04 LTS

Ready? Letā€™s head over to the next step!

Originally authored by Aden Padilla.

Installing ZFS

Duration: 1:00

The main components of ZFS are maintained as a standard Ubuntu package, so to install simply run:

sudo apt install zfsutils-linux

After that, we can check if ZFS was installed correctly by running:

whereis zfs

You should see output similar to the following:

whereisoutput

Now that weā€™re done installing the required packages, letā€™s create a storage pool!

Creating a ZFS Pool

Duration: 3:00

Choosing Drives to Pool

Check installed drives by running:

sudo fdisk -l

Carefully note down the device names of drives you want to pool.

These are the two drives weā€™re going to pool: disk1

Creating a Pool

There are two types of simple storage pools we can create. A striped pool , also called RAID-0 , in which the data is stored in ā€œstripesā€ across all drives, or a mirrored pool , also called RAID-1 , in which a complete copy of all data is stored separately on each drive. Striped pools are not fault tolerant whereas mirrored pools can survive the failure of one drive. Striped pools have twice the storage capacity of mirrored pools and have better performance than mirrored pools.

To create a striped pool, we run:

sudo zpool create new-pool /dev/sdb /dev/sdc

To create a mirrored pool, we run:

sudo zpool create new-pool mirror /dev/sdb /dev/sdc

In both examples, new-pool is the name of the pool.

ā“˜ Sometimes an error like this might pop up:
error Add ā€œ-fā€ to the end of the zpool create command to override it.

A mirrored pool is usually recommended as weā€™d still be able to access our data if a single drive fails. However, this means that weā€™ll only get the capacity of a single drive. A striped pool, while giving us the combined storage of all drives, is rarely recommended as weā€™ll lose all our data if a drive fails. You can also opt for both, or change the designation at a later date if you add more drives to the pool.

The newly created pool is mounted at /new-pool. You can select a different mount point using the -m option:

sudo zpool create -m /usr/share/pool new-pool mirror /dev/sdb /dev/sdc

The newly mounted pool will appear to Ubuntu as any other part of the filesystem.

Checking Pool Status

Duration: 1:00

You can check the status of ZFS pools with:

sudo zpool status

This is the status of our newly created pool: newpoolstats

Removing the pool

Duration: 1:00

If you are finished with the pool, you can remove it. Beware that this will also remove any files that you have created within the pool!

sudo zpool destroy new-pool

You can confirm that the pool has been removed by checking the filesystem and by running the status check again:

sudo zpool status

Thatā€™s all!

Duration: 1:00

Congratulations, you have updated your Ubuntu install with a cutting edge new filesystem! You have found out:

  • How to install the ZFS utilities
  • How to identify which drives to use in a ZFS pool
  • The basic types of ZFS pools
  • How to create and mount a pool
  • How to remove the pool once you no longer need it

Be sure to check back on this site for more tutorials on using ZFS!

Further reading

1 Like

For the example creating the pool is fine using device names like /dev/sdb. However in real life DO NOT CREATE your pool this way since device allocation is NOT STABLE between reboots especially not when new devices are added. You can run into a lot of trouble only due to rearranged disks!

Best way to add disks is to follow this tutorial, but then instead of using /dev/sdb /dev/sdc find their corresponding disk-idā€™s in /dev/disk/by-id, note the idā€™s for both disks (not the partitions!) and use those to add the disks to the pool. These IDā€™s are stable throughout and disk specific in whatever order they may appear in the future. Example below (change the example idā€™s to YOUR idā€™s!);

sudo zpool creat new-pool /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F59GRA /dev/disk/by-id/ata-ST3000DM001-1CH166_Z3F66GGB

1 Like

Sorry the message got posted while not being finished.
After adding the disk by id (or if you did create the pool by device name) there is a simple solution;

sudo zpool export new-pool
sudo zpool import -d /dev/disk/by-id new-pool
sudo zpool status

The status should now show you the pool using device-idā€™s instead of device names.

1 Like

The wording:

" There are two types of simple storage pools we can create. A striped pool , where a copy of data is stored across all drives or a mirrored pool , where a single complete copy of data is stored on all drives."

is very confusing.

The wording ā€œA striped pool , where a copy of data is stored across all drivesā€ implies that a copy of all data is stored across all drives, meaning that if any one drive fails, the copy can be recovered from another drive. This is not the case.

The wording ā€œa mirrored pool , where a single complete copy of data is stored on all drivesā€ implies that a single copy of the data is spread across all drives, and if any drive breaks, some or all of the data is lost. This is not the case.

It would have been better to write:

" There are two types of simple storage pools we can create. A striped pool , also called RAID-0, in which the data is stored in ā€œstripesā€ across all drives, or a mirrored pool , also called RAID-1, in which a complete copy of all data is stored separately on each drive. Striped pools are not fault tolerant whereas mirrored pools can survive the failure of one drive. Striped pools have twice the storage capacity of mirrored pools and have better performance than mirrored pools."

1 Like

@benavrhm Thank you for this suggestion, itā€™s much clearer indeed. Iā€™ve updated the tutorial.

1 Like

This is very good!

Iā€™d like to see how I can mount ZFS in Ubuntu Live USB to repair config files!

Thanks!