本章提供有关管理 Oracle Solaris ZFS 文件系统的详细信息。本章包括分层文件系统布局、属性继承和自动挂载点管理以及共享交互等概念。
本章包含以下各节:
ZFS 文件系统构建于存储池上。文件系统可以动态创建和销毁,而不需要分配或格式化任何底层磁盘空间。由于文件系统是轻量型的,并且是 ZFS 中的管理中心点,因此可能要创建许多文件系统。
使用 zfs 命令可以管理 ZFS 文件系统。zfs 命令提供了一组用于对文件系统执行特定操作的子命令。本章详细介绍了这些子命令。使用此命令还可以管理快照、卷和克隆,但本章仅对这些功能进行了简短介绍。有关快照和克隆的详细信息,请参见第 7 章。有关 ZFS 卷的详细信息,请参见ZFS 卷。
可以使用 zfs create 和 zfs destroy 命令来创建和销毁 ZFS 文件系统。使用 zfs rename 命令可重命名 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 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 rename 命令可重命名文件系统。使用 rename 子命令可以执行以下操作:
更改文件系统的名称.
在 ZFS 分层结构内重定位文件系统。
更改文件系统的名称并在 ZFS 分层结构内对其重定位。
以下示例使用 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 set 命令对数据集进行显式设置的,如设置 ZFS 属性中所述。
表示属性是从指定的祖先继承而来。
表示属性值不是继承而来或在本地设置。如果没有祖先具有属性源 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 | |
mountpoint |
字符串 |
N/A |
控制用于此文件系统的挂载点。当文件系统的 mountpoint 属性发生更改时,将取消挂载该文件系统以及继承挂载点的任何后代。如果新值为 legacy,则该文件系统和子级将保持取消挂载状态。否则,如果属性以前为 legacy 或 none,或者该文件系统和子级在属性发生更改之前处于挂载状态,则会自动在新位置重新挂载它们。此外,任何共享文件系统都将取消共享,并在新位 置进行共享。 有关使用该属性的更多信息,请参见管理 ZFS 挂载点。 |
primarycache |
字符串 |
all |
控制在主高速缓冲存储器 (ARC) 中缓存的内容。可能的值包括 all、none 和 metadata。如果设置为 all,则用户数据和元数据都会被缓存。如果设置为 none,则用户数据和元数据都不会被缓存。如果设置为 metadata,则仅缓存元数据。 |
origin |
字符串 |
N/A |
克隆的文件系统或卷的只读属性,用于标识创建克隆所在的快照。只要克隆存在,便不能销毁克隆源(即使使用 -r 或 -f 选项也是如此)。 |
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 | |
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 | |
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 |
可以检索但无法设置只读本机属性。只读本机属性不可继承。有些本机属性特定于特殊类型的数据集。在这种情况下,表 6–1 的说明部分会注明数据集类型。
下面列出了只读本机属性,表 6–1 对其进行了说明。
available
compressratio
creation
mounted
origin
referenced
type
used
有关详细信息,请参见used 属性。
usedbychildren
usedbydataset
usedbyrefreservation
usedbysnapshots
有关磁盘空间记帐(包括 used、referenced 和 available 属性)的更多信息,请参见ZFS 磁盘空间记帐。
used 属性是一个只读属性,表明此数据集及其所有后代占用的磁盘空间量。可根据此数据集的配额和预留空间来检查该值。使用的磁盘空间不包括数据集的预留空间,但会考虑任何后代数据集的预留空间。数据集占用其父级的磁盘空间量以及以递归方式销毁该数据集时所释放的磁盘空间量应为其使用空间和预留空间的较大者。
创建快照时,其磁盘空间最初在快照与文件系统之间进行共享,还可能是与以前的快照进行共享。随着文件系统的变化,以前共享的磁盘空间将供快照专用,并会计算在快照的使用空间内。快照使用的磁盘空间会将其专用数据所占空间计算在内。此外,删除快照可增加其他快照专用(和使用)的磁盘空间量。有关快照和空间问题的更多信息,请参见空间不足行为。
已用磁盘空间量、可用磁盘空间量以及引用磁盘空间量并不包括暂挂更改。通常,暂挂更改仅占用几秒钟的时间。使用 fsync(3c) 或 O_SYNC 功能提交对磁盘的更改,不一定可以保证磁盘空间使用情况信息会立即更新。
使用 zfs list -o space 命令,可以显示 usedbychildren、usedbydataset、usedbyrefreservation 和 usedbysnapshots 属性信息。这些属性将 used 属性细分为后代占用的磁盘空间。有关更多信息,请参见表 6–1。
可设置的本机属性是其值可同时进行检索和设置的属性。可设置的本机属性可以使用 zfs set 命令或 zfs create 命令进行设置,请分别参见设置 ZFS 属性和创建 ZFS 文件系统中的说明。除了配额和预留空间外,可设置的本机属性均可继承。有关配额和预留空间的更多信息,请参见设置 ZFS 配额和预留空间。
有些可设置的本机属性特定于特殊类型的数据集。在这种情况下,表 6–1 的说明部分会注明数据集类型。如果未明确注明,则表明属性适用于所有数据集类型: 文件系统、卷、克隆和快照。
下面列出了可设置的属性,表 6–1 对其进行了说明。
aclinherit
有关详细说明,请参见ACL 属性。
aclmode
有关详细说明,请参见ACL 属性。
atime
canmount
checksum
compression
copies
devices
exec
mountpoint
primarycache
quota
readonly
recordsize
有关详细说明,请参见recordsize 属性。
refquota
refreservation
reservation
secondarycache
shareiscsi
sharenfs
setuid
snapdir
version
volsize
有关详细说明,请参见volsize 属性。
volblocksize
zoned
xattr
如果 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 属性为文件系统中的文件指定建议的块大小。
该属性专门设计用于对大小固定的记录中的文件进行访问的数据库工作负荷。ZFS 会根据为典型的访问模式优化的内部算法来自动调整块大小。对于创建很大的文件但访问较小的随机块中的文件的数据库而言,这些算法可能不是最优的。将 recordsize 值指定为大于或等于数据库的记录大小的值可以显著提高性能。强烈建议不要将该属性用于一般用途的文件系统,否则可能会对性能产生不利影响。指定的大小必须是 2 的若干次幂,并且必须大于或等于 512 字节同时小于或等于 128 KB。更改文件系统的 recordsize 值仅影响之后创建的文件。现有文件不会受到影响。
此属性的缩写为 recsize。
volsize 属性指定卷的逻辑大小。缺省情况下,创建卷会产生相同大小的预留空间。对 volsize 的任何更改都会反映为对预留空间的等效更改。这些检查用来防止用户产生的意外行为。如果卷包含的空间比其声明可用的空间少,则会导致未定义的行为或数据损坏,具体取决于卷的使用方法。如果在卷的使用过程中更改卷大小,特别是在收缩大小时,也会出现上述影响。调整卷大小时,应该格外小心。
尽管并不建议,但可以通过为 -zfs create -V 指定 s 标志或在创建卷后更改预留空间来创建稀疏卷。稀疏卷指预留空间与卷大小不相等的卷。对于稀疏卷,预留空间中不会反映对 volsize 的更改。
有关使用卷的更多信息,请参见ZFS 卷。
除了本机属性外,ZFS 还支持任意用户属性。用户属性对 ZFS 行为没有影响,但可通过用户环境中有意义的信息来注释数据集。
必须包含冒号字符 (':'),以与本机属性相区分。
必须包含小写字母、数字或以下标点符号:':'、'+'、'.'、'_'。
用户属性名称的最大长度为 256 个字符。
预期约定是属性名分为以下两个部分,但 ZFS 不强制使用此名称空间:
module:property |
在程序中使用用户属性时,请对属性名的 module 部分使用反向 DNS 域名,以尽量避免两个独立开发的软件包将同一属性名用于不同用途。以 com.sun. 开头的属性名保留供 Oracle Corporation 使用。
用户属性的值必须符合以下约定:
必须由始终继承且从不验证的任意字符串组成。
用户属性值的最大长度为 1024 个字符。
例如:
# 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 list 命令提供了一种用于查看和查询数据集信息的可扩展机制。本节中对基本查询和复杂查询都进行了说明。
通过使用不带任何选项的 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)。
使用 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 命令的 set、inherit 和 get 子命令来管理。
可以使用 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 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 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 get 命令支持为编写脚本而设计的 -H 和 -o 选项。可以使用 -H 选项省去标头信息并用 Tab 字符替换空格。使用一致的空格可使数据便于分析。可以使用 -o 选项以如下方式自定义输出:
字符 name 可以与逗号分隔的属性列表一起使用,如 ZFS 属性介绍 部分所述。
输出逗号分隔的字面字段、name、value、property 和 source 列表,后面跟随空格和参数,这就是逗号分隔的属性列表。
以下示例说明如何使用 -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 文件系统在创建时自动挂载。可以确定文件系统的特定挂载点行为,如本节所述。
另外,也可以在创建时使用 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 或 none 更改为特定路径时,ZFS 会自动挂载文件系统。
如果 ZFS 正在管理文件系统,但该文件系统当前已取消挂载,并且 mountpoint 属性已更改,则文件系统将保持取消挂载状态。
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 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 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)。
只要设置 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 unshare 命令。例如:
# zfs unshare tank/home/tabriz |
此命令会取消共享 tank/home/tabriz 文件系统。要取消共享系统中的所有 ZFS 文件系统,需要使用 -a 选项。
# zfs unshare -a |
通常而言,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 管理模型与传统模型相比,设计更为简单,所需进行的工作越少。
可以使用 quota 属性对文件系统可以使用的磁盘空间量设置限制。此外,还可以使用 reservation 属性来保证一定的磁盘空间量供文件系统使用。这两个属性将应用于设置了它们的数据集以及该数据集的所有后代。
也就是说,如果对 tank/home 数据集设置了配额,则 tank/home 及其所有后代使用的总磁盘空间量不能超过该配额。同样,如果为 tank/home 指定了预留空间,则 tank/home 及其所有后代都会使用该预留空间。数据集及其所有后代使用的磁盘空间量由 used 属性报告。
refquota 和 refreservation 属性用于管理文件系统空间,但不会将后代(如快照和克隆)占用的磁盘空间计算在内。
在此 Solaris 发行版中,您可以根据属于特定用户或组的文件所占用的磁盘空间量来设置 user 或 group 配额。不能基于卷、早于文件系统版本 4 的文件系统或早于池版本 15 的池设置用户和组配额属性。
确定哪个配额和预留空间功能更有利于管理您的文件系统时,请考虑以下几点:
管理数据集及其后代使用的磁盘空间时,使用 quota 和 reservation 属性会很方便。
refquota 和 refreservation 属性适合于管理数据集占用的磁盘空间。
将 refquota 或 refreservation 属性设置为高于 quota 或 reservation 属性时无效。如果设置了 quota 或 refquota 属性,则尝试超出任一值的操作都将失败。可能会超出大于 refquota 的 quota。例如,如果有些快照块被修改,则可能在超出 refquota 之前实际已超出 quota。
用户和组配额提供了一种方法,可以在具有很多用户帐户的情况下更轻松地管理磁盘空间,例如在大学环境里。
有关设置配额和预留空间的更多信息,请参见设置 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 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 文件系统的用户和组配额提供以下功能:
在父文件系统上设置的用户配额或组配额不会被后代文件系统自动继承。
但是,基于具有用户或组配额的文件系统创建克隆或快照时,将应用用户或组配额。同样,使用 zfs send 命令(即使不带 -R 选项)创建流时,文件系统将具有用户或组配额。
未授权的用户只能访问自己的磁盘空间使用情况。超级用户或被授予 userused 或 groupused 权限的用户可以访问所有人的用户或组磁盘空间记帐信息。
不能基于 ZFS 卷、早于文件系统版本 4 的文件系统或早于池版本 15 的池设置 userquota 和 groupquota 属性。
用户和组配额的实施可能会延迟几秒钟。这种延迟意味着,在系统发现已超出配额并拒绝其他写入操作(同时显示 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 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,则仅当在此预留空间之外有足够的未预留池空间来容纳数据集中的当前引用字节数时,才允许使用快照。