logo

Install ZFS on Ubuntu Trusty 14.04

In this blog post I’ll install ZFS-on-Linux (ZoL) on trusty old Ubuntu Trusty 14.04.

ZFS is an amazing file system that is now also usable on Linux. One of ZFS’ best features is that it can “self heal” as it is a checksumming file system. Also it can use SSDs in a couple of different ways, such as the ZIL drive and the L2ARC cache.

There are other interesting file systems and ways to cache with solid state drives. btrfs is continually getting better (I use it with Docker) and recently the Linux kernel gained a few ways to do SSD caching: dmcache, flashcache, and bcache.

In my situation I have various media files from short films I’ve made that I need to backup and protect from bitrot. To do that I’ve decided to use ZFS on Linux. I worked with ZFS + FreeBSD a bit, but I also want the ability to mount many different types of file systems, and surprisingly FreeBSD doesn’t support that many of them. I’m also a big fan of XFS, which I believe FreeBSD only supports in read-only mode. So Linux it is.

ZoL PPA

The easiest way to get ZoL is to use the ZFS-native PPA. The software-properties-common package is required for the add-apt-repository command.

curtis@storage:~$ sudo apt-get install software-properties-common
curtis@storage:~$ sudo add-apt-repository ppa:zfs-native/stable

Now we can install ZoL. Installing will also compile a kernel module.

NOTE: I’m removing a lot of the output below for brevity; I usually mark that with SNIP!.

curtis@storage:~$ sudo apt-get update
curtis@storage:~$ sudo apt-get install -y ubuntu-zfs
SNIP!
zfs.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.13.0-24-generic/updates/dkms/

depmod....

SNIP!
Setting up ubuntu-zfs (8~trusty) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...

Now load the module.

curtis@storage:~$ modprobe zfs
curtis@storage:~$ lsmod | grep zfs
zfs                  1185541  0
zunicode              331251  1 zfs
zavl                   15010  1 zfs
zcommon                51321  1 zfs
znvpair                89166  2 zfs,zcommon
spl                   175436  5 zfs,zavl,zunicode,zcommon,znvpair

Configure zpool

I have an older computer that I am using as the zfs backup server. In this example it has two 1.5TB drives that I want to use in a zfs mirror (ie. RAID1). I’ll add more storage later but for this example just the two 1.5TB drives, sdb and sdd. They were previously used elsewhere and need to be reformatted for zfs.

curtis@storage:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 119.2G  0 disk
├─sda1   8:1    0 113.3G  0 part /
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0     6G  0 part [SWAP]
sdb      8:16   0   1.4T  0 disk
├─sdb1   8:17   0   200M  0 part
├─sdb2   8:18   0   1.4T  0 part
└─sdb3   8:19   0   128M  0 part
sdc      8:32   0 465.8G  0 disk
├─sdc1   8:33   0    64K  0 part
├─sdc2   8:34   0   462G  0 part
└─sdc3   8:35   0   3.8G  0 part
sdd      8:48   0   1.4T  0 disk
├─sdd1   8:49   0   200M  0 part
├─sdd2   8:50   0   1.4T  0 part
└─sdd3   8:51   0   128M  0 part
sr0     11:0    1  1024M  0 rom

We’ll create a zpool mirror callled tank.

curtis@storage:~$ sudo zpool create tank mirror sdb sdd
curtis@storage:~$ zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank  91.5K  1.34T    30K  /tank

Interestingly zfs didn’t warn me about reformatting.

There is now a /tank directory of about ~1.4TB.

curtis@storage:~$ df -h | grep tank
tank            1.4T     0  1.4T   0% /tank

Now create another file system on tank. Note the casesensitivity=mixed for use with Windows.

curtis@storage:/tank$ zfs create -o casesensitivity=mixed tank/bup

Samba and ZFS

As stated previously, I want to use this as a backup server. I do a lot of work with video and audio files and that is all, unfortunately, done from a windows workstation. So I want to be able to backup from Windows to the ZoL backup server. I’ll use samba (SMB) to do that.

Please note that I haven’t used samba in years, so I’m not quite sure this is the right way to go about it. But it is working for me. :)

First, install samba.

curtis@storage:~$ sudo apt-get install samba

Now we can create a file system in /tank and share that via SMB.

curtis@storage:~$ sudo zfs set sharesmb=on tank/bup
curtis@storage:~$ sudo chown curtis:curtis /tank/bup

Check what zfs thinks about the share status with regards to samba and nfs.

root@storage:/var/log/samba# sudo zfs get sharesmb,sharenfs
NAME      PROPERTY  VALUE     SOURCE
tank      sharesmb  on        local
tank      sharenfs  off       default
tank/bup  sharesmb  on        local
tank/bup  sharenfs  off       default

Based on this blog post I added the below to /etc/samba/smb.conf and restarted smbd and nmbd. These settings may or may not be appropriate for your use case.

usershare path = /var/lib/samba/usershares
usershare max shares = 100
usershare allow guests = yes
usershare owner only = n

Next, add a samba user.

root@storage:/var/log/samba# sudo smbpasswd -a curtis
New SMB password:
Retype new SMB password:
Added user curtis.

Finally I can connect to that server with \storage\tank_bup or the server and share should be browsable from the Windows workstation, assuming they are on the same network, and in this case they are.

Conclusion

In this post I’ve done a couple things:

So far the performance has been fine. I get about 111MB/s write which is basically as fast as a 1GB network can go.

Soon I’ll add an SSD caching device which will get me more IOPS but I’ve hit the limit on the network.

Updates