电脑技术学习

管理 ZFS 文件系统

dn001

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

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

  注 –

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

  本章包含以下各节:

  

  创建和销毁 ZFS 文件系统

  

  ZFS 属性介绍

  

  查询 ZFS 文件系统信息

  

  管理 ZFS 属性

  

  挂载和共享 ZFS 文件系统

  

  ZFS 配额和预留空间

  

  保存和恢复 ZFS 数据

创建和销毁 ZFS 文件系统

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

  

  创建 ZFS 文件系统

  

  销毁 ZFS 文件系统

  

  重命名 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 中。

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

  在以下示例中,指定并为 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

  注意 –

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

重命名 ZFS 文件系统

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

  

  更改文件系统的名称

  

  将文件系统重定位到 ZFS 分层结构中的新位置。

  

  更改文件系统的名称并在 ZFS 分层结构中对其重定位

  以下示例使用 rename 子命令对文件系统进行简单重命名:

  

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

  本示例将 kustarz 文件系统重命名为 kustarz_old。

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

  

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

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

  重命名操作会尝试对文件系统以及任何后代文件系统顺序执行取消挂载/重新挂载。如果该操作无法取消挂载活动文件系统,则重命名将失败。如果出现这一问题,将需要强制取消挂载文件系统。

ZFS 属性介绍

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

  

  ZFS 只读本机属性

  

  可设置的 ZFS 本机属性

  

  ZFS 用户属性

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

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

  所有可继承属性都有一个关联源。源用于指明获取属性的方法。属性的源可具有以下值:

local

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

inherited from dataset-name

  值为 inherited from dataset-name 表示属性是从指定的祖先继承的。

default

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

  下表介绍了只读的和可设置的本机 ZFS 文件系统属性。只读本机属性在表中注明为“只读属性。此表中列出的所有其他本机属性均为可设置的属性。

表 5–1 ZFS 本机属性说明

  属性名

  类型

  缺省值

  说明

  aclinherit

  字符串

  secure

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

  aclmode

  字符串

  groupmask

  控制在 chmod 操作过程中修改 ACL 项的方法。该属性的值包括 discard、groupmask 和 passthrough。

  atime

  布尔值

  on

  控制文件被读取后是否更新该文件的访问时间。禁用该属性可避免在读取文件时产生写入流量,因此可显著提高性能,但可能会使邮件程序与其他相似的实用程序感到困惑。

  available

  数字

  N/A

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

  该属性也可通过其简短列名 avail 来引用。

  canmount

  布尔值

  on

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

  checksum

  字符串

  on

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

  compression

  字符串

  off

  控制用于此数据集的压缩算法。目前,可以选择 lzjb、gzip 或 gzip-N。在包含现有数据的文件系统中启用压缩将只压缩新数据。现有数据保持未压缩状态。

  该属性也可通过其简短列名 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,或者该文件系统和子级在属性发生更改之前处于挂载状态,则会自动在新位置重新挂载它们。此外,任何共享文件系统都将取消共享,并在新位置进行共享。

  origin

  字符串

  N/A

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

  非克隆的文件系统其 origin 为 none。

  quota

  数字(或 none)

  none

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

  readonly

  布尔值

  off

  控制是否可以修改此数据集。设置为 on 时,无法对数据集进行任何修改。

  该属性也可通过其简短列名 rdonly 来引用。

  recordsize

  数字

  128K

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

  该属性也可通过其简短列名 recsize 来引用。

  referenced

  数字

  N/A

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

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

  该属性也可通过其简短列名 refer 来引用。

  reservation

  数字(或 none)

  none

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

  该属性也可通过其简短列名 reserv 来引用。

  setuid

  布尔值

  on

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

  sharenfs

  字符串

  off

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

  snapdir

  字符串

  hidden

  控制 .zfs 目录在文件系统根目录中是隐藏还是可见。

  type

  字符串

  N/A

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

  used

  数字

  N/A

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

  volsize

  数字

  N/A

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

  volblocksize

  数字

  8 KB

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

  该属性也可通过其简短列名 volblock 来引用。

  zoned

  布尔值

  N/A

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

  xattr

  布尔值

  on

  指示对此文件系统启用还是禁用扩展属性。缺省值为 on。

ZFS 只读本机属性

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

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

  

  available

  

  creation

  

  mounted

  

  origin

  

  compressratio

  

  referenced

  

  type

  

  used

used 属性

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

  创建快照时,其空间最初在快照与文件系统之间进行共享,还可能是与以前的快照进行共享。随着文件系统的变化,以前共享的空间将供快照专用,并会计算在快照的使用空间内。此外,删除快照可增加其他快照专用(和使用)的空间量。

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

可设置的 ZFS 本机属性

  可设置的本机属性是其值可同时进行检索和设置的属性。

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

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

  

  aclinherit

  

  aclmode

  

  atime

  

  canmount

  

  checksum

  

  compression

  

  copies

  

  devices

  

  exec

  

  mountpoint

  

  quota

  

  readonly

  

  recordsize

  

  reservation

  

  sharenfs

  

  setuid

  

  snapdir

  

  volsize

  

  volblocksize

  

  zoned

canmount 属性

  如果该属性设置为 off,则不能使用 zfs mount 或 zfs mount -a 命令挂载文件系统。该属性与将 mountpoint 属性设置为 none 的效果相似,区别在于数据集仍有一个可继承的正常 mountpoint 属性。例如,可将该属性设置为 off,为后代文件系统建立可继承属性,但文件系统本身永远不会挂载,也无法供用户访问。在这种情况下,该属性设置为 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 list -r userpool
NAME       USED AVAIL REFER MOUNTPOINT
userpool     140K 8.24G 24.5K /export/home
userpool/user1 24.5K 8.24G 24.5K /export/home/user1
userpool/user2 24.5K 8.24G 24.5K /export/home/user2

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." 开头的属性名保留供 Sun Microsystems 使用。

  用户属性的值具有以下特征:

  

  是始终继承且从不进行验证的任意字符串。

  

  用户属性值最多可以包含 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 文件系统信息

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

列出基本 ZFS 信息

  通过使用不带任何选项的 zfs list 命令可以列出基本数据集信息。此命令可显示系统中所有数据集的名称,包括其 used、available、referenced 和 mountpoint 属性。

  例如:

  

# 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 查询

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

  通过使用 -o 选项以及所需属性的逗号分隔列表可以自定义属性值输出。可将任何数据集属性作为有效值提供。除了其中定义的属性外,-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 选项指定要显示的数据集的类型。下表中介绍了有效的类型。

表 5–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 选项,所有空格都以制表符形式输出。当需要可解析的输出(例如编写脚本时),此选项可能很有用。以下示例显示了使用带有 -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 属性

  

  查询 ZFS 属性

设置 ZFS 属性

  可以使用 zfs set 命令修改任何可设置的数据集属性。或者,也可以使用 zfs create 命令在创建数据集时设置属性。zfs set 命令采用 property=value 格式的属性/值序列和数据集名称。

  以下示例将 tank/home 的 atime 属性设置为 off。在每个 zfs set 调用过程中,只能设置或修改一个属性。

  

# 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 属性

  除非已对属性子级显式设置了配额或预留空间,否则除了配额和预留空间外,所有可设置的属性都从父级继承各自的值。如果没有祖先为继承的属性设置显式值,则使用该属性的缺省值。可以使用 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 属性

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

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

  

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

  第四列 SOURCE 指明所设置的该属性值的源。下表定义了可能的源值的含义。

表 5–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
NAME PROPERTY    VALUE         SOURCE
tank type      filesystem       -
tank creation    Thu Feb 21 14:14 2008 -
tank used      88K          -
tank available   49.5G         -
tank referenced   24.5K         -
tank compressratio 1.00x         -
tank mounted    yes          -
tank quota     none          default
tank reservation  none          default
tank recordsize   128K          default
tank mountpoint   /tank         default
tank sharenfs    off          default
tank checksum    on           default
tank compression  off          default
tank atime     on           default
tank devices    on           default
tank exec      on           default
tank setuid     on           default
tank readonly    off          default
tank zoned     off          default
tank snapdir    hidden         default
tank aclmode    groupmask       default
tank aclinherit   secure         default
tank canmount    on           default
tank shareiscsi   off          default
tank xattr     on           default

  通过 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 属性

  zfs get 命令支持为编写脚本而设计的 -H 和 -o 选项。-H 选项指明应忽略所有标题信息,并且所有空格都显示为制表符形式。使用一致的空格可使数据便于分析。您可以使用 -o 选项自定义输出。通过此选项可获取要输出的值的逗号分隔列表。-o 列表中可提供ZFS 属性介绍中定义的所有属性,以及字符 name、value、property 和 source。

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

  

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

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

  

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

  可以结合使用 -r 选项与以上任何选项,以递归方式为所有后代检索请求值。以下示例使用 -r、-o 和 -H 选项为 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 文件系统

  

  使用临时挂载属性

  

  取消挂载 ZFS 文件系统

  

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

管理 ZFS 挂载点

  缺省情况下,所有 ZFS 文件系统都由 ZFS 通过使用 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 属性可用来确定某一文件系统是否可以挂载。

  如果需要,还可以使用 zfs set 将 mountpoint 属性设置为 legacy,从而通过传统挂载接口来显式管理文件系统。这样做可以防止 ZFS 自动挂载和管理此文件系统。不过必须改用包括 mount 和 umount 命令在内的传统工具以及 /etc/vfstab 文件。

  更改挂载点管理策略时,会应用以下行为:

  

  自动挂载点行为

  

  传统挂载点行为

自动挂载点

  

  从 legacy 或 none 进行更改时,ZFS 将自动挂载文件系统。

  

  如果 ZFS 当前正在管理文件系统,但该文件系统当前已取消挂载,并且 mountpoint 属性已更改,则文件系统将保持取消挂载状态。

  另外,也可以在创建时使用 zpool create 的 -m 选项设置根数据集的缺省安装点。

  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 文件中创建相应的项来挂载这些文件系统。否则,system/filesystem/local 服务在系统引导时将进入维护模式。

  要在引导时自动挂载传统文件系统,必须向 /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

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

属性

  挂载选项

devices

  devices/nodevices

exec

  exec/noexec

readonly

  ro/rw

setuid

  setuid/nosetuid

  挂载选项 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 文件系统

  通过使用 zfs unmount 子命令可以取消挂载文件系统。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 文件系统

  与挂载点相似,ZFS 可以通过使用 sharenfs 属性来自动共享文件系统。如果使用此方法,则不必在添加新文件系统时修改 /etc/dfs/dfstab 文件。sharenfs 属性是要传递给 share 命令的选项的逗号分隔列表。特殊值 on 是缺省的共享选项的别名,这些选项是所有用户的 read/write 权限。特殊值 off 指明文件系统不是由 ZFS 进行管理,但可通过传统方法(如 /etc/dfs/dfstab 文件)来共享。在引导过程中将共享 sharenfs 属性不是 off 的所有文件系统。

控制共享语义

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

  

# zfs set sharenfs=on tank/home/eschrock

  该属性是继承的,如果文件系统继承的属性不为 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 配额和预留空间

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

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

  有关更多信息,请参见下面的示例。

设置 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 配额还会影响 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

设置 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  5.00G           local

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

  

# 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

  请注意,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

标签: