How to format external drive into ZFS?

The getting started page you posted a link to explains how to create a simple one disk pool.

This is the only thing you need to do. Creating a pool will automatically create a file system with the same name as the pool, which is what you call formatting a drive.

In your case, you can run from the command line:

diskutil partitiondisk /dev/disk5 GPTFormat ZFS %noformat% 100%
zpool create extdrive /dev/disk5s2

and you'll have a new volume named extdrive available.

If you happen to run software with inconsistent file naming, like Adobe products and possibly Nikon capture, you might want to create a dedicated file system with case insensitivity set using something like:

zfs create -o casesensitivity=insensitive -o normalization=formD  extdrive/data

I'm not so familiar with ZFS on Mac, so I'll try and speak on ZFS in general.

ZFS is a software-based volume manager that you can use to 'virtually' RAID a number of disks together.

The resultant storage volume that is created, is referred to as a zpool.

  • For example, you can take 2x raw disks [2x 3TB disks for example] and create a zpool (mirrored) via: zpool create MyPool mirror /dev/sda /dev/sdb

  • It's possible you might not have raw disks; in this case you can force ZFS to use preformatted disks by using the -f flag: zpool create -f MyPool mirror /dev/sda /dev/sdb

  • In your case, with a single preformatted disk, you can try forcing the creation of a zpool via: zpool create -f MyPool /dev/sda

  • Some disks use a 4k sector size. You might choose to create your zpool using a 4k sector size to maintain proper alignment: zpool create -f -o ashift=12 MyPool /dev/sda

Now let's assume you have a zpool called MyPool with total pool capacity of 3TB (mirrored 2x 3TB drives).

Creating A Filesystem:

  • From that raw 'pool' of storage, you can now create a filesystem. Your OS will be able to use/read/write the filesystem... NOT the pool.
  • create a ZFS filesystem on your pool via: zfs create MyPool/Videos
  • Now you should have a zfs filesystem called 'Videos' residing in /MyPool/Videos
  • You can freely read and write to /MyPool/Videos, share it over the network, set permissions, etc.

Creating a Virtual Block Device:

  • If you want, you can also create a virtual block device from your zpool via: zfs create -V 100GB MyPool/TestDevice
  • TestDevice will be a virtual device with 100GB capacity, and it generally resides in: /dev/zvol/MyPool/TestDevice
  • You can create any filesystem you want on TestDevice (HFS, EXT4, NTFS, etc), mount it, then use it!

You can create a bunch of Filesystems/Virtual-block-devices on your pool, and use them all very differently.

  • For example, you can have a zpool with multiple filesystems/virtual-devs tuned accordingly to Videos, TimeMachine-backups, Databases, etc respectively.
  • All these filesystems/virtual-devs would share from the same pool of storage. All data on the pool is redundant and dynamically protected against bit-rot.

First, find your device node:

$ diskutil list
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *4.0 TB     disk1
   1:               Windows_NTFS My Book                 4.0 TB     disk1s1

Then format your HDD (where /dev/disk1 is your device node from above command):

$ zpool create -f -O casesensitivity=insensitive -O normalization=formD WD_4TB /dev/disk1
checking path '/dev/disk1'

You may be able to improve performance for some workloads by setting ashift=12. This tuning can only be set when the pool is first created and it will result in a decrease of capacity. For additional detail on why you should set this option when using Advanced Format drives see section 1.15 How does ZFS on Linux handles Advanced Format disks?