免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1430 | 回复: 0
打印 上一主题 下一主题

第 5 章 管理 ZFS 文件系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-21 12:04 |只看该作者 |倒序浏览

第 5 章 管理 ZFS 文件系统
本章提供有关管理 SolarisTM ZFS 文件系统的详细信息。本章包括分层文件系统布局、属性继承和自动挂载点管理以及共享交互等概念。
ZFS 文件系统是在存储池顶层生成的轻量 POSIX 文件系统。文件系统可以动态创建和销毁,而不需要分配或格式化任何基础空间。由于文件系统是轻量型的,并且是 ZFS 中的管理中心点,因此可能要创建许多文件系统。
使用 zfs 命令可以管理 ZFS 文件系统。zfs 命令提供了一组用于对文件系统执行特定操作的子命令。本章详细介绍了这些子命令。使用此命令还可以管理快照、卷和克隆,但本章仅对这些功能进行了简短介绍。有关快照和克隆的详细信息,请参见
第 6 章,使用 ZFS 快照和克隆
。有关仿真卷的详细信息,请参见
仿真卷

注 –
术语数据集在本章中用作通称,表示文件系统、快照、克隆或卷。
本章包含以下各节:

创建和销毁 ZFS 文件系统
可以使用 zfs create 和 zfs destroy 命令来创建和销毁 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)

销毁 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 选项时不会出现确认提示,因此请谨慎使用这些选项。
有关快照和克隆的更多信息,请参见
第 6 章,使用 ZFS 快照和克隆

重命名 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 属性
属性是用来对文件系统、卷、快照和克隆的行为进行控制的主要机制。除非另行说明,否则本节中定义的属性适用于所有数据集类型。
属性可以是只读统计信息或可设置的属性。大多数可设置的属性也是可继承的。可继承属性是这样的属性:如果为父级设置该属性,则该属性会向下传播给其所有后代。
所有可继承属性都有一个关联源。源用于指明获取属性的方法。属性的源可具有以下值:
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。有关这些值的说明,请参见
ACL 属性模式

atime
布尔值
on
控制文件被读取后是否更新该文件的访问时间。禁用该属性可避免在读取文件时产生写入流量,因此可显著提高性能,但可能会使邮件程序与其他相似的实用程序感到困惑。
available
数字
N/A
只读属性,用于确定可供数据集及其所有子级使用的空间量,假定池中没有其他活动。由于池中会共享空间,因此可用空间会受到多种因素的限制,包括物理池大小、配额、预留空间或池中的其他数据集。
该属性也可通过其简短列名 avail 来引用。
有关空间记帐的更多信息,请参见
ZFS 空间记帐

checksum
字符串
on
控制用于验证数据完整性的校验和。缺省值为 on,这将自动选择合适的算法,当前算法为 fletcher2。该属性的值包括 on、off、fletcher2、fletcher4 和 sha256。值为 off 将禁用对用户数据的完整性检查。建议不要使用值 off。
compression
字符串
off
控制用于此数据集的压缩算法。当前仅存在一种算法 lzjb。
该属性也可通过其简短列名 compress 来引用。
compressratio
数字
N/A
只读属性,用于标识针对此数据集实现的压缩比例,表示为乘数。通过运行 zfs set compression=on dataset 可以启用压缩。
根据所有文件的逻辑大小和引用的物理数据量进行计算。包括通过使用 compression 属性显式保存的数据量。
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 挂载点

origin
字符串
N/A
克隆的文件系统或卷的只读属性,用于标识创建克隆所在的快照。只要克隆存在,便不能销毁克隆源(即使使用 -r-f 选项也是如此)。
非克隆的文件系统没有起始点。
quota
数字(或 none)
none
限制数据集及其后代可占用的空间量。该属性可对使用的空间量强制实施硬限制,包括后代(包括文件系统和快照)占用的所有空间。对已有配额的数据集的后代设置配额不会覆盖祖先的配额,而是会强加额外的限制。不能对卷设置配额,因为 volsize 属性可用作隐式配额。
有关设置配额的信息,请参见
设置 ZFS 文件系统的配额

readonly
布尔值
off
控制是否可以修改此数据集。设置为 on 时,无法对数据集进行任何修改。
该属性也可通过其简短列名 rdonly 来引用。
recordsize
数字
128K
为文件系统中的文件指定建议的块大小。
该属性也可通过其简短列名 recsize 来引用。有关详细说明,请参见
recordsize 属性

referenced
数字
N/A
只读属性,用于标识此数据集可访问的数据量,这些数据可能会也可能不会与池中的其他数据集共享。
创建快照或克隆时,首先会引用与创建该属性时所在的文件系统或快照相同的空间量,因为其内容相同。
该属性也可通过其简短列名 refer 来引用。
reservation
数字(或 none)
none
为数据集及其后代预留的最小空间量。如果使用的空间量低于该值,则认为数据集正在使用其预留空间指定的空间量。父数据集的使用空间中会包含预留空间,并会针对父数据集的配额和预留空间对其进行计数。
该属性也可通过其简短列名 reserv 来引用。
有关更多信息,请参见
设置 ZFS 文件系统的预留空间

sharenfs
字符串
off
控制文件系统是否可用于 NFS 中以及使用的选项。 如果设置为 on,则会调用不带任何选项的 zfs share 命令。 否则,将调用带有与该属性的内容等效的选项的 zfs share 命令。 如果设置为 off,则使用传统的 share 和 unshare 命令以及 dfstab 文件来管理文件系统。
有关共享 ZFS 文件系统的更多信息,请参见
共享 ZFS 文件系统

setuid
布尔值
on
控制文件系统中是否会标记 setuid 位。
snapdir
字符串
hidden
控制 .zfs 目录在文件系统根目录中是隐藏还是可见。有关使用快照的更多信息,请参见
ZFS 快照

type
字符串
N/A
只读属性,用于将数据集类型标识为 filesystem(文件系统或克隆)、volume 或 snapshot。
used
数字
N/A
只读属性,用于标识数据集及其所有后代占用的空间量。
有关详细说明,请参见
used 属性

volsize
数字
N/A
可为卷指定卷的逻辑大小。
有关详细说明,请参见
volsize 属性

volblocksize
数字
8 KB
可为卷指定卷的块大小。一旦写入卷后,块大小便不能更改,因此应在创建卷时设置块大小。卷的缺省块大小为 8 KB。范围位于 512 字节到 128 KB 之间的 2 的任意次幂都有效。
该属性也可通过其简短列名 volblock 来引用。
zoned
布尔值
N/A
指明是否已将此数据集添加至非全局区域。如果设置该属性,全局区域中将不会标记挂载点,因此 ZFS 在收到请求时不能挂载此类文件系统。首次安装区域时,会为添加的所有文件系统设置该属性。
有关将 ZFS 用于已安装的区域的更多信息,请参见
在安装了区域的 Solaris 系统中使用 ZFS

只读的 ZFS 属性
只读属性是可以检索但不能设置的属性。只读属性不可继承。部分属性特定于特殊类型的数据集。在这类情况下,说明部分会对特殊数据集类型进行注释。
以下列出了只读属性,
表 5–1
对其进行了说明。


  • available

  • creation

  • mounted

  • origin

  • compressratio

  • referenced

  • type

  • used
    有关详细信息,请参见
    used 属性


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

used 属性
此数据集及其所有后代占用的空间量。可根据该数据集的配额和预留空间来检查该值。使用的空间不包括数据集的预留空间,但会考虑任何后代数据集的预留空间。数据集占用其父级的空间量以及以递归方式销毁该数据集时所释放的空间量应为其使用空间和预留空间的较大者。
创建快照时,其空间最初在快照与文件系统之间进行共享,还可能是与以前的快照进行共享。随着文件系统的变化,以前共享的空间将供快照专用,并会计算在快照的使用空间内。此外,删除快照可增加其他快照专用(和使用)的空间量。有关快照和空间问题的更多信息,请参见
空间不足行为

使用的空间量、可用的空间量或引用的空间量不会考虑暂挂更改。通常,暂挂更改仅占用几秒钟的时间。使用 fsync(3c) 或 O_SYNC 对磁盘进行更改不一定可以保证空间使用信息会立即更新。
可设置的 ZFS 属性
可设置的属性是其值可同时进行检索和设置的属性。使用 zfs set 命令可以设置可设置属性,如
设置 ZFS 属性
中所述。除了配额和预留空间外,可设置的属性均可继承。有关配额和预留空间的更多信息,请参见
ZFS 配额和预留空间

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


  • aclinherit
    有关详细说明,请参见
    ACL 属性模式


  • aclmode
    有关详细说明,请参见
    ACL 属性模式


  • atime

  • checksum

  • compression

  • devices

  • exec

  • mountpoint

  • quota

  • readonly

  • recordsize
    有关详细说明,请参见
    recordsize 属性


  • reservation

  • sharenfs

  • setuid

  • snapdir

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


  • volblocksize

  • zoned

recordsize 属性
为文件系统中的文件指定建议的块大小。
该属性专门设计用于对大小固定的记录中的文件进行访问的数据库工作负荷。ZFS 会根据为典型的访问模式优化的内部算法来自动调整块大小。对于创建很大的文件但访问较小的随机块中的文件的数据库而言,这些算法可能不是最优的。将 recordsize 指定为大于或等于数据库的记录大小的值可以显著提高性能。强烈建议不要将该属性用于一般用途的文件系统,否则可能会对性能产生不利影响。指定的大小必须是 2 的若干次幂,并且必须大于或等于 512 字节同时小于或等于 128 KB。更改文件系统的 recordsize 仅影响之后创建的文件。现有文件不会受到影响。
该属性也可通过其简短列名 recsize 来引用。
volsize 属性
卷的逻辑大小。缺省情况下,创建卷会产生相同大小的预留空间。对 volsize 的任何更改都会反映为对预留空间的等效更改。这些检查用来防止用户产生的意外行为。如果卷包含的空间比其声明可用的空间少,则会导致未定义的行为或数据损坏,具体取决于卷的使用方法。如果在卷的使用过程中更改卷大小,特别是在收缩大小时,也会出现上述影响。 调整卷大小时,需要格外小心。
尽管并不建议,但可以通过为 zfs create -V 指定 -s 标志或通过在创建卷后即更改预留空间来创建稀疏卷。稀疏卷的定义是预留空间与卷大小不相等的卷。对于稀疏卷,预留空间中不会反映对 volsize 的更改。
有关使用卷的更多信息,请参见
仿真卷

查询 ZFS 文件系统信息
zfs list 命令提供了一种用于查看和查询数据集信息的可扩展机制。本节中对基本查询和复杂查询都进行了说明。
列出基本 ZFS 信息
通过使用不带任何选项的 zfs list 命令可以列出基本数据集信息。此命令可显示系统中所有数据集的名称,包括其 used、available、referenced 和 mountpoint 属性。有关这些属性的更多信息,请参见
ZFS 属性

例如:
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
pool                  84.0K  33.5G      -  /pool
pool/clone                0  33.5G  8.50K  /pool/clone
pool/test                8K  33.5G     8K  /test
pool/home             17.5K  33.5G  9.00K  /pool/home
pool/home/marks       8.50K  33.5G  8.50K  /pool/home/marks
pool/home/marks@snap      0      -  8.50K  /pool/home/marks@snap
另外,还可使用此命令通过在命令行中提供数据集名称来显示特定数据集。此外,使用 -r 选项可以递归方式显示该数据集的所有后代。
以下示例说明如何显示 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-f-H 选项可对 zfs list 输出进行自定义。
通过使用 -o 选项以及所需属性的逗号分隔列表可以自定义属性值输出。可将任何数据集属性作为有效值提供。 有关所有受支持的数据集属性的列表,请参见
ZFS 属性
。除了其中定义的属性外,-o 选项列表还可以包含字符 name,以指明输出应包括数据集的名称。
以下示例使用 zfs list 来显示数据集名称以及 sharenfs 和 mountpoint 属性。
# zfs list -o name,sharenfs,mountpoint
NAME                  SHARENFS         MOUNTPOINT
tank                  rw               /export
tank/archives         rw               /export/archives
tank/archives/zfs     rw               /export/archives/zfs
tank/calendar         off              /var/spool/calendar
tank/cores            rw               /cores
tank/dumps            rw               /export/dumps
tank/home             rw               /export/home
tank/home/ahl         rw               /export/home/ahl
tank/home/ahrens      rw               /export/home/ahrens
tank/home/andrei      rw               /export/home/andrei
tank/home/barts       rw               /export/home/barts
tank/home/billm       rw               /export/home/billm
tank/home/bjw         rw               /export/home/bjw
tank/home/bmc         rw               /export/home/bmc
tank/home/bonwick     rw               /export/home/bonwick
tank/home/brent       rw               /export/home/brent
tank/home/dilpreet    rw               /export/home/dilpreet
tank/home/dp          rw               /export/home/dp
tank/home/eschrock    rw               /export/home/eschrock
tank/home/fredz       rw               /export/home/fredz
tank/home/johansen    rw               /export/home/johansen
tank/home/jwadams     rw               /export/home/jwadams
tank/home/lling       rw               /export/home/lling
tank/home/mws         rw               /export/home/mws
tank/home/rab         rw               /export/home/rab
tank/home/sch         rw               /export/home/sch
tank/home/tabriz      rw               /export/home/tabriz
tank/home/tomee       rw               /export/home/tomee
可以使用 -t 选项指定要显示的数据集的类型。下表中介绍了有效的类型。
表 5–2 ZFS 数据集的类型

类型
说明
filesystem
文件系统和克隆
volume

snapshot
快照
-t 选项可后跟要显示的数据集类型的逗号分隔列表。以下示例同时使用 -t-o 选项来显示所有文件系统的名称和 used 属性:
# zfs list -t filesystem -o name,used
NAME                  USED
pool                  105K
pool/container        0
pool/home             26.0K
pool/home/tabriz      26.0K
pool/home/tabriz_clone  0
使用 -H 选项可从生成的输出中省略 zfs list 标题。使用 -H 选项,所有空格都以制表符形式输出。当需要可解析的输出(例如编写脚本时),此选项可能很有用。以下示例显示了使用带有 -H 选项的 zfs list 命令所生成的输出:
# zfs list -H -o name
pool
pool/container
pool/home
pool/home/tabriz
pool/home/tabriz@now
pool/home/tabriz/container
pool/home/tabriz/container/fs1
pool/home/tabriz/container/fs2
pool/home/tabriz_clone
管理 ZFS 属性
数据集属性通过 zfs 命令的 set、inherit 和 get 子命令来管理。
设置 ZFS 属性
可以使用 zfs set 命令修改任何可设置的数据集属性。 有关可设置的数据集属性的列表,请参见
可设置的 ZFS 属性
。zfs set 命令采用 property=value 格式的属性/值序列和数据集名称。
以下示例将 tank/home 的 atime 属性设置为 off。在每个 zfs set 调用过程中,只能设置或修改一个属性。
# zfs set 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                      inherited from tank/home
如果指定了 -r 选项,则会以递归方式应用 inherit 子命令。在以下示例中,该命令将使 tank/home 及其可能具有的所有后代都继承 compression 属性的值。
# zfs inherit -r compression tank/home
注 –
请注意,使用 -r 选项会清除所有后代数据集的当前属性设置。
有关 zfs 命令的更多信息,请参见
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 指明所设置的该属性值的源。下表定义了可能的源值的含义。
表 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 pool
NAME             PROPERTY       VALUE                      SOURCE
pool             type           filesystem                 -
pool             creation       Mon Mar 13 11:41 2006      -
pool             used           2.62M                      -
pool             available      33.5G                      -
pool             referenced     10.5K                      -
pool             compressratio  1.00x                      -
pool             mounted        yes                        -
pool             quota          none                       default
pool             reservation    none                       default
pool             recordsize     128K                       default
pool             mountpoint     /pool                      default
pool             sharenfs       off                        default
pool             checksum       on                         default
pool             compression    off                        default
pool             atime          on                         default
pool             devices        on                         default
pool             exec           on                         default
pool             setuid         on                         default
pool             readonly       off                        default
pool             zoned          off                        default
pool             snapdir        hidden                     default
pool             aclmode        groupmask                  default
pool             aclinherit     secure                     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(1M)

查询用于编写脚本的 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 通过使用 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,以防止挂载文件系统。
如果需要,还可以使用 zfs set 将 mountpoint 属性设置为 legacy,从而通过传统挂载界面来显式管理文件系统。这样做可以防止 ZFS 自动挂载和管理此文件系统。不过必须改用包括 mount 和 umount 命令在内的传统工具以及 /etc/vfstab 文件。有关传统挂载的更多信息,请参见
传统挂载点

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


  • 自动挂载点行为

  • 传统挂载点行为

自动挂载点


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

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

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

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
具体来说,如果已设置单独的 ZFS /usr 或 /var 文件系统,则必须指明它们是传统文件系统。此外,还必须通过在 /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 中的数据完整性以及不需要 fsck 的更多信息,请参见
事务性语义

挂载 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 mount 命令的更多信息,请参见
zfs(1M)

取消挂载 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 umount 命令的更多信息,请参见
zfs(1M)

共享 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

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26090/showart_325714.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP