xf.is blog

Expanding ZFS pool online

Published in linux.

At work I’m setting up a new syslog server and wanted the logs to be stored raw on disk (that is not compressed using gzip). To do that I created a ZFS pool with compression enabled allowing for transparent compression.

First I created a zpool with a single disk (this is a VM so no redundancy is needed):

# Create a pool with the name 'zlog'
zpool create zlog /dev/sdb

# Enable compression
zfs set compression=on zlog

# Set the mountpoint
mkdir /logs
zfs set mountpoint=/logs logpool

This results in a mounted zfs volume:

root@zfs-test:/logs# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zlog  19.5G   552K  19.5G        -         -     0%     0%  1.00x    ONLINE  -

This is fine but I need to be able to expand the pool on the fly.

I expanded the disk in the hypervisor from 20GB to 25GB.

Trigger a rescan so Linux detects the disk size change:

echo 1 > /sys/block/sdb/device/rescan

Extend the zpool with

zpool online -e zlog sdb

And the pool shows the updated size:

root@zfs-test:/logs# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zlog  24.5G   684K  24.5G        -         -     0%     0%  1.00x    ONLINE  -

It is possible to autoexpand the pool using

# At pool creation
zpool create -o autoexpand=on zlog /dev/sdb

# or later with
zfs set compression=on zlog

However you always need to either reboot the server or trigger a device rescan for the autoexpand to trigger.