ZFS supports quotas and reservations at the file system level. You can use the quota property to set a limit on the amount of space a file system can use. In addition, you can use the reservation property to guarantee that some amount of space is available to a file system. Both properties apply to the dataset they are set on and all descendants of that dataset.
That is, if a quota is set on the tank/home
dataset,
the total amount of space used by tank/home
and
all of its descendants cannot exceed the quota. Similarly, if tank/home
is given a reservation, tank/home
and all of its descendants draw from that reservation. The amount
of space used by a dataset and all of its descendents is reported by the used property.
ZFS quotas can be set and displayed by using the zfs set and zfs get commands. In the following example, a quota of 10 Gbytes
is set on tank/home/bonwick
.
#zfs set quota=10G tank/home/bonwick
#zfs get quota tank/home/bonwick
NAME PROPERTY VALUE SOURCE tank/home/bonwick quota 10.0G local
ZFS quotas also impact the output of the zfs list and df commands. For example:
#zfs list
NAME USED AVAIL REFER MOUNTPOINT tank/home 16.5K 33.5G 8.50K /export/home tank/home/bonwick 15.0K 10.0G 8.50K /export/home/bonwick tank/home/bonwick/ws 6.50K 10.0G 8.50K /export/home/bonwick/ws #df -h /export/home/bonwick
Filesystem size used avail capacity Mounted on tank/home/bonwick 10G 8K 10G 1% /export/home/bonwick
Note that although tank/home
has 33.5 Gbytes of
space available, tank/home/bonwick
and tank/home/bonwick/ws
only have 10 Gbytes of space available, due to the quota on tank/home/bonwick
.
You cannot set a quota to an amount less than is currently being used by a dataset. For example:
# zfs set quota=10K tank/home/bonwick
cannot set quota for 'tank/home/bonwick': size is less than current used or
reserved space
A ZFS reservation is an allocation of space from the pool that is guaranteed to be available to a dataset. As such, you cannot reserve 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 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/moore
#zfs get reservation tank/home/moore
NAME PROPERTY VALUE SOURCE tank/home/moore reservation 5.00G local
ZFS reservations can affect the output of the zfs list command. For example:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank/home 5.00G 33.5G 8.50K /export/home
tank/home/moore 15.0K 10.0G 8.50K /export/home/moore
Note that tank/home
is using 5 Gbytes of space,
although the total amount of space referred to by tank/home
and
its descendants is much less than 5 Gbytes. The used space reflects the space
reserved for tank/home/moore
. Reservations are considered
in the used space of the parent dataset 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 space than its reservation, as long as space is available in the pool that is unreserved and the dataset's current usage is below its quota. A dataset cannot consume 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.
#zfs set reservation=10G tank/home/moore
#zfs set reservation=5G tank/home/moore
#zfs get reservation tank/home/moore
NAME PROPERTY VALUE SOURCE tank/home/moore reservation 5.00G local