Oracle Solaris ZFS 管理指南

设置 ZFS 配额和预留空间

可以使用 quota 属性对文件系统可以使用的磁盘空间量设置限制。此外,还可以使用 reservation 属性来保证一定的磁盘空间量供文件系统使用。这两个属性将应用于设置了它们的数据集以及该数据集的所有后代。

也就是说,如果对 tank/home 数据集设置了配额,则 tank/home 及其所有后代使用的总磁盘空间量不能超过该配额。同样,如果为 tank/home 指定了预留空间,则 tank/home 及其所有后代都会使用该预留空间。数据集及其所有后代使用的磁盘空间量由 used 属性报告。

refquotarefreservation 属性用于管理文件系统空间,但不会将后代(如快照和克隆)占用的磁盘空间计算在内。

在此 Solaris 发行版中,您可以根据属于特定用户或组的文件所占用的磁盘空间量来设置 usergroup 配额。不能基于卷、早于文件系统版本 4 的文件系统或早于池版本 15 的池设置用户和组配额属性。

确定哪个配额和预留空间功能更有利于管理您的文件系统时,请考虑以下几点:

有关设置配额和预留空间的更多信息,请参见设置 ZFS 文件系统的配额设置 ZFS 文件系统的预留空间

设置 ZFS 文件系统的配额

使用 zfs setzfs get 命令可以设置和显示 ZFS 文件系统的配额。在以下示例中,对 tank/home/bonwick 设置了 10 GB 的配额:


# 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 listdf 命令的输出。例如:


# 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

请注意,虽然 tank/home 具有 33.5 GB 的可用磁盘空间,但由于 tank/home/bonwick 存在配额,tank/home/bonwicktank/home/bonwick/ws 仅有 10 GB 的可用磁盘空间。

不能将配额设置为比数据集当前使用的空间小的数量。例如:


# zfs set quota=10K tank/home/bonwick
cannot set quota for 'tank/home/bonwick': size is less than current used or 
reserved space

可对数据集设置 refquota,以限制该数据集可以使用的磁盘空间量。硬限制不包括后代所占用的磁盘空间。例如:


# zfs set refquota=10g students/studentA
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
profs               106K  33.2G    18K  /profs
students           57.7M  33.2G    19K  /students
students/studentA  57.5M  9.94G  57.5M  /students/studentA
# zfs snapshot students/studentA@today
# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
profs                     106K  33.2G    18K  /profs
students                 57.7M  33.2G    19K  /students
students/studentA        57.5M  9.94G  57.5M  /students/studentA
students/studentA@today      0      -  57.5M  -

为了更加方便,可对数据集设置其他配额,以帮助管理快照使用的磁盘空间。例如:


# zfs set quota=20g students/studentA
# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
profs                     106K  33.2G    18K  /profs
students                 57.7M  33.2G    19K  /students
students/studentA        57.5M  9.94G  57.5M  /students/studentA
students/studentA@today      0      -  57.5M  -

在此情况下,studentA 可能会达到 refquota (10 GB) 硬限制,但studentA可以删除文件进行恢复,即使存在快照也是如此。

在上例中,zfs list 输出显示两个配额中的较小者(10 GB 与 20 GB 相比较小)。要查看两个配额的值,请使用 zfs get 命令。例如:


# zfs get refquota,quota students/studentA
NAME               PROPERTY  VALUE              SOURCE
students/studentA  refquota  10G                local
students/studentA  quota     20G                local

在 ZFS 文件系统中设置用户和组配额

可以使用 zfs userquotazfs groupquota 命令分别设置用户配额或组配额:例如:


# zfs create students/compsci
# zfs set userquota@student1=10G students/compsci
# zfs create students/labstaff
# zfs set groupquota@staff=20GB students/labstaff

按以下方式显示当前用户配额或组配额:


# zfs get userquota@student1 students/compsci
NAME              PROPERTY            VALUE               SOURCE
students/compsci  userquota@student1  10G                 local
# zfs get groupquota@staff students/labstaff
NAME               PROPERTY          VALUE             SOURCE
students/labstaff  groupquota@staff  20G               local

可以通过查询以下属性来显示一般用户或组的磁盘空间使用情况:


# zfs userspace students/compsci
TYPE        NAME      USED  QUOTA  
POSIX User  root      227M   none  
POSIX User  student1  455M    10G  
# zfs groupspace students/labstaff
TYPE         NAME   USED  QUOTA  
POSIX Group  root   217M   none  
POSIX Group  staff  217M    20G  

要确定个别用户或组的磁盘空间使用情况,可以查询以下属性:


# zfs get userused@student1 students/compsci
NAME              PROPERTY           VALUE              SOURCE
students/compsci  userused@student1  455M               local
# zfs get groupused@staff students/labstaff
NAME               PROPERTY         VALUE            SOURCE
students/labstaff  groupused@staff  217M             local

使用 zfs get all dataset 命令不会显示用户和组配额属性,它会显示所有其他文件系统属性的列表。

可以按以下方式删除用户配额或组配额:


# zfs set userquota@user1=none students/compsci
# zfs set groupquota@staff=none students/labstaff

ZFS 文件系统的用户和组配额提供以下功能:

用户和组配额的实施可能会延迟几秒钟。这种延迟意味着,在系统发现已超出配额并拒绝其他写入操作(同时显示 EDQUOT 错误消息)之前,用户可能已超出其配额。

您可以使用传统 quota 命令查看 NFS 环境(例如,挂载了 ZFS 文件系统)中的用户配额。不带任何选项的 quota 命令仅显示是否超出用户配额的输出信息。例如:


# zfs set userquota@student1=10m students/compsci   
# zfs userspace students/compsci
TYPE        NAME      USED  QUOTA  
POSIX User  root      227M   none  
POSIX User  student1  455M    10M  
# quota student1
Block limit reached on /students/compsci

如果重置用户配额,而且不再超出配额限制,则可以使用 quota -v 命令查看用户的配额。例如:


# zfs set userquota@student1=10GB students/compsci 
# zfs userspace students/compsci
TYPE        NAME      USED  QUOTA  
POSIX User  root      227M   none  
POSIX User  student1  455M    10G  
# quota student1
# quota -v student1
Disk quotas for student1 (uid 201):
Filesystem     usage  quota  limit    timeleft  files  quota  limit    timeleft
/students/compsci
              466029 10485760 10485760     

设置 ZFS 文件系统的预留空间

ZFS 预留空间是从池中分配的保证可供数据集使用的磁盘空间。因此,如果磁盘空间当前在池中不可用,则不能为数据集预留该空间。所有未占用的预留空间的总量不能超出池中未使用的磁盘空间量。通过使用 zfs setzfs get 命令可以设置和显示 ZFS 预留空间。例如:


# zfs set reservation=5G tank/home/moore
# zfs get reservation tank/home/moore
NAME             PROPERTY     VALUE   SOURCE
tank/home/moore  reservation  5G      local

预留空间可能会影响 zfs list 命令的输出。例如:


# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
tank/home             5.00G  33.5G  8.50K  /export/home
tank/home/moore       15.0K  33.5G  8.50K  /export/home/moore

请注意,tank/home 使用的磁盘空间为 5 GB,但 tank/home 及其后代引脚的总空间量远远小于 5 GB。使用的空间反映了为 tank/home/moore 预留的空间。在父数据集的已用磁盘空间计算中会考虑预留空间,并会针对其配额、预留空间或同时针对两者进行计数。


# 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

只要池中有未预留的空间可用,并且数据集的当前使用率低于其配额,数据集便能使用比其预留空间更多的磁盘空间。数据集不能占用为其他数据集预留的磁盘空间。

预留空间无法累积。也就是说,第二次调用 zfs set 来设置预留空间时,不会将该数据集的预留空间添加到现有预留空间中,而是使用第二个预留空间替换第一个预留空间。例如:


# 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

可通过设置 refreservation 预留空间来保证用于数据集的磁盘空间,该空间不包括快照和克隆使用的磁盘空间。此预留空间计算在父数据集的使用空间内,并会针对父数据集的配额和预留空间进行计数。例如:


# 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

还可以对同一数据集设置预留空间,以保证数据集空间和快照空间。例如:


# 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

常规的预留空间计算在父级的使用空间内。

在上例中,zfs list 输出显示两个配额中的较小者(10 GB 与 20 GB 相比较小)。要查看两个配额的值,请使用 zfs get 命令。例如:


# zfs get reservation,refreserv profs/prof1
NAME         PROPERTY        VALUE        SOURCE
profs/prof1  reservation     20G          local
profs/prof1  refreservation  10G          local

如果设置了 refreservation,则仅当在此预留空间之外有足够的未预留池空间来容纳数据集中的当前引用字节数时,才允许使用快照。