Install zfs on debian 9 stretch

The actual answer by @cas is good but have some corrections to be applied.

So let's take a fresh installation of Debian 9 and assuming that the contrib non-free repositories are also not enabled.


Step 0 - Enable the contrib non-free repositories

I used sed to find and replace the word main inside /etc/apt/sources.list

sed -i 's/main/main contrib non-free/g' /etc/apt/sources.list

apt-get update

Step 1 - ZFS Installation

Since the last fixes spl-dkms is correctly seen as zfs-dkms dependency so it's recalled automatically and it's not necessary to install it manually before zfs-dkms. The symbolic link is needed due to a bug inside the zfs distribution in Debian, that doesn't look for rm binary in the right position.

apt -y install linux-headers-$(uname -r)

ln -s /bin/rm /usr/bin/rm

apt-get -y install zfs-dkms

Step 2 - ZFS Restart

At this point zfs-dkms is installed but it throws errors in journalctl -xe; to start zfs properly use:

/sbin/modprobe zfs

systemctl restart zfs-import-cache
systemctl restart zfs-import-scan
systemctl restart zfs-mount
systemctl restart zfs-share

Step 3 - YOU MUST CREATE AT LEAST ONE ZPOOL

At this point I discovered that YOU must create a zpool before reboot otherwise zfs will not load the proper modules if there are no zpools. It's a sort of saving resources mechanism ( but even in that case this will still throw errors inside journalctl -xe )

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864348

" We are not doing this because ZFS modules would taint the kernel, if there's no zpool available then it shouldn't be loaded. "

If you miss this part you have to start from Step 2

For example, by using the example provided by @cas, you can create this file based zpool or directly create your disk based ones.

truncate -s 100M /root/z1
truncate -s 100M /root/z2
zpool create tank /root/z1 /root/z2
zpool scrub tank
zpool status

then after a reboot everything will work with no errors in journalctl -xe


I just created a brand new stretch VM to test this. Minimal install (just ssh and standard system tools), edit sources.list to add contrib and non-free, then:

apt-get install spl-dkms zfs-dkms

You may also want to manually install zfsutils-linux. It should be installed automatically when you install zfs-dkms but the dependencies may vary for different Debian releases and for different versions of the Debian ZoL packages:

apt-get install  zfsutils-linux

It looks as if there's a bug in the systemd unit file for zfs-share. It's trying to run /usr/bin/rm instead of /bin/rm.

The quick fix is to run ln -s /bin/rm /usr/bin, or alternatively:

cd /etc/systemd/system
cp -a /lib/systemd/system/zfs-share.service .
edit zfs-share.service and change `/usr/bin/rm` to `/bin/rm`

and then restart the zfs services:

systemctl restart zfs-import-cache
systemctl restart zfs-import-scan
systemctl restart zfs-mount
systemctl restart zfs-share

NOTE: I manually ran modprobe zfs before restarting any of the zfs services. I'm not sure if they'll do that automatically or not, so you may need to do that too.

BTW, you probably want to apt-get install zfs-initramfs too, to ensure that zfs is loaded during the initramfs.


I tested that this works with:

# truncate -s 100M /root/z1
# truncate -s 100M /root/z2
# zpool create tank mirror /root/z1 /root/z2 

# zfs set compression=lz4 tank
# rsync -ax /etc /tank/
# du -sch /etc /tank/etc/
3.5M    /etc
825K    /tank/etc/
4.3M    total

# zpool scrub tank
# zpool status
  pool: tank
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Thu Aug  3 19:28:21 2017
config:

    NAME          STATE     READ WRITE CKSUM
    tank          ONLINE       0     0     0
      mirror-0    ONLINE       0     0     0
        /root/z1  ONLINE       0     0     0
        /root/z2  ONLINE       0     0     0

errors: No known data errors

The zpool is working and /tank is automounted after a reboot.

Conclusion: it works now.


BTW, this stretch VM uses a ZFS zvol created on my main sid system as its disk. I made a snapshot of it immediately after the initial installation, before installing spl-dkms and zfs-dkms so I could quickly revert and start again if anything major went wrong.

I first made the zvol with only 1GB and needed to increase it later to have enough space for build-essential, linux-headers-amd64 etc:

# zfs list -r -t all export/volumes/stretch
NAME                                         USED  AVAIL  REFER  MOUNTPOINT
export/volumes/stretch                      6.25G   834G  1.77G  -
export/volumes/stretch@2017-08-03-18:31:04   279M      -  1.09G  -

setting compression=lz4 on tank in the VM is probably worse than useless - the zvol already has lz4 compression on it.


Slight variations for me on Debian 9.4 - after the Apt sources additions:

apt-get install linux-headers-amd64       # not tied to specific kernel version
apt-get install zfs-dkms zfsutils-linux   # my apt recommends is off

lsblk                                     # double-check which disks to pool

zpool create -f jeff -o ashift=12 -o autoexpand=on -o autoreplace=on mirror sdb sdd
zfs set mountpoint=/var/jeff jeff
zfs set compression=lz4 jeff
zfs create jeff/blog
zfs create jeff/docs
zfs create jeff/pics
zfs set compression=off jeff/pics

df -h

The mount was NOT present sigh - discovered that there was an existing /var/jeff with content - moved that out of the way and did a reboot...

After reboot:

df -htzfs
Filesystem        Size  Used Avail Use% Mounted on
jeff              849G  128K  849G   1% /var/jeff
jeff/blog         850G  128K  849G   1% /var/jeff/blog
jeff/docs         856G  128K  849G   1% /var/jeff/docs
jeff/pics         850G  128K  849G   1% /var/jeff/pics

Hooray - all present and bit-rot protected :)

Tags:

Debian

Apt

Zfs