Setting Reservations on ZFS File Systems
A ZFS reservation is an allocation of disk space from the pool that is guaranteed to be available to a dataset. As such, you cannot reserve disk space for a dataset if that space is not currently available in the pool. The total amount of all outstanding, unconsumed reservations cannot exceed the amount of unused disk space in the pool. ZFS reservations can be set and displayed by using the zfs set
and zfs get
commands. For example:
$ zfs set reservation=5G tank/home/bhall $ zfs get reservation tank/home/bhall NAME PROPERTY VALUE SOURCE tank/home/bhall reservation 5G local
Reservations can affect the output of the zfs list
command. For example:
$ zfs list -r tank/home
NAME USED AVAIL REFER MOUNTPOINT
tank/home 5.00G 61.9G 37K /tank/home
tank/home/bhall 31K 66.9G 31K /tank/home/bhall
tank/home/sueb 337K 10.0G 306K /tank/home/sueb
tank/home/glori 547K 61.9G 547K /tank/home/glori
tank/home/mork 31K 61.9G 31K /tank/home/mork
Note that tank/home
is using 5GB of disk space, although the
total amount of space referred to by tank/home
and its descendents
is much less than 5GB. The used space reflects the space reserved for
tank/home/bhall
. Reservations are considered in the used disk
space calculation of the parent file system and do count against its quota, reservation,
or both.
$ zfs set quota=5G pool/filesystem $ zfs set reservation=10G pool/filesystem/user1 cannot set reservation for 'pool/filesystem/user1': size is greater than available space
A dataset can use more disk space than its reservation, as long as unreserved space is available in the pool, and the dataset's current usage is below its quota. A dataset cannot consume disk space that has been reserved for another dataset.
Reservations are not cumulative. That is, a second invocation of zfs set
to set a reservation does not add its reservation to the existing reservation. Rather, the second reservation replaces the first reservation. For example:
$ zfs set reservation=10G tank/home/bhall $ zfs set reservation=5G tank/home/bhall $ zfs get reservation tank/home/bhall NAME PROPERTY VALUE SOURCE tank/home/bhall reservation 5G local
You can set a refreservation
reservation to guarantee disk space for a dataset that does not include disk space consumed by snapshots and clones. This reservation is accounted for in the parent dataset's space used calculation, and counts against the parent dataset's quotas and reservations. For example:
$ zfs set refreservation=10g profs/prof1 $ zfs list NAME USED AVAIL REFER MOUNTPOINT profs 10.0G 23.2G 19K /profs profs/prof1 10G 33.2G 18K /profs/prof1
You can also set a reservation on the same dataset to guarantee dataset space and snapshot space. For example:
$ zfs set reservation=20g profs/prof1 $ zfs list NAME USED AVAIL REFER MOUNTPOINT profs 20.0G 13.2G 19K /profs profs/prof1 10G 33.2G 18K /profs/prof1
Regular reservations are accounted for in the parent's used space calculation.
In the preceding example, the smaller of the two quotas (10GB as compared to 20GB) is displayed in the zfs list
output. To view the value of both quotas, use the zfs get
command. For example:
$ zfs get reservation,refreserv profs/prof1
NAME PROPERTY VALUE SOURCE
profs/prof1 reservation 20G local
profs/prof1 refreservation 10G local
If refreservation
is set, a snapshot is only allowed if sufficient unreserved pool space exists outside of this reservation to accommodate the current number of referenced bytes in the dataset.