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 :)