Oracle Solaris ZFS 管理指南

第 6 章 管理 Oracle Solaris ZFS 文件系统

本章提供有关管理 Oracle Solaris ZFS 文件系统的详细信息。本章包括分层文件系统布局、属性继承和自动挂载点管理以及共享交互等概念。

本章包含以下各节:

管理 ZFS 文件系统(概述)

ZFS 文件系统构建于存储池上。文件系统可以动态创建和销毁,而不需要分配或格式化任何底层磁盘空间。由于文件系统是轻量型的,并且是 ZFS 中的管理中心点,因此可能要创建许多文件系统。

使用 zfs 命令可以管理 ZFS 文件系统。zfs 命令提供了一组用于对文件系统执行特定操作的子命令。本章详细介绍了这些子命令。使用此命令还可以管理快照、卷和克隆,但本章仅对这些功能进行了简短介绍。有关快照和克隆的详细信息,请参见第 7 章。有关 ZFS 卷的详细信息,请参见ZFS 卷。


注 –

术语数据集在本章中用作通称,表示文件系统、快照、克隆或卷。


创建、销毁和重命名 ZFS 文件系统

可以使用 zfs create 和 zfs destroy 命令来创建和销毁 ZFS 文件系统。使用 zfs rename 命令可重命名 ZFS 文件系统。

创建 ZFS 文件系统

使用 zfs create 命令可以创建 ZFS 文件系统。create 子命令仅使用一个参数:要创建的文件系统的名称。将文件系统名称指定为从池名称开始的路径名,如下所示:

pool-name/[filesystem-name/]filesystem-name

路径中的池名称和初始文件系统名称标识分层结构中要创建新文件系统的位置。路径中的最后一个名称标识要创建的文件系统的名称。文件系统名称必须满足ZFS 组件命名要求中所述的命名要求。

在以下示例中,在 tank/home 文件系统中创建了一个名为 bonwick 的文件系统。


# zfs create tank/home/bonwick

如果新文件系统创建成功,则 ZFS 会自动挂载该文件系统。缺省情况下,文件系统将使用 create 子命令中为文件系统名称提供的路径挂载为 /dataset。在本示例中,新创建的 bonwick 文件系统挂载于 /tank/home/bonwick。有关自动管理的挂载点的更多信息,请参见管理 ZFS 挂载点。

有关 zfs create 命令的更多信息,请参见 zfs(1M)。

可在创建文件系统时设置文件系统属性。

在以下示例中,为 tank/home 文件系统创建了挂载点 /export/zfs:


# zfs create -o mountpoint=/export/zfs tank/home

有关文件系统属性的更多信息,请参见ZFS 属性介绍。

销毁 ZFS 文件系统

要销毁 ZFS 文件系统,请使用 zfs destroy 命令。销毁的文件系统将自动取消挂载,并取消共享。有关自动管理的挂载或自动管理的共享的更多信息,请参见自动挂载点。

在以下示例中,销毁了 tabriz 文件系统:


# zfs destroy tank/home/tabriz

注意 – 注意 –

使用 destroy 子命令时不会出现确认提示。请务必谨慎使用该子命令。


如果要销毁的文件系统处于繁忙状态而无法取消挂载,则 zfs destroy 命令将失败。要销毁活动文件系统,请使用 -f 选项。由于此选项可取消挂载、取消共享和销毁活动文件系统,从而导致意外的应用程序行为,因此请谨慎使用此选项。


# zfs destroy tank/home/ahrens
cannot unmount 'tank/home/ahrens': Device busy

# zfs destroy -f tank/home/ahrens

如果文件系统具有后代,则 zfs destroy 命令也会失败。要以递归方式销毁文件系统及其所有后代,请使用 -r 选项。请注意,递归销毁同时会销毁快照,因此请谨慎使用此选项。


# zfs destroy tank/ws
cannot destroy 'tank/ws': filesystem has children
use '-r' to destroy the following datasets:
tank/ws/billm
tank/ws/bonwick
tank/ws/maybee

# zfs destroy -r tank/ws

如果要销毁的文件系统具有间接依赖项,那么即使是递归销毁命令也会失败。要强制销毁所有依赖项(包括目标分层结构外的克隆文件系统),必须使用 -R 选项。请务必谨慎使用此选项。


# zfs destroy -r tank/home/schrock
cannot destroy 'tank/home/schrock': filesystem has dependent clones
use '-R' to destroy the following datasets:
tank/clones/schrock-clone

# zfs destroy -R tank/home/schrock

注意 – 注意 –

使用 zfs destroy 命令的 -f、-r 或 -R 选项时不会出现确认提示,因此请谨慎使用这些选项。


有关快照和克隆的更多信息,请参见第 7 章。

重命名 ZFS 文件系统

使用 zfs rename 命令可重命名文件系统。使用 rename 子命令可以执行以下操作:

以下示例使用 rename 子命令将一个文件系统从 kustarz 重命名为 kustarz_old:


# zfs rename tank/home/kustarz tank/home/kustarz_old

以下示例说明如何使用 zfs rename 重定位文件系统:


# zfs rename tank/home/maybee tank/ws/maybee

在本示例中,maybee 文件系统从 tank/home 重定位到 tank/ws。通过重命名来重定位文件系统时,新位置必须位于同一池中,并且必须具有足够的磁盘空间来存放这一新文件系统。如果新位置没有足够的磁盘空间(可能是因为已达到配额),则 rename 操作将失败。

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

rename 操作会尝试对文件系统以及任何后代文件系统按顺序执行取消挂载/重新挂载操作。如果该操作无法取消挂载活动文件系统,则 rename 命令将失败。发生这种问题时,必须强行取消挂载该文件系统。

有关重命名快照的信息,请参见重命名 ZFS 快照。

ZFS 属性介绍

属性是用来对文件系统、卷、快照和克隆的行为进行控制的主要机制。除非另有说明,否则本节中定义的属性适用于所有数据集类型。

属性分为两种类型:本机属性和用户定义的属性。本机属性用于导出内部统计信息或控制 ZFS 文件系统行为。此外,本机属性是可设置的或只读的。用户属性对 ZFS 文件系统行为没有影响,但可通过用户环境中有意义的方式来注释数据集。有关用户属性的更多信息,请参见ZFS 用户属性。

大多数可设置的属性也是可继承的。可继承属性是这样的属性:如果为父级数据集设置了该属性,则该属性会向下传播给其所有后代。

所有可继承属性都有一个关联源,表明属性是如何获得的。属性的源可具有以下值:

local

表示属性是使用 zfs set 命令对数据集进行显式设置的,如设置 ZFS 属性中所述。

inherited from dataset-name

表示属性是从指定的祖先继承而来。

default

表示属性值不是继承而来或在本地设置。如果没有祖先具有属性源 local,则会使用此源。

下表介绍了只读的和可设置的本机 ZFS 文件系统属性。只读本机属性在表中注明为“只读属性”。此表中列出的所有其他本机属性均为可设置的属性。有关用户属性的信息,请参见ZFS 用户属性。

表 6–1 ZFS 本机属性说明

属性名 

类型 

缺省值 

说明 

aclinherit

字符串 

secure

控制创建文件和目录时继承 ACL 项的方法。该属性的值包括 discard、noallow、secure 和 passthrough。有关这些值的说明,请参见ACL 属性。

aclmode

字符串 

groupmask

控制在 chmod 操作过程中修改 ACL 项的方法。该属性的值包括 discard、groupmask 和 passthrough。有关这些值的说明,请参见ACL 属性。

atime

布尔值 

on

控制文件被读取后是否更新该文件的访问时间。关闭此属性可避免在读取文件时产生写入流量,并可显著提高性能,但可能会使邮件程序和类似的实用程序相混淆。

available

数字 

N/A 

只读属性,用于确定可供数据集及其所有子级使用的磁盘空间量,假定池中没有其他活动。由于磁盘空间是在池内共享的,因此可用空间会受到多种因素的限制,包括物理池大小、配额、预留空间和池内的其他数据集。

此属性的缩写为 avail。

有关磁盘空间记帐的更多信息,请参见ZFS 磁盘空间记帐。

canmount

布尔值 

on

控制是否可以使用 zfs mount 命令挂载文件系统。在任意文件系统中均可设置该属性,该属性本身不可继承。不过,当此属性设置为 off 时,后代文件系统可以继承挂载点,但永远不会挂载文件系统本身。

设置 noauto 选项时,只能显式挂载和取消挂载数据集。数据集不会在创建或导入时自动挂载,也不能通过 zfs mount-a 命令挂载或通过 zfs unmount-a 命令取消挂载。

有关更多信息,请参见canmount 属性。

校验和

字符串 

on

控制用于验证数据完整性的校验和。缺省值为 on,这将自动选择合适的算法,当前算法为 fletcher4。该属性的值包括 on、off、fletcher2、fletcher4 和 sha256。值为 off 将禁用对用户数据的完整性检查。建议不要使用值 off。

compression

字符串 

off

对数据集启用或禁用压缩。该属性的值包括 on、off、lzjb、gzip 和 gzip- N。目前,将此属性设置为 lzjb、gzip 或 gzip-N 与将此属性设置为 on 具有相同的效果。在包含现有数据的文件系统中启用压缩将只压缩新数据。现有数据保持未压缩状态。

此属性的缩写为 compress。

compressratio

数字 

N/A 

只读属性,用于标识针对数据集实现的压缩比例,表示为乘数。通过 zfs set compression=on dataset 命令可以启用压缩。

根据所有文件的逻辑大小和引用的物理数据量计算此值。它包括通过使用 compression 属性实现的节省量。

copies

数字 

1

设置每个文件系统的用户数据副本数。可用的值为 1、2 或 3。这些副本是对任何池级别冗余的补充。用户数据多个副本所使用的磁盘空间将计入相应的文件和数据集,并根据配额和预留空间进行计数。此外,启用多个副本时还会更新 used 属性。由于在现有文件系统中更改此属性仅影响新写入的数据,因此请考虑在创建文件系统时设置此属性。

creation

字符串 

N/A 

只读属性,用于标识创建数据集的日期和时间。

devices

布尔值 

on

控制是否能打开文件系统中的设备文件。

exec

布尔值 

on

控制是否允许执行文件系统中的程序。另外,设置为 off 时,将不允许执行带有 PROT_EXEC 的 mmap(2) 调用。

mounted

布尔值 

N/A 

只读属性,用于指明文件系统、克隆或快照当前是否已挂载。该属性不适用于卷。此属性的值可以是 yes 或 no。

mountpoint

字符串 

N/A 

控制用于此文件系统的挂载点。当文件系统的 mountpoint 属性发生更改时,将取消挂载该文件系统以及继承挂载点的任何后代。如果新值为 legacy,则该文件系统和子级将保持取消挂载状态。否则,如果属性以前为 legacy 或 none,或者该文件系统和子级在属性发生更改之前处于挂载状态,则会自动在新位置重新挂载它们。此外,任何共享文件系统都将取消共享,并在新位 置进行共享。

有关使用该属性的更多信息,请参见管理 ZFS 挂载点。

primarycache

字符串 

all

控制在主高速缓冲存储器 (ARC) 中缓存的内容。可能的值包括 all、none 和 metadata。如果设置为 all,则用户数据和元数据都会被缓存。如果设置为 none,则用户数据和元数据都不会被缓存。如果设置为 metadata,则仅缓存元数据。

origin

字符串 

N/A 

克隆的文件系统或卷的只读属性,用于标识创建克隆所在的快照。只要克隆存在,便不能销毁克隆源(即使使用 -r 或 -f 选项也是如此)。

非克隆的文件系统的源为 none。

quota

数字(或 none)

none

限制数据集及其后代可占用的磁盘空间量。该属性可对已使用的磁盘空间量强制实施硬限制,包括后代(含文件系统和快照)占用的所有空间。对已有配额的数据集的后代设置配额不会覆盖祖先的配额,但会施加额外的限制。不能对卷设置配额,因为 volsize 属性可用作隐式配额。

有关设置配额的信息,请参见设置 ZFS 文件系统的配额。

readonly

布尔值 

off

控制是否可以修改数据集。设置为 on 时,不能进行任何修改。

此属性的缩写为 rdonly。

recordsize

数字 

128K

为文件系统中的文件指定建议的块大小。

此属性的缩写为 recsize。有关详细说明,请参见recordsize 属性。

referenced

数字 

N/A 

只读属性,用于标识数据集可访问的数据量,这些数 据可能会也可能不会与池中的其他数据集共享。

创建快照或克隆时,首先会引用与创建该属性时所在的文件系统或快照相同的磁盘空间量,因为其内容相同。 

此属性的缩写为 refer。

refquota

数字(或 none) 

none

设置数据集可以使用的磁盘空间量。此属性对使用的空间量强制实施硬限制。此硬限制不包括后代(如快照和克隆)使用的磁盘空间。

refreservation

数字(或 none) 

none

设置为数据集(不包括后代,如快照和克隆)预留的最小磁盘空间量。如果使用的磁盘空间量低于该值,则认为数据集正在使用 refreservation 指定的空间量。refreservation 预留空间计算在父数据集的已用磁盘空间内,并会针对父数据集的配额和预留空间进行计数。

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

此属性的缩写为 refreserv。

reservation

数字(或 none) 

none

设置为数据集及其后代预留的最小磁盘空间量。如果使用的磁盘空间量低于该值,则认为数据集正在使用其预留空间指定的空间量。预留空间计算在父数据集的已用磁盘空间内,并会针对父数据集的配额和预留空间进行计数。

此属性的缩写为 reserv。

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

secondarycache

字符串 

all

控制在二级高速缓存 (L2ARC) 中缓存的内容。可能的值包括 all、none 和 metadata。如果设置为 all,则用户数据和元数据都会被缓存。如果设置为 none,则用户数据和元数据都不会被缓存。如果设置为 metadata,则仅缓存元数据。

setuid

布尔值 

on

控制文件系统中是否会标记 setuid 位。

shareiscsi

字符串 

off 

控制 ZFS 卷是否共享为 iSCSI 目标。该属性的值包括 on、off 和 type=disk。您可能希望对一个文件系统设置 shareiscsi=on,使得该文件系统中的所有 ZFS 卷的缺省设置为共享。但是,对一个文件系统设置此属性没有直接影响。

sharenfs

字符串 

off

控制文件系统是否可用于 NFS 中以及使用的选项。如果设置为 on,则会调用不带任何选项的 zfs share 命令。否则,将调用带有与该属性的内容等效的选项的 zfs share 命令。如果设置为 off,则使用传统的 share 和 unshare 命令以及 dfstab 文件来管理文件系统。

有关共享 ZFS 文件系统的更多信息,请参见共享和取消共享 ZFS 文件系统。

snapdir

字符串 

hidden

控制 .zfs 目录在文件系统根目录中是隐藏还是可见。有关使用快照的更多信息,请参见ZFS 快照概述。

type

字符串 

N/A 

只读属性,用于将数据集类型标识为 filesystem(文件系统或克隆)、volume 或 snapshot。

used

数字 

N/A 

只读属性,用于标识数据集及其所有后代占用的磁盘空间 量。

有关详细说明,请参见used 属性。

usedbychildren

数字 

off

只读属性,用于标识此数据集的子项占用的磁盘空间量;如果所有数据集子项都被销毁,将释放该空间。此属性的缩写为 usedchild。

usedbydataset

数字 

off

只读属性,用于标识数据集本身占用的磁盘空间量;如果在先销毁所有快照并删除所有 refreservation 预留空间后销毁数据集,将释放该空间。此属性的缩写为 usedds。

usedbyrefreservation

数字 

off

只读属性,用于标识针对数据集设置的 refreservation 占用的磁盘空间量;如果删除 refreservation,将释放该空间。此属性的缩写为 usedrefreserv。

usedbysnapshots

数字 

off

只读属性,用于标识数据集的快照占用的磁盘空间量。特别是,如果此数据集的所有快照都被销毁,将释放该磁盘空间。请注意,此值不是简单的快照 used 属性总和,因为多个快照可以共享空间。此属性的缩写为 usedsnap。

version

数字 

N/A 

表示文件系统在磁盘上的版本,它与池版本无关。此属性只能设置为比支持的软件发行版所提供的版本更高的版本。有关更多信息,请参见 zfs upgrade 命令。

volsize

数字 

N/A 

可为卷指定卷的逻辑大小。

有关详细说明,请参见volsize 属性。

volblocksize

数字 

8 KB

可为卷指定卷的块大小。一旦写入卷后,块大小便不能更改,因此应在创建卷时设置块大小。卷的缺省块大小为 8 KB。范围位于 512 字节到 128 KB 之间的 2 的任意次 幂都有效。

此属性的缩写为 volblock。

zoned

布尔值 

N/A 

指明是否已将数据集添加至非全局区域。如果设置该属性,全局区域中将不会标记挂载点,因此 ZFS 在收到请求时不能挂载此类文件系统。首次安装区域时,会为添加的所有文件系统设置该属性。

有关将 ZFS 用于已安装的区域的更多信息,请参见在安装了区域的 Solaris 系统中使用 ZFS。

xattr

布尔值 

on

指明此文件系统是否启用 (on) 或禁用 (off) 扩展属性。

ZFS 只读本机属性

可以检索但无法设置只读本机属性。只读本机属性不可继承。有些本机属性特定于特殊类型的数据集。在这种情况下,表 6–1 的说明部分会注明数据集类型。

下面列出了只读本机属性,表 6–1 对其进行了说明。

有关磁盘空间记帐(包括 used、referenced 和 available 属性)的更多信息,请参见ZFS 磁盘空间记帐。

used 属性

used 属性是一个只读属性,表明此数据集及其所有后代占用的磁盘空间量。可根据此数据集的配额和预留空间来检查该值。使用的磁盘空间不包括数据集的预留空间,但会考虑任何后代数据集的预留空间。数据集占用其父级的磁盘空间量以及以递归方式销毁该数据集时所释放的磁盘空间量应为其使用空间和预留空间的较大者。

创建快照时,其磁盘空间最初在快照与文件系统之间进行共享,还可能是与以前的快照进行共享。随着文件系统的变化,以前共享的磁盘空间将供快照专用,并会计算在快照的使用空间内。快照使用的磁盘空间会将其专用数据所占空间计算在内。此外,删除快照可增加其他快照专用(和使用)的磁盘空间量。有关快照和空间问题的更多信息,请参见空间不足行为。

已用磁盘空间量、可用磁盘空间量以及引用磁盘空间量并不包括暂挂更改。通常,暂挂更改仅占用几秒钟的时间。使用 fsync(3c) 或 O_SYNC 功能提交对磁盘的更改,不一定可以保证磁盘空间使用情况信息会立即更新。

使用 zfs list -o space 命令,可以显示 usedbychildren、usedbydataset、usedbyrefreservation 和 usedbysnapshots 属性信息。这些属性将 used 属性细分为后代占用的磁盘空间。有关更多信息,请参见表 6–1。

可设置的 ZFS 本机属性

可设置的本机属性是其值可同时进行检索和设置的属性。可设置的本机属性可以使用 zfs set 命令或 zfs create 命令进行设置,请分别参见设置 ZFS 属性和创建 ZFS 文件系统中的说明。除了配额和预留空间外,可设置的本机属性均可继承。有关配额和预留空间的更多信息,请参见设置 ZFS 配额和预留空间。

有些可设置的本机属性特定于特殊类型的数据集。在这种情况下,表 6–1 的说明部分会注明数据集类型。如果未明确注明,则表明属性适用于所有数据集类型: 文件系统、卷、克隆和快照。

下面列出了可设置的属性,表 6–1 对其进行了说明。

canmount 属性

如果 canmount 属性设置为 off,则不能使用 zfs mount 或 zfs mount -a 命令挂载文件系统。将此属性设置为 off 与将 mountpoint 属性设置为 none 的效果相似,区别在于数据集仍有一个可继承的正常 mountpoint 属性。例如,可将该属性设置为 off,为后代文件系统建立可继承属性,但父文件系统本身永远不会挂载,也无法供用户访问。在这种情况下,父文件系统将充当一个容器,这样便可以在容器中设置属性,但容器本身永远不可访问。

在以下示例中,创建了 userpool 并将其 canmount 属性设置为 off。将后代用户文件系统的挂载点设置为一个公共挂载点 /export/home。在父文件系统中设置的属性可由后代文件系统继承,但永远不会挂载父文件系统本身。


# zpool create userpool mirror c0t5d0 c1t6d0
# zfs set canmount=off userpool
# zfs set mountpoint=/export/home userpool
# zfs set compression=on userpool
# zfs create userpool/user1
# zfs create userpool/user2
# zfs mount
userpool/user1                  /export/home/user1
userpool/user2                  /export/home/user2

将 canmount 属性设置为 noauto 意味着数据集只能显式挂载,而不能自动挂载。Oracle Solaris 升级软件使用此设置,以便可在引导时只挂载那些属于活动引导环境 (boot environment) 的数据集。

recordsize 属性

recordsize 属性为文件系统中的文件指定建议的块大小。

该属性专门设计用于对大小固定的记录中的文件进行访问的数据库工作负荷。ZFS 会根据为典型的访问模式优化的内部算法来自动调整块大小。对于创建很大的文件但访问较小的随机块中的文件的数据库而言,这些算法可能不是最优的。将 recordsize 值指定为大于或等于数据库的记录大小的值可以显著提高性能。强烈建议不要将该属性用于一般用途的文件系统,否则可能会对性能产生不利影响。指定的大小必须是 2 的若干次幂,并且必须大于或等于 512 字节同时小于或等于 128 KB。更改文件系统的 recordsize 值仅影响之后创建的文件。现有文件不会受到影响。

此属性的缩写为 recsize。

volsize 属性

volsize 属性指定卷的逻辑大小。缺省情况下,创建卷会产生相同大小的预留空间。对 volsize 的任何更改都会反映为对预留空间的等效更改。这些检查用来防止用户产生的意外行为。如果卷包含的空间比其声明可用的空间少,则会导致未定义的行为或数据损坏,具体取决于卷的使用方法。如果在卷的使用过程中更改卷大小,特别是在收缩大小时,也会出现上述影响。调整卷大小时,应该格外小心。

尽管并不建议,但可以通过为 -zfs create -V 指定 s 标志或在创建卷后更改预留空间来创建稀疏卷。稀疏卷指预留空间与卷大小不相等的卷。对于稀疏卷,预留空间中不会反映对 volsize 的更改。

有关使用卷的更多信息,请参见ZFS 卷。

ZFS 用户属性

除了本机属性外,ZFS 还支持任意用户属性。用户属性对 ZFS 行为没有影响,但可通过用户环境中有意义的信息来注释数据集。

用户属性名必须符合以下约定:

预期约定是属性名分为以下两个部分,但 ZFS 不强制使用此名称空间:


module:property

在程序中使用用户属性时,请对属性名的 module 部分使用反向 DNS 域名,以尽量避免两个独立开发的软件包将同一属性名用于不同用途。以 com.sun. 开头的属性名保留供 Oracle Corporation 使用。

用户属性的值必须符合以下约定:

例如:


# zfs set dept:users=finance userpool/user1
# zfs set dept:users=general userpool/user2
# zfs set dept:users=itops userpool/user3

对属性执行操作的所有命令(如 zfs list、zfs get、zfs set 等)都可用来处理本机属性和用户属性。

例如:


zfs get -r dept:users userpool
NAME            PROPERTY    VALUE           SOURCE
userpool        dept:users  all             local
userpool/user1  dept:users  finance         local
userpool/user2  dept:users  general         local
userpool/user3  dept:users  itops           local

要清除某一用户属性,请使用 zfs inherit 命令。例如:


# zfs inherit -r dept:users userpool

如果任意父数据集中均未定义该属性,则会将其完全删除。

查询 ZFS 文件系统信息

zfs list 命令提供了一种用于查看和查询数据集信息的可扩展机制。本节中对基本查询和复杂查询都进行了说明。

列出基本 ZFS 信息

通过使用不带任何选项的 zfs list 命令可以列出基本数据集信息。此命令可显示系统中所有数据集的名称,以及其 used、available、referenced 和 mountpoint 属性的值。有关这些属性的更多信息,请参见ZFS 属性介绍。

例如:


# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
pool                   476K  16.5G    21K  /pool
pool/clone              18K  16.5G    18K  /pool/clone
pool/home              296K  16.5G    19K  /pool/home
pool/home/marks        277K  16.5G   277K  /pool/home/marks
pool/home/marks@snap      0      -   277K  -
pool/test               18K  16.5G    18K  /test

另外,还可使用此命令通过在命令行中提供数据集名称来显示特定数据集。此外,使用 -r 选项将以递归方式显示该数据集的所有后代。例如:


# zfs list -r pool/home/marks
NAME                   USED  AVAIL  REFER  MOUNTPOINT
pool/home/marks        277K  16.5G   277K  /pool/home/marks
pool/home/marks@snap      0      -   277K  -

您可以结合文件系统的挂载点使用 zfs list 命令。例如:


# zfs list /pool/home/marks
NAME              USED  AVAIL  REFER  MOUNTPOINT
pool/home/marks   277K  16.5G   277K  /pool/home/marks

以下示例说明如何显示 tank/home/chua 及其所有后代数据集的基本信息:


# zfs list -r tank/home/chua
NAME                        USED  AVAIL  REFER  MOUNTPOINT 
tank/home/chua		          26.0K  4.81G  10.0K  /tank/home/chua 
tank/home/chua/projects       16K  4.81G   9.0K  /tank/home/chua/projects
tank/home/chua/projects/fs1    8K  4.81G     8K  /tank/home/chua/projects/fs1 
tank/home/chua/projects/fs2    8K  4.81G     8K  /tank/home/chua/projects/fs2

有关 zfs list 命令的其他信息,请参见 zfs(1M)。

创建复杂的 ZFS 查询

使用 o、-t 和 -H 选项可对 -zfs list 输出进行自定义。

通过使用 -o 选项以及所需属性的逗号分隔列表可以自定义属性值输出。可以将任何数据集属性作为有效参数提供。有关所有受支持的数据集属性的列表,请参见ZFS 属性介绍。除了定义的属性外,-o 选项列表还可以包含字符 name,以指明输出应包括数据集的名称。

以下示例使用 zfs list 来显示数据集名称以及 sharenfs 和 mountpoint 属性值。


# zfs list -o name,sharenfs,mountpoint
NAME                   SHARENFS         MOUNTPOINT
tank                   off              /tank
tank/home              on               /tank/home
tank/home/ahrens       on               /tank/home/ahrens
tank/home/bonwick      on               /tank/home/bonwick
tank/home/chua         on               /tank/home/chua
tank/home/eschrock     on               legacy
tank/home/moore        on               /tank/home/moore
tank/home/tabriz       ro               /tank/home/tabriz

可以使用 -t 选项指定要显示的数据集的类型。下表中介绍了有效的类型。

表 6–2 ZFS 数据集的类型

类型 

说明 

filesystem

文件系统和克隆 

volume

卷 

snapshot

快照 

-t 选项可后跟要显示的数据集类型的逗号分隔列表。以下示例同时使用 -t 和 -o 选项来显示所有文件系统的名称和 used 属性:


# zfs list -t filesystem -o name,used
NAME              USED
pool              476K
pool/clone         18K
pool/home         296K
pool/home/marks   277K
pool/test          18K

使用 -H 选项可从生成的输出中省略 zfs list 标题。使用 -H 选项时,所有空格都被 Tab 字符取代。当需要可解析的输出(例如编写脚本时),此选项可能很有用。以下示例显示了使用带有 H 选项的 -zfs list 命令所生成的输出:


# zfs list -H -o name
pool
pool/clone
pool/home
pool/home/marks
pool/home/marks@snap
pool/test

管理 ZFS 属性

数据集属性通过 zfs 命令的 set、inherit 和 get 子命令来管理。

设置 ZFS 属性

可以使用 zfs set 命令修改任何可设置的数据集属性。或者,也可以使用 zfs create 命令在创建数据集时设置属性。有关可设置的数据集属性的列表,请参见可设置的 ZFS 本机属性。

zfs set 命令采用 property=value 格式的属性/值序列,然后是数据集名称。zfs set 的每次调用只能设置或修改一个属性。

以下示例将 tank/home 的 atime 属性设置为 off。


# zfs set atime=off tank/home

此外,任何文件系统属性均可在创建文件系统时设置。例如:


# zfs create -o atime=off tank/home

可以使用以下易于理解的后缀(按升序)指定数字属性值:BKMGTPEZ。其中任一后缀都可后跟可选的 b,用于表示字节,但 B 后缀除外,因为它已表示了字节。以下四个 zfs set 调用是等效的数字表达式,在 tank/home/marks 文件系统中将 quota 属性设置为值 50 GB:


# zfs set quota=50G tank/home/marks
# zfs set quota=50g tank/home/marks
# zfs set quota=50GB tank/home/marks
# zfs set quota=50gb tank/home/marks

非数字属性的值区分大小写,并且必须为小写字母,但 mountpoint 和 sharenfs 除外。这两个属性的值既可以包含大写字母,也可以包含小写字母。

有关 zfs set 命令的更多信息,请参见 zfs(1M)。

继承 ZFS 属性

除非已对后代数据集显式设置了配额或预留空间,否则除了配额和预留空间外,所有可设置的属性都从父数据集继承各自的值。如果没有祖先为继承的属性设置显式值,则使用该属性的缺省值。可以使用 zfs inherit 命令清除属性值,从而促使从父数据集继承该值。

以下示例使用 zfs set 命令为 tank/home/bonwick 文件系统启用压缩。然后,使用 zfs inherit 清除 compression 属性,从而使该属性继承缺省值 off。由于 home 和 tank 都未本地设置 compression 属性,因此会使用缺省值。如果两者都启用了压缩,则使用最直接的祖先中设置的值(在本示例中为 home)。


# zfs set compression=on tank/home/bonwick
# zfs get -r compression tank
NAME             PROPERTY      VALUE                    SOURCE
tank             compression   off                      default
tank/home        compression   off                      default
tank/home/bonwick compression   on                      local
# zfs inherit compression tank/home/bonwick
# zfs get -r compression tank
NAME             PROPERTY      VALUE                    SOURCE
tank             compression   off                      default
tank/home        compression   off                      default
tank/home/bonwick compression  off                      default

如果指定了 -r 选项,则会以递归方式应用 inherit 子命令。在以下示例中,该命令将使 tank/home 以及它可能具有的所有后代都继承 compression 属性的值:


# zfs inherit -r compression tank/home

注 –

请注意,使用 -r 选项会清除所有后代数据集的当前属性设置。


有关 zfs inherit 命令的更多信息,请参见 zfs(1M)。

查询 ZFS 属性

查询属性值的最简单方法是使用 zfs list 命令。有关更多信息,请参见列出基本 ZFS 信息。但是,对于复杂查询和脚本编写,请使用 zfs get 命令以自定义格式提供更详细的信息。

可以使用 zfs get 命令检索任何数据集属性。以下示例说明如何在数据集中检索单个属性值:


# zfs get checksum tank/ws
NAME             PROPERTY       VALUE                      SOURCE
tank/ws          checksum       on                         default

第四栏 SOURCE 表示此属性值的来源。下表定义可能的源值。

表 6–3 可能的 SOURCE 值 (zfs get 命令)

源值 

说明 

default

从来不为数据集或其任何祖先显式设置此属性值。使用的是该属性的缺省值。 

inherited from dataset-name

该属性值继承自 dataset-name 所指定的父数据集。

local

使用 zfs set 可为此数据集显式设置该属性值。

temporary

该属性值是使用 zfs mount -o 选项设置的,并且仅在挂载期间有效。有关临时挂载点属性的更多信息,请参见使用临时挂载属性。

-(无) 

此属性为只读。其值由 ZFS 生成。 

可以使用特殊关键字 all 检索所有数据集属性值。以下示例使用 all 关键字:


# zfs get all tank/home
NAME       PROPERTY              VALUE                  SOURCE
tank/home  type                  filesystem             -
tank/home  creation              Tue Jun 29 11:44 2010  -
tank/home  used                  21K                    -
tank/home  available             66.9G                  -
tank/home  referenced            21K                    -
tank/home  compressratio         1.00x                  -
tank/home  mounted               yes                    -
tank/home  quota                 none                   default
tank/home  reservation           none                   default
tank/home  recordsize            128K                   default
tank/home  mountpoint            /tank/home             default
tank/home  sharenfs              off                    default
tank/home  checksum              on                     default
tank/home  compression           off                    default
tank/home  atime                 on                     default
tank/home  devices               on                     default
tank/home  exec                  on                     default
tank/home  setuid                on                     default
tank/home  readonly              off                    default
tank/home  zoned                 off                    default
tank/home  snapdir               hidden                 default
tank/home  aclmode               groupmask              default
tank/home  aclinherit            restricted             default
tank/home  canmount              on                     default
tank/home  shareiscsi            off                    default
tank/home  xattr                 on                     default
tank/home  copies                1                      default
tank/home  version               4                      -
tank/home  utf8only              off                    -
tank/home  normalization         none                   -
tank/home  casesensitivity       sensitive              -
tank/home  vscan                 off                    default
tank/home  nbmand                off                    default
tank/home  sharesmb              off                    default
tank/home  refquota              none                   default
tank/home  refreservation        none                   default
tank/home  primarycache          all                    default
tank/home  secondarycache        all                    default
tank/home  usedbysnapshots       0                      -
tank/home  usedbydataset         21K                    -
tank/home  usedbychildren        0                      -
tank/home  usedbyrefreservation  0                      -
tank/home  logbias               latency                default

注 –

casesensitivity、nbmand、normalization、sharesmb、utf8only 和 vscan 属性在 Oracle Solaris 10 发行版中并不能全面使用,因为 Oracle Solaris 10 发行版不支持 Oracle Solaris SMB 服务。


通过 zfs get 的 -s 选项,可以按源类型指定要显示的属性。通过此选项可获取一个逗号分隔列表,用于指明所需的源类型。仅会显示具有指定源类型的属性。有效的源类型包括 local、default、inherited、temporary 和 none。以下示例显示了已对 pool 本地设置的所有属性。


# zfs get -s local all pool
NAME             PROPERTY      VALUE                      SOURCE
pool             compression   on                         local

以上任何选项均可与 -r 选项结合使用,以便以递归方式显示指定数据集的所有子级的指定属性。在以下示例中,以递归方式显示了 tank 中所有数据集的所有临时属性:


# zfs get -r -s temporary all tank
NAME             PROPERTY       VALUE                      SOURCE
tank/home          atime          off                      temporary
tank/home/bonwick  atime          off                      temporary
tank/home/marks    atime          off                      temporary

可以在不指定目标文件系统的情况下使用 zfs get 命令查询属性值,这意味着该命令对所有池或文件系统有效。例如:


# zfs get -s local all
tank/home               atime          off                    local
tank/home/bonwick       atime          off                    local
tank/home/marks         quota          50G                    local

有关 zfs get 命令的更多信息,请参见 zfs(1M)。

查询用于编写脚本的 ZFS 属性

zfs get 命令支持为编写脚本而设计的 -H 和 -o 选项。可以使用 -H 选项省去标头信息并用 Tab 字符替换空格。使用一致的空格可使数据便于分析。可以使用 -o 选项以如下方式自定义输出:

以下示例说明如何使用 -zfs get 的 -H 和 o 选项来检索单个值:


# zfs get -H -o value compression tank/home
on

-p 选项会将数字值报告为精确值。例如,1MB 将报告为 1000000。此选项可按如下方式使用:


# zfs get -H -o value -p used tank/home
182983742

可以结合使用 -r 选项与前述任何选项,以递归方式为所有后代检索请求值。以下示例使用 -H、-o 和 -r 选项为 export/home 及其后代检索数据集名称和 used 属性值,同时忽略标题输出:


# zfs get -H -o name,value -r used export/home
export/home             5.57G
export/home/marks       1.43G
export/home/maybee      2.15G

挂载和共享 ZFS 文件系统

本节介绍如何在 ZFS 中管理挂载点和共享的文件系统。

管理 ZFS 挂载点

缺省情况下,ZFS 文件系统在创建时自动挂载。可以确定文件系统的特定挂载点行为,如本节所述。

另外,也可以在创建时使用 zpool create 的 -m 选项设置池数据集的缺省挂载点。有关创建池的更多信息,请参见创建 ZFS 存储池。

所有 ZFS 文件系统都由 ZFS 通过使用服务管理工具 (Service Management Facility, SMF) 的 svc://system/filesystem/local 服务在引导时挂载。文件系统挂载在 /path 下,其中 path 是文件系统的名称。

可以使用 zfs set 命令将 mountpoint 属性设置为特定路径,以覆盖缺省挂载点。如果需要,ZFS 会自动创建指定挂载点,并在调用 zfs mount -a 命令时自动挂载相关文件系统,而无需编辑 /etc/vfstab 文件。

mountpoint 属性是继承的。例如,如果 pool/home 的 mountpoint 属性设置为 /export/stuff,则 pool/home/user 将继承 /export/stuff/user 的 mountpoint 属性值。

要阻止文件系统被挂载,须将 mountpoint 属性设置为 none。此外,canmount 属性可以用来控制是否能挂载文件系统。有关 canmount 属性的更多信息,请参见canmount 属性。

也可以使用 zfs set 将 mountpoint 属性设置为 legacy,从而通过传统挂载接口显式管理文件系统。这样做可以防止 ZFS 自动挂载和管理文件系统。不过必须改用包括 mount 和 umount 命令在内的传统工具以及 /etc/vfstab 文件。有关传统挂载的更多信息,请参见传统挂载点。

自动挂载点

mountpoint 属性不为 legacy 的所有数据集都由 ZFS 来管理。在以下示例中,创建了一个数据集,其挂载点由 ZFS 自动管理:


# zfs create pool/filesystem
# zfs get mountpoint pool/filesystem
NAME             PROPERTY      VALUE                      SOURCE
pool/filesystem  mountpoint    /pool/filesystem           default
# zfs get mounted pool/filesystem
NAME             PROPERTY      VALUE                      SOURCE
pool/filesystem  mounted       yes                        -

另外,也可按以下示例所示,显式设置 mountpoint 属性:


# zfs set mountpoint=/mnt pool/filesystem
# zfs get mountpoint pool/filesystem
NAME             PROPERTY      VALUE                      SOURCE
pool/filesystem  mountpoint    /mnt                       local
# zfs get mounted pool/filesystem
NAME             PROPERTY      VALUE                      SOURCE
pool/filesystem  mounted       yes                        -

mountpoint 属性更改时,文件系统将自动从旧挂载点取消挂载,并重新挂载到新挂载点。挂载点目录根据需要进行创建。如果 ZFS 由于文件系统正处于活动状态而无法将其取消挂载,则会报告错误,并需要强制进行手动取消挂载。

传统挂载点

通过将 mountpoint 属性设置为 legacy,可以使用传统工具来管理 ZFS 文件系统。传统文件系统必须通过 mount 和 umount 命令以及 /etc/vfstab 文件来管理。ZFS 在引导时不会自动挂载传统文件系统,并且 ZFS mount 和 umount 命令不会对此类型的数据集执行操作。以下示例说明如何在传统模式下设置和管理 ZFS 数据集:


# zfs set mountpoint=legacy tank/home/eschrock
# mount -F zfs tank/home/eschrock /mnt

要在引导时自动挂载传统文件系统,必须向 /etc/vfstab 文件中添加一项。/etc/vfstab 文件中的项可能看起来如下例所示:


#device         device        mount           FS      fsck    mount   mount
#to mount       to fsck       point           type    pass    at boot options
#

tank/home/eschrock -		/mnt		   zfs		-		yes		-	

device to fsck 和 fsck pass 项设置为 -,因为 fsck 命令不适用于 ZFS 文件系统。有关 ZFS 数据完整性的更多信息,请参见 事务性语义。

挂载 ZFS 文件系统

创建文件系统或系统引导时,ZFS 会自动挂载文件系统。仅当需要更改挂载选项,或者显式挂载或取消挂载文件系统时,才有必要使用 zfs mount 命令。

不带任何参数的 zfs mount 命令可以显示 ZFS 管理的当前已挂载的所有文件系统。传统管理的挂载点不会显示。例如:


# zfs mount
tank                            /tank
tank/home                       /tank/home
tank/home/bonwick               /tank/home/bonwick
tank/ws                         /tank/ws

可以使用 -a 选项挂载 ZFS 管理的所有文件系统。传统管理的文件系统不会挂载。例如:


# zfs mount -a

缺省情况下,ZFS 不允许在非空目录的顶层进行挂载。要强制在非空目录的顶层挂载,必须使用 -O 选项。例如:


# zfs mount tank/home/lalt
cannot mount '/export/home/lalt': directory is not empty
use legacy mountpoint to allow this behavior, or use the -O flag
# zfs mount -O tank/home/lalt

传统挂载点必须通过传统工具进行管理。尝试使用 ZFS 工具将产生错误。例如:


# zfs mount pool/home/billm
cannot mount 'pool/home/billm': legacy mountpoint
use mount(1M) to mount this filesystem
# mount -F zfs tank/home/billm

文件系统挂载时,将基于与数据集关联的属性值使用一组挂载选项。属性与挂载选项之间的相互关系如下:

表 6–4 ZFS 挂载相关的属性和挂载选项

属性 

挂载选项 

atime

atime/noatime

devices

devices/nodevices

exec

exec/noexec

nbmand

nbmand/nonbmand

readonly

ro/rw

setuid

setuid/nosetuid

xattr

xattr/noaxttr

挂载选项 nosuid 是 nodevices,nosetuid 的别名。

使用临时挂载属性

如果使用带有 -o 选项的 zfs mount 命令显式设置了前一部分所述的任何挂载选项,则会临时覆盖关联的属性值。zfs get 命令将这些属性值报告为 temporary,并在文件系统取消挂载时恢复为其初始值。如果挂载数据集时更改某个属性值,更改将立即生效,并覆盖所有临时设置。

在以下示例中,对 tank/home/perrin 文件系统临时设置了只读挂载选项。假设要取消挂载文件系统。


# zfs mount -o ro tank/home/perrin

要临时更改当前已挂载的文件系统的属性值,必须使用特殊的 remount 选项。在以下示例中,对于当前挂载的文件系统,atime 属性暂时更改为 off:


# zfs mount -o remount,noatime tank/home/perrin
# zfs get atime tank/home/perrin
NAME             PROPERTY      VALUE                      SOURCE
tank/home/perrin atime         off                        temporary

有关 zfs mount 命令的更多信息,请参见 zfs(1M)。

取消挂载 ZFS 文件系统

通过使用 zfs unmount 子命令可以取消挂载 ZFS 文件系统。unmount 命令可以采用挂载点或文件系统名称作为参数。

在以下示例中,按文件系统名称取消挂载一个文件系统:


# zfs unmount tank/home/tabriz

在以下示例中,按挂载点取消挂载一个文件系统:


# zfs unmount /export/home/tabriz

如果文件系统处于繁忙状态,则 unmount 命令将失败。要强行取消挂载文件系统,可以使用 -f 选项。如果文件系统内容正处于使用状态,强行取消挂载该文件系统时请务必小心。否则,会产生不可预测的应用程序行为。


# zfs unmount tank/home/eschrock
cannot unmount '/export/home/eschrock': Device busy
# zfs unmount -f tank/home/eschrock

要提供向后兼容性,可以使用传统的 umount 命令来取消挂载 ZFS 文件系统。例如:


# umount /export/home/bob

有关 zfs umount 命令的更多信息,请参见 zfs(1M)。

共享和取消共享 ZFS 文件系统

只要设置 sharenfs 属性,ZFS 便能自动共享文件系统。使用此属性时,不必在共享新文件系统时修改 /etc/dfs/dfstab 文件。sharenfs 属性是要传递给 share 命令的选项的逗号分隔列表。值 on 是缺省的共享选项的别名,它向所有用户提供 read/write 权限。值 off 指明文件系统不是由 ZFS 进行管理,但可通过传统方法(如 /etc/dfs/dfstab 文件)来共享。在引导过程中将会共享 sharenfs 属性不为 off 的所有文件系统。

控制共享语义

缺省情况下,所有文件系统都未进行共享。要共享新文件系统,请使用类似如下的 zfs set 语法:


# zfs set sharenfs=on tank/home/eschrock

sharenfs属性是继承的,如果文件系统继承的属性不为 off,则这些文件系统在创建时会自动进行共享。例如:


# zfs set sharenfs=on tank/home
# zfs create tank/home/bricker
# zfs create tank/home/tabriz
# zfs set sharenfs=ro tank/home/tabriz

tank/home/bricker 和 tank/home/tabriz 最初以可写方式共享,因为它们从 tank/home 继承了 sharenfs 属性。将该属性设置为 ro(只读)后,无论为 tank/home 设置的 sharenfs 属性为何值,都会以只读方式共享 tank/home/tabriz。

取消共享 ZFS 文件系统

尽管大多数文件系统都可在引导、创建和销毁过程中自动共享或取消共享,但文件系统有时候需要显式取消共享。为此,请使用 zfs unshare 命令。例如:


# zfs unshare tank/home/tabriz

此命令会取消共享 tank/home/tabriz 文件系统。要取消共享系统中的所有 ZFS 文件系统,需要使用 -a 选项。


# zfs unshare -a

共享 ZFS 文件系统

通常而言,ZFS 在引导和创建时共享文件系统的自动行为足以满足一般操作的需要。如果由于某些原因取消共享了某个文件系统,则可使用 zfs share 命令再次将其共享。例如:


# zfs share tank/home/tabriz

另外,还可以通过使用 -a 选项共享系统中的所有 ZFS 文件系统。


# zfs share -a

传统共享行为

如果 sharenfs 属性设置为 off,则 ZFS 在任何时候都不会尝试共享或取消共享文件系统。借助此值,可以通过传统方法(如 /etc/dfs/dfstab 文件)来管理文件系统共享。

与传统的 mount 命令不同,传统的 share 和 unshare 命令在 ZFS 文件系统中仍然可以运行。因此,可以使用与 sharenfs 属性的选项不同的选项来手动共享文件系统。不鼓励使用这种管理模型。请选择完全通过 ZFS 或完全通过 /etc/dfs/dfstab 文件来管理 NFS 共享内容。ZFS 管理模型与传统模型相比,设计更为简单,所需进行的工作越少。

设置 ZFS 配额和预留空间

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

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

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

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

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

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

设置 ZFS 文件系统的配额

使用 zfs set 和 zfs 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 list 和 df 命令的输出。例如:


# 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/bonwick 和 tank/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 userquota 或 zfs 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 set 和 zfs 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,则仅当在此预留空间之外有足够的未预留池空间来容纳数据集中的当前引用字节数时,才允许使用快照。