Oracle Solaris ZFS 管理指南

第 1 章 Oracle Solaris ZFS 文件系统(介绍)

本章概述了 Oracle Solaris ZFS 文件系统及其功能和优点。本章还介绍了在本书所有其余部分中使用的一些基本术语。

本章包含以下各节:

ZFS 中的新增功能

本节概述了 ZFS 文件系统的新增功能。

分割镜像 ZFS 存储池 (zpool split)

Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中,可以使用 zpool split 命令分割镜像存储池,分离原镜像池中的一个或多个磁盘,创建另一个完全相同的池。

有关更多信息,请参见通过分割镜像 ZFS 存储池创建新池

新 ZFS 系统进程

Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中,每个 ZFS 存储池都有一个关联的进程 zpool-poolname 。此进程中的线程是用来处理与池相关的 I/O 任务的池 I/O 处理线程,如压缩和校验和等。此进程的作用是使各存储池的 CPU 利用情况具有可见性。使用 psprstat 命令可以查看有关这些进程的信息。这些进程仅在全局区域中可用。有关更多信息,请参见SDC(7)

zpool list 命令的变化

Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中, zpool list 输出已发生改变,可更好地提供空间分配信息。例如:


# zpool list tank
NAME    SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank    136G  55.2G  80.8G    40%  ONLINE  -

以前的 USEDAVAIL 字段已被 ALLOCFREE 所取代。

ALLOC 字段表明分配给所有数据集和内部元数据的物理空间量。FREE 字段表明池中未分配的空间量。

有关更多信息,请参见显示有关 ZFS 存储池的信息

ZFS 存储池恢复

Oracle Solaris 10 9/10 发行版:如果底层设备变得不可用,发生电源故障,或者冗余 ZFS 配置中有超过支持数量的设备发生故障,则存储池可能受损。本发行版提供了新的命令功能来恢复受损的存储池。然而,使用此恢复功能会导致存储池出现故障前发生的最后几项事务丢失。

zpool clearzpool import 命令均支持 -F 选项,可用来恢复损坏的存储池。此外,运行 zpool statuszpool clearzpool import 命令会自动报告损坏的池,这些命令会说明如何恢复池。

有关更多信息,请参见修复 ZFS 存储池范围内的损坏

ZFS 日志设备增强功能

Oracle Solaris 10 9/10 发行版:提供下列日志设备增强功能:

三奇偶校验 RAIDZ (raidz3)

Solaris 10 9/10 发行版:在本 Solaris 发行版中,冗余 RAID-Z 配置可以具有单奇偶校验、双奇偶校验或三奇偶校验,这意味着可以分别承受一个、两个或三个设备故障,而不会丢失任何数据。您可以指定 raidz3 关键字以使用三奇偶校验 RAID-Z 配置。有关更多信息,请参见创建 RAID-Z 存储池

保持 ZFS 快照

Oracle Solaris 10 9/10 发行版:如果实施不同的原子快照策略,导致旧的快照由于不再存在于发送侧而被 zfs receive 不小心销毁,则可能需要考虑使用本 Solaris 发行版中的快照保持功能。

保持快照可以防止它被销毁。此外,该功能允许使用 zfs destroy -d 命令在快照的最后一个克隆被删除前即删除该快照。

可以保持一个快照或一组快照。例如,以下语法对 tank/home/cindys/snap@1 设置一个保持标志 keep


# zfs hold keep tank/home/cindys@snap1

有关更多信息,请参见保持 ZFS 快照

ZFS 设备替换增强功能

Oracle Solaris 10 9/10 发行版:在本 Solaris 发行版中,扩展底层设备时会提供系统事件或 sysevent。ZFS 已得到增强,可以识别这些事件,并根据扩展 LUN 的新大小调整存储池,具体取决于 autoexpand 属性的设置。可以使用 autoexpand 池属性决定在收到动态 LUN 扩展事件时是否启用或禁用自动池扩展功能。

通过这些功能可扩展 LUN,由此产生的池可以访问扩展空间,而不必导出和导入池或重新引导系统。

例如,对 tank 池启用自动 LUN 扩展功能。


# zpool set autoexpand=on tank

或者,可以在启用 autoexpand 属性的情况下创建池。


# zpool create -o autoexpand=on tank c1t13d0

autoexpand 属性的缺省设置为禁用,因此您可以决定是否要扩展 LUN。

使用 zpool online - e 命令也可以扩展 LUN。例如:


# zpool online -e tank c1t6d0

或者,在附加 LUN 或利用 zpool replace 功能使其变得可用之后,可以重置 autoexpand 属性。例如,下例利用一个 8-GB 磁盘 (c0t0d0) 创建了一个池。8-GB 磁盘被一个 16-GB 磁盘 (c1t13d0) 替换,但直到启用 autoexpand 属性之后,池大小才会扩展。


# zpool create pool c0t0d0
# zpool list
NAME   SIZE   ALLOC  FREE    CAP   HEALTH  ALTROOT
pool   8.44G  76.5K  8.44G     0%  ONLINE  -
# zpool replace pool c0t0d0 c1t13d0
# zpool list
NAME   SIZE   ALLOC  FREE    CAP   HEALTH  ALTROOT
pool   8.44G  91.5K  8.44G     0%  ONLINE  -
# zpool set autoexpand=on pool
# zpool list
NAME   SIZE   ALLOC  FREE    CAP   HEALTH  ALTROOT
pool   16.8G   91.5K  16.8G    0%  ONLINE  -

在不启用 autoexpand 属性的情况下扩展上例中的 LUN 的另一种方法是使用 zpool online - e 命令,即使该设备已经联机。例如:


# zpool create tank c0t0d0
# zpool list tank
NAME   SIZE   ALLOC  FREE    CAP   HEALTH  ALTROOT
tank   8.44G  76.5K  8.44G     0%  ONLINE  -
# zpool replace tank c0t0d0 c1t13d0
# zpool list tank
NAME   SIZE   ALLOC  FREE    CAP   HEALTH  ALTROOT
tank   8.44G  91.5K  8.44G     0%  ONLINE  -
# zpool online -e tank c1t13d0
# zpool list tank
NAME   SIZE   ALLOC  FREE    CAP   HEALTH  ALTROOT
tank   16.8G    90K  16.8G     0%  ONLINE  -

本发行版的其它设备替换增强功能包括:

有关替换设备的更多信息,请参见替换存储池中的设备

ZFS 和 Flash 安装支持

Solaris 10 10/09 发行版:在此 Solaris 发行版中,您可以设置 JumpStart 配置文件以标识 ZFS 根池的 Flash 归档文件。有关更多信息,请参见安装 ZFS 根文件系统(Oracle Solaris Flash 归档文件安装)

ZFS 用户和组配额

Solaris 10 10/09 发行版:在先前的 Solaris 发行版中,您可以将配额和预留空间应用于 ZFS 文件系统,以管理和预留磁盘空间。

在此 Solaris 发行版中,您可以根据属于特定用户或组的文件所占用的磁盘空间量来设置配额。您可以考虑在拥有大量用户或组的环境中设置用户和组配额。

可以使用 zfs userquota 属性设置用户配额。要设置组配额,请使用 zfs groupquota 属性。例如:


# zfs set userquota@user1=5G tank/data
# zfs set groupquota@staff=10G tank/staff/admins

您可以显示用户或组的当前配额设置,如下所示:


# zfs get userquota@user1 tank/data
NAME       PROPERTY         VALUE            SOURCE
tank/data  userquota@user1  5G               local
# zfs get groupquota@staff tank/staff/admins
NAME               PROPERTY          VALUE             SOURCE
tank/staff/admins  groupquota@staff  10G               local

按以下方式显示常规配额信息:


# zfs userspace tank/data
TYPE        NAME   USED  QUOTA  
POSIX User  root     3K   none  
POSIX User  user1     0    5G  

# zfs groupspace tank/staff/admins
TYPE         NAME   USED  QUOTA  
POSIX Group  root     3K   none  
POSIX Group  staff     0    10G  

您可以查看 userused@user 属性,以显示个别用户的磁盘空间使用情况。使用 groupused@ group 属性可以查看组的磁盘空间使用情况。例如:


# zfs get userused@user1 tank/staff
NAME        PROPERTY        VALUE           SOURCE
tank/staff  userused@user1  213M            local
# zfs get groupused@staff tank/staff
NAME        PROPERTY         VALUE            SOURCE
tank/staff  groupused@staff  213M             local

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

针对执行权限的 ZFS ACL Passthrough 继承

Solaris 10 10/09 发行版:在先前的 Solaris 发行版中,您可以应用 ACL 继承,以便使用 06640666 权限创建所有文件。在此发行版中,如果要将文件创建模式中的执行位选择性包括在继承的 ACL 中,您可以设置 aclinherit 模式以将执行权限传递给继承的 ACL。

如果在 ZFS 数据集上启用了 aclinherit=passthrough-x,则可以为从 ccgcc 编译器工具生成的输出文件添加执行权限。如果继承的 ACL 不包括执行权限,则只有使用 chmod 命令更改文件的权限后才能执行由编译器生成的可执行输出。

有关更多信息,请参见示例 8–12

ZFS 属性增强功能

Solaris 10 10/09 和 Oracle Solaris 10 9/10:在这些发行版中添加了以下 ZFS 文件系统增强功能。

ZFS 日志设备恢复

Solaris 10 10/09 发行版:在此发行版中,ZFS 使用 zpool status 命令确定意图日志故障。故障管理架构 (Fault Management Architecture, FMA) 也会报告这些错误。ZFS 和 FMA 都介绍如何从意图日志 (intent log) 故障中恢复。

例如,如果系统在将同步写操作提交给具有单独日志设备的池之前突然关闭,您将会看到类似以下内容的信息:


# zpool status -x
  pool: pool
 state: FAULTED
status: One or more of the intent logs could not be read.
        Waiting for adminstrator intervention to fix the faulted pool.
action: Either restore the affected device(s) and run 'zpool online',
        or ignore the intent log records by running 'zpool clear'.
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool        FAULTED      0     0     0 bad intent log
          mirror    ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
        logs        FAULTED      0     0     0 bad intent log
          c0t5d0    UNAVAIL      0     0     0 cannot open

您可以通过以下方式解决日志设备故障:

要从此错误中恢复而不更换故障日志设备,可以使用 zpool clear 命令清除该错误。在这种情况下,池将在降级模式下运行,并且日志记录将被写入到主池,直到更换单独的日志设备。

请考虑使用镜像日志设备来避免日志设备故障情形。

在 ZFS 存储池中使用高速缓存设备

Solaris 10 10/09 发行版:在此发行版中,当您创建池时,您可以指定高速缓存设备,以用于缓存存储池数据。

高速缓存设备在主内存和磁盘之间提供了一个进行高速缓存的附加层。使用高速缓存设备,可以最大程度地提高大多数静态内容的随机读取工作的性能。

创建池时,可以指定一个或多个高速缓存设备。例如:


# zpool create pool mirror c0t2d0 c0t4d0 cache c0t0d0
# zpool status pool
  pool: pool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
        cache
          c0t0d0    ONLINE       0     0     0

errors: No known data errors

添加高速缓存设备之后,这些设备中将逐渐填充来自主内存的内容。填充设备可能需要一个小时以上的时间,具体取决于高速缓存设备的大小。可以通过按以下方式使用 zpool iostat 命令来监视容量和读取操作:


# zpool iostat -v pool 5

创建池后,可以在池中添加高速缓存设备或从池中删除高速缓存设备。

有关更多信息,请参见使用高速缓存设备创建 ZFS 存储池示例 4–4

ZFS 环境中的区域迁移

Solaris 10 5/09 发行版:此发行版扩展了使用 Oracle Solaris Live Upgrade 在 ZFS 环境中迁移区域的支持。有关更多信息,请参见使用 Oracle Solaris Live Upgrade 迁移或升级具有区域的系统(最低Solaris 10 5/09)

有关此发行版的已知问题列表,请参见《Solaris 5 10/09 发行说明》。

ZFS 安装和引导支持

Solaris 10 10/08 发行版:此发行版提供了安装并引导 ZFS 根文件系统的功能。您可以使用初始安装选项或 JumpStart 功能来安装 ZFS 根文件系统。或者,可以使用 Oracle Solaris Live Upgrade 功能将 UFS 根文件系统迁移到 ZFS 根文件系统。此外,还提供了对交换和转储设备的 ZFS 支持。有关更多信息,请参见第 5 章

有关此发行版的已知问题列表,请转至以下网站:

http://hub.opensolaris.org/bin/view/Community+Group+zfs/boot

另请参见 Solaris 10 10/08 发行说明。

在不取消挂载的情况下回滚数据集

Solaris 10 10/08 发行版:此发行版提供了无需事先取消挂载数据集便可进行回滚的功能。因此,不再需要使用 zfs rollback -f 选项来强制进行卸载操作。-f 选项不再受支持且将被忽略(如果指定)。

zfs send 命令的增强

Solaris 10 10/08 发行版:此发行版包括对 zfs send 命令的以下增强。现在您可以使用此命令执行以下任务:

有关更多信息,请参见发送和接收复杂的 ZFS 快照流

仅限于文件系统数据的 ZFS 配额和预留空间

Solaris 10 10/08 发行版:除了现有的 ZFS 配额和预留空间功能以外,此发行版还在磁盘空间记帐中包括不包含后代(如快照和克隆)的数据集配额和预留空间。

例如,您可以为 studentA 设置一个 10 GB 的 refquota 限制,即设置一个 10 GB 的引用磁盘空间硬限制。为增加灵活性,可以设置一个允许您管理 studentA 的快照的 20 GB 配额。


# zfs set refquota=10g tank/studentA
# zfs set quota=20g tank/studentA

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

ZFS 存储池属性

Solaris 10 10/08 发行版:ZFS 存储池属性是在早期发行版中引入的。本发行版提供两个属性:cachefilefailmode

下面说明本发行版提供的新存储池属性:

ZFS 命令历史记录增强 (zpool history)

Solaris 10 10/08 发行版zpool history 命令已得到增强,可以提供以下新增功能:

有关使用 zpool history 命令的更多信息,请参见解决 ZFS 问题

升级 ZFS 文集系统 (zfs upgrade)

Solaris 10 10/08 发行版zfs upgrade 命令包括在此发行版中,用于提供对现有文件系统的未来 ZFS 文件系统增强。ZFS 存储池具有类似的升级功能,可为现有存储池提供池增强功能。

例如:


# zfs upgrade
This system is currently running ZFS filesystem version 3.

All filesystems are formatted with the current version.

注 –

对于已升级的文件系统和通过 zfs send 命令从这些已升级文件系统创建的所有流,无法在运行较早软件发行版的系统上进行访问。


ZFS 委托管理

Solaris 10 10/08 发行版:在此发行版中,您可以授予更为细化的权限,以允许非特权用户执行 ZFS 管理任务。

您可以使用 zfs allowzfs unallow 命令来委托和删除权限。

您可以使用池的 delegation 属性修改委托管理功能。例如:


# zpool get delegation users
NAME  PROPERTY    VALUE       SOURCE
users  delegation  on          default
# zpool set delegation=off users
# zpool get delegation users
NAME  PROPERTY    VALUE       SOURCE
users  delegation  off         local

缺省情况下,delegation 属性处于启用状态。

有关更多信息,请参见第 9 章zfs(1M)

设置单独的 ZFS 日志设备

Solaris 10 10/08 发行版:为了满足同步事务的 POSIX 要求,提供了 ZFS 意图日志 (ZFS intent log, ZIL)。例如,数据库通常要求其事务在从系统调用中返回时应该在稳定的存储设备上。NFS 和其他应用程序也可以使用 fsync() 来确保数据的稳定性。缺省情况下,ZIL 是通过主存储池中的块分配的。在此 Solaris 发行版中,您可以决定是否要继续从主存储池或从单独的日志设备中分配 ZIL 块。通过在 ZFS 存储池中使用单独的意图日志设备(如使用 NVRAM 或专用磁盘)可能会获得更佳的性能。

ZFS 意图日志的日志设备与数据库日志文件无关。

创建存储池时或创建存储池以后,您可以设置 ZFS 日志设备。有关设置日志设备的示例,请参见使用日志设备创建 ZFS 存储池向存储池中添加设备

可以将日志设备附加到现有日志设备,以创建镜像日志设备。此操作等同于在未镜像的存储池中附加设备。

确定设置 ZFS 日志设备是否适合您的环境时,请考虑以下几点:

创建中间 ZFS 数据集

Solaris 10 10/08 发行版:您可以在 -zfs createzfs clonezfs rename 命令中使用 p 选项快速创建不存在的中间数据集(如果尚不存在)。

在以下示例中,ZFS 数据集 (users/area51) 在 datab 存储池中创建。


# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
datab                       106K  16.5G    18K  /datab
# zfs create -p -o compression=on datab/users/area51

如果中间数据集在创建操作过程中已经存在,该操作会成功完成。

指定的属性应用到目标数据集,而不是中间数据集。例如:


# zfs get mountpoint,compression datab/users/area51
NAME                PROPERTY     VALUE                SOURCE
datab/users/area51  mountpoint   /datab/users/area51  default
datab/users/area51  compression  on                   local

中间数据集是使用缺省挂载点创建的。所有其他属性对中间数据集都是禁用的。例如:


# zfs get mountpoint,compression datab/users
NAME         PROPERTY     VALUE         SOURCE
datab/users  mountpoint   /datab/users  default
datab/users  compression  off           default

有关更多信息,请参见 zfs(1M)

ZFS 热插拔增强功能

Solaris 10 10/08 发行版:在此发行版中,ZFS 能够更有效地响应被移除的设备,现在可以自动识别插入的设备。

有关更多信息,请参见 zpool(1M)

以递归方式重命名 ZFS 快照 (zfs rename -r)

Solaris 10 10/08 发行版:您可以使用 zfs rename -r 命令以递归方式重命名所有的后代 ZFS 快照。例如:

首先创建一组 ZFS 文件系统的快照。


# zfs snapshot -r users/home@today
# zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
users                    216K  16.5G    20K  /users
users/home                76K  16.5G    22K  /users/home
users/home@today            0      -    22K  -
users/home/markm          18K  16.5G    18K  /users/home/markm
users/home/markm@today      0      -    18K  -
users/home/marks          18K  16.5G    18K  /users/home/marks
users/home/marks@today      0      -    18K  -
users/home/neil           18K  16.5G    18K  /users/home/neil
users/home/neil@today       0      -    18K  -

然后在第二天重命名快照。


# zfs rename -r users/home@today @yesterday
# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
users                        216K  16.5G    20K  /users
users/home                    76K  16.5G    22K  /users/home
users/home@yesterday            0      -    22K  -
users/home/markm              18K  16.5G    18K  /users/home/markm
users/home/markm@yesterday      0      -    18K  -
users/home/marks              18K  16.5G    18K  /users/home/marks
users/home/marks@yesterday      0      -    18K  -
users/home/neil               18K  16.5G    18K  /users/home/neil
users/home/neil@yesterday       0      -    18K  -

快照是唯一可以递归方式重命名的数据集类型。

有关快照的更多信息,请参见ZFS 快照概述以及介绍如何创建滚动快照的以下博客条目:

http://blogs.sun.com/mmusante/entry/rolling_snapshots_made_easy

gzip 压缩可用于 ZFS

Solaris 10 10/08 发行版:在此 Solaris 发行版中,除了 lzjb 压缩以外,还可以对 ZFS 文件系统设置 gzip 压缩。可以将压缩指定为 gzipgzip-N,其中 N 的范围是 1 至 9。例如:


# zfs create -o compression=gzip users/home/snapshots
# zfs get compression users/home/snapshots
NAME                  PROPERTY     VALUE            SOURCE
users/home/snapshots  compression  gzip             local
# zfs create -o compression=gzip-9 users/home/oldfiles
# zfs get compression users/home/oldfiles
NAME                  PROPERTY     VALUE           SOURCE
users/home/oldfiles   compression  gzip-9          local

有关设置 ZFS 属性的更多信息,请参见设置 ZFS 属性

存储 ZFS 用户数据的多个副本

Solaris 10 10/08 发行版:作为一项可靠性功能,ZFS 文件系统元数据将跨不同的磁盘多次自动存储(如有可能)。此功能称为重复块 (ditto blocks)

在此 Solaris 发行版中,可以使用 zfs set copies 命令指定用户数据的多个副本也按文件系统进行存储。例如:


# zfs set copies=2 users/home
# zfs get copies users/home
NAME        PROPERTY  VALUE       SOURCE
users/home  copies    2           local

可用的值为 1、2 或 3。缺省值为 1。除了任何池级别的冗余以外,这些副本还用于诸如镜像或 RAID-Z 之类的配置中。

存储 ZFS 用户数据的多个副本的优点如下:


注 –

根据存储池中重复块 (ditto blocks) 的分配,可能会将多个副本置于单个磁盘上。某个后续的满载磁盘故障可能会导致所有重复块 (ditto blocks) 都不可用。


无意中创建了非冗余池时以及需要设置数据保留策略时,可能会考虑使用重复块 (ditto blocks)。

有关在具有单磁盘池或多磁盘池的系统上存储多个副本可能对整体数据保护的影响程度的详细说明,请参见以下博客:

http://blogs.sun.com/relling/entry/zfs_copies_and_data_protection

有关设置 ZFS 属性的更多信息,请参见设置 ZFS 属性

改进的 zpool status 输出

Solaris 10 8/07 发行版:您可以使用 zpool status -v 命令来显示包含持久性错误的文件的列表。以前,必须使用 find -inum 命令从显示的 inode 列表中识别文件名。

有关显示包含持久性错误的文件列表的更多信息,请参见修复损坏的文件或目录

ZFS 和 Solaris iSCSI 改进

Solaris 10 8/07 发行版:在此 Solaris 发行版中,可以通过对 ZFS 卷设置 shareiscsi 属性将 ZFS 卷创建为 Solaris iSCSI 目标设备。此方法是快速设置 Solaris iSCSI 目标的便捷途径。例如:


# zfs create -V 2g tank/volumes/v2
# zfs set shareiscsi=on tank/volumes/v2
# iscsitadm list target
Target: tank/volumes/v2
    iSCSI Name: iqn.1986-03.com.sun:02:984fe301-c412-ccc1-cc80-cf9a72aa062a
    Connections: 0

创建 iSCSI 目标后,可以设置 iSCSI 启动器。有关设置 Solaris iSCSI 启动器的信息,请参见《系统管理指南:设备和文件系统》中的第 15  章 “配置 Solaris iSCSI 启动器(任务)”

有关将 ZFS 卷作为 iSCSI 目标来管理的更多信息,请参见使用 ZFS 卷作为 Solaris iSCSI 目标

ZFS 命令历史记录 (zpool history)

Solaris 10 8/07 发行版:在此 Solaris 发行版中,ZFS 会自动记录成功修改池状态信息的 zfszpool 命令。例如:


# zpool history
History for 'newpool':
2007-04-25.11:37:31 zpool create newpool mirror c0t8d0 c0t10d0
2007-04-25.11:37:46 zpool replace newpool c0t10d0 c0t9d0
2007-04-25.11:38:04 zpool attach newpool c0t9d0 c0t11d0
2007-04-25.11:38:09 zfs create newpool/user1
2007-04-25.11:38:15 zfs destroy newpool/user1

History for 'tank':
2007-04-25.11:46:28 zpool create tank mirror c1t0d0 c2t0d0 mirror c3t0d0 c4t0d0

借助此功能,您或 Oracle 技术支持人员可以准确找出为排除错误情形而执行的 ZFS 命令。

可以使用 zpool history 命令标识特定存储池。例如:


# zpool history newpool
History for 'newpool':
2007-04-25.11:37:31 zpool create newpool mirror c0t8d0 c0t10d0
2007-04-25.11:37:46 zpool replace newpool c0t10d0 c0t9d0
2007-04-25.11:38:04 zpool attach newpool c0t9d0 c0t11d0
2007-04-25.11:38:09 zfs create newpool/user1
2007-04-25.11:38:15 zfs destroy newpool/user1

在此 Solaris 发行版中,zpool history 命令不记录 user-IDhostnamezone-name。但是,从 Solaris 10 10/08 发行版开始记录此信息。有关更多信息,请参见ZFS 命令历史记录增强 (zpool history)

有关 ZFS 问题故障排除的更多信息,请参见解决 ZFS 问题

ZFS 属性改进

ZFS xattr 属性

Solaris 10 8/07 发行版:您可以使用 xattr 属性为特定的 ZFS 文件系统禁用或启用扩展属性。缺省值为 on。有关 ZFS 属性的说明,请参见ZFS 属性介绍

ZFS canmount 属性

Solaris 10 8/07 发行版:借助新的 canmount 属性,您可以指定是否可以使用 zfs mount 命令挂载数据集。有关更多信息,请参见canmount 属性

ZFS 用户属性

Solaris 10 8/07 发行版:除了可用来导出内部统计信息或控制 ZFS 文件系统行为的标准本机属性外,ZFS 还支持用户属性。用户属性对 ZFS 行为没有影响,但可通过用户环境中有意义的信息来注释数据集。

有关更多信息,请参见ZFS 用户属性

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

Solaris 10 8/07 发行版:在此 Solaris 发行版中,您可以在创建文件系统时设置属性,而不仅仅是在创建文件系统之后。

以下示例演示了等效的语法:


# zfs create tank/home
# zfs set mountpoint=/export/zfs tank/home
# zfs set sharenfs=on tank/home
# zfs set compression=on tank/home

# zfs create -o mountpoint=/export/zfs -o sharenfs=on -o compression=on tank/home

显示所有 ZFS 文件系统信息

Solaris 10 8/07 发行版:在此 Solaris 发行版中,您可以使用各种形式的 zfs get 命令来显示有关所有数据集的信息(如果未指定数据集或指定 all)。在早期发行版中,使用 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 receive -F 选项

Solaris 10 8/07 发行版:在此 Solaris 发行版中,您可以在 -zfs receive 命令中使用新的 F 选项,强制文件系统回滚到启动接收之前的最近快照。如果文件系统在回滚发生后、启动接收前发生了修改,则可能需要使用该选项。

有关更多信息,请参见接收 ZFS 快照

递归 ZFS 快照

Solaris 10 11/06 发行版:使用 zfs snapshot 命令创建文件系统快照时,可以使用 -r 选项为所有后代文件系统递归创建快照。此外,销毁快照时,可以使用 -r 选项以递归方式销毁所有后代快照。

递归 ZFS 快照可作为一个原子操作快速创建。要么一起创建快照(一次创建所有快照),要么不创建任何快照。这种操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。

有关更多信息,请参见创建和销毁 ZFS 快照

双奇偶校验 RAID-Z (raidz2)

Solaris 10 11/06 发行版:现在,冗余 RAID-Z 配置可以具有单奇偶校验或双奇偶校验配置,这意味着可以分别承受一个或两个设备故障,而不会丢失任何数据。可以为双奇偶校验 RAID-Z 配置指定 raidz2 关键字。还可以为单奇偶校验 RAID-Z 配置指定 raidzraidz1 关键字。

有关更多信息,请参见创建 RAID-Z 存储池zpool(1M)

ZFS 存储池设备的热备件

Solaris 10 11/06 发行版:借助 ZFS 热备件功能,可以确定可用来替换在一个或多个存储池中发生故障或出现错误的设备的磁盘。指定一个设备作为热备件,意味着如果池中的某一活动设备发生故障,热备件将自动替换该故障设备。或者,也可以用热备件手动替换存储池中的设备。

有关更多信息,请参见在存储池中指定热备件zpool(1M)

使用 ZFS 克隆替换 ZFS 文件系统 (zfs promote)

Solaris 10 11/06 发行版:借助 zfs promote 命令,可以使用现有 ZFS 文件系统的克隆来替换该文件系统。如果您希望在某个文件系统的替换版本上运行测试,然后将替换版本变为活动的文件系统,则此功能会很有用。

有关更多信息,请参见使用 ZFS 克隆替换 ZFS 文件系统zfs(1M)

升级 ZFS 存储池 (zpool upgrade)

Solaris 10 6/06 发行版:通过使用 zpool upgrade 命令,可以将存储池升级到更新的 ZFS 版本,以利用最新功能。此外,zpool status 命令已经修改,可在池运行较早版本的 ZFS 时发出通知。

有关更多信息,请参见升级 ZFS 存储池zpool(1M)

如果要在包含来自先前 Solaris 发行版的池的系统上使用 ZFS 管理控制台,请确保在使用控制台之前先升级池。要确定池是否需要升级,请使用 zpool status 命令。有关 ZFS 管理控制台的信息,请参见基于 Web 的 ZFS 管理

ZFS 备份和恢复命令已重命名

Solaris 10 6/06 发行版:在此 Solaris 发行版中,zfs backupzfs restore 命令已分别重命名为 zfs sendzfs receive,以便更准确地描述其功能。这些命令发送和接收 ZFS 数据流表示。

有关这些命令的更多信息,请参见发送和接收 ZFS 数据

恢复已销毁的存储池

Solaris 10 6/06 发行版:此发行版中包括 zpool import -D 命令,通过该命令可以恢复以前使用 zpool destroy 命令销毁的池。

有关更多信息,请参见恢复已销毁的 ZFS 存储池

集成 ZFS 与 Fault Manager

Solaris 10 6/06 发行版:此发行版包括 ZFS 诊断引擎,该诊断引擎可诊断和报告池故障和设备故障。另外,还可与池或设备的故障关联的校验和 I/O 设备和池错误。

该诊断引擎不包括校验和以及 I/O 错误的预测性分析,也不包括基于故障分析的主动操作。

如果发生 ZFS 故障,您可能会看到类似以下的消息:


SUNW-MSG-ID: ZFS-8000-D3, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Wed Jun 30 14:53:39 MDT 2010
PLATFORM: SUNW,Sun-Fire-880, CSN: -, HOSTNAME: neo
SOURCE: zfs-diagnosis, REV: 1.0
EVENT-ID: 504a1188-b270-4ab0-af4e-8a77680576b8
DESC: A ZFS device failed.  Refer to http://sun.com/msg/ZFS-8000-D3 for more information.
AUTO-RESPONSE: No automated response will occur.
IMPACT: Fault tolerance of the pool may be compromised.
REC-ACTION: Run 'zpool status -x' and replace the bad device.

通过查看建议的操作(位于 zpool status 命令中的具体指令之后),可快速确定和解决故障问题。

有关从所报告的 ZFS 问题中恢复的示例,请参见解决缺少设备的问题

zpool clear 命令

Solaris 10 6/06 发行版:此发行版包括 zpool clear 命令,该命令用于清除与设备或池关联的错误计数。以前,错误计数是在使用 zpool online 命令使池中的设备联机时清除的。有关更多信息,请参见清除存储池设备错误 和·zpool(1M)

紧凑 NFSv4 ACL 格式

Solaris 10 6/06 发行版:在此发行版中,您可以用两种格式设置和显示 NFSv4 ACL:详细和缩写。可以使用 chmod 命令设置任一种 ACL 格式。可以使用 ls - V 命令显示缩写 ACL 格式。可以使用 ls - v 命令显示详细 ACL 格式。

有关更多信息,请参见以缩写格式设置和显示 ZFS 文件的 ACLchmod(1)ls(1)

文件系统监视工具 (fsstat)

Solaris 10 6/06 发行版fsstat 是一个新的文件系统监视工具,可用于报告文件系统操作。可按挂载点或文件系统类型来报告活动。以下示例显示常规的 ZFS 文件系统活动:


$ fsstat zfs
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
7.82M 5.92M 2.76M 1.02G 3.32M  5.60G 87.0M  363M 1.86T 20.9M  251G zfs

有关更多信息,请参见 fsstat(1M)

基于 Web 的 ZFS 管理

Solaris 10 6/06 发行版:ZFS 管理控制台是一个基于 Web 的 ZFS 管理工具,允许您执行以下管理任务:

通过安全 Web 浏览器访问以下网址,可以访问 ZFS 管理控制台:


https://system-name:6789/zfs

如果键入了适当的 URL 但无法访问 ZFS 管理控制台,则表明可能未启动服务器。要启动服务器,请运行以下命令:


# /usr/sbin/smcwebserver start

如果希望服务器在系统引导时自动启动,请运行以下命令:


# /usr/sbin/smcwebserver enable

注 –

不能使用 Solaris Management Console (smc) 管理 ZFS 存储池或文件系统。


什么是 ZFS?

ZFS 文件系统是一种革新性的新文件系统,可从根本上改变文件系统的管理方式,并具有目前面市的其他任何文件系统所没有的功能和优点。ZFS 强健可靠、可伸缩、易于管理。

ZFS 池存储

ZFS 使用存储池的概念来管理物理存储。以前,文件系统是在单个物理设备的基础上构造的。为了利用多个设备和提供数据冗余性,引入了卷管理器的概念来提供单个设备的表示,以便无需修改文件系统即可利用多个设备。此设计增加了更多复杂性,并最终阻碍了特定文件系统的继续发展,因为这类文件系统无法控制数据在虚拟卷上的物理放置。

ZFS 可完全避免使用卷管理。ZFS 将设备聚集到存储池中,而不是强制要求创建虚拟卷。存储池说明了存储的物理特征(设备布局、数据冗余等),并充当可以从其创建文件系统的任意数据存储库。文件系统不再仅限于单个设备,从而可与池中的所有文件系统共享磁盘空间。您不再需要预先确定文件系统的大小,因为文件系统会在分配给存储池的磁盘空间内自动增长。添加新存储器后,无需执行其他操作,池中的所有文件系统即可立即使用所增加的磁盘空间。在许多方面,存储池与虚拟内存系统相似:将一个内存 DIMM 加入系统时,操作系统并不强迫您运行命令来配置内存并将其分配给个别进程。系统中的所有进程都会自动使用所增加的内存。

事务性语义

ZFS 是事务性文件系统,这意味着文件系统状态在磁盘上始终是一致的。传统文件系统可就地覆写数据,这意味着如果系统断电(例如,在分配数据块到将其链接到目录中的时间段内断电),则会使文件系统处于不一致状态。以前,此问题是通过使用 fsck 命令解决的。此命令负责检查并验证文件系统状态,并尝试在操作过程中修复任何不一致性。这种文件系统不一致问题曾给管理员造成巨大困扰,fsck 命令并不保证能够解决所有可能的问题。最近,文件系统引入了日志记录的概念。日志记录过程在单独的日志中记录操作,在系统发生崩溃时,可以安全地重放该日志。由于数据需要写入两次,因此该过程会引入不必要的开销,而且通常会导致一组新问题,例如在无法正确地重放日志时。

对于事务性文件系统,数据是使用写复制语义管理的。数据永远不会被覆写,并且任何操作序列会全部被提交或全部被忽略。因此,文件系统绝对不会因意外断电或系统崩溃而被损坏。尽管最近写入的数据片段可能丢失,但是文件系统本身将始终是一致的。此外,只有在写入同步数据(使用 O_DSYNC 标志写入)后才返回,因此同步数据决不会丢失。

校验和与自我修复数据

对于 ZFS,所有数据和元数据都通过用户可选择的校验和算法进行验证。提供校验和验证的传统文件系统出于卷管理层和传统文件系统设计的必要,会逐块执行此操作。在传统设计中,某些故障可能导致数据不正确但没有校验和错误,如向错误位置写入完整的块等。ZFS 校验和的存储方式可确保检测到这些故障并可以正常地从其中进行恢复。所有校验和验证与数据恢复都是在文件系统层 执行的,并且对应用程序是透明的。

此外,ZFS 还会提供自我修复数据。ZFS 支持存储池具有各种级别的数据冗余性。检测到坏的数据块时,ZFS 会从另一个冗余副本中提取正确的数据,而且会用正确的数据替换错误的数据。

独一无二的可伸缩性

ZFS 文件系统的一个关键设计要素是可伸缩性。该文件系统本身是 128 位的,所允许的存储空间是 256 quadrillion zettabyte (256x1015 ZB)。所有元数据都是动态分配的,因此在首次创建时无需预先分配 inode,否则就会限制文件系统的可伸缩性。所有算法在编写时都考虑到了可伸缩性。目录最多可以包含 248(256 万亿)项,并且对于文件系统数或文件系统中可以包含的文件数不存在限制。

ZFS 快照

快照是文件系统或卷的只读副本。可以快速而轻松地创建快照。最初,快照不会占用池中的任何附加磁盘空间。

活动数据集中的数据更改时,快照通过继续引用旧数据来占用磁盘空间。因此,快照可防止将数据释放回池中。

简化的管理

最重要的是,ZFS 提供了一种极度简化的管理模型。通过使用分层文件系统布局、属性继承以及自动管理挂载点和 NFS 共享语义,ZFS 可轻松创建和管理文件系统,而无需使用多个命令或编辑配置文件。可以轻松设置配额或预留空间,启用或禁用压缩,或者通过单个命令管理许多文件系统的挂载点。您就可以检查或替换设备,而无需学习另外的一套卷管理命令。您可以发送和接收文件系统快照流

ZFS 通过分层结构管理文件系统,该分层结构允许对属性(如配额、预留空间、压缩和挂载点)进行这一简化管理。在此模型中,文件系统是中央控制点。文件系统本身的开销非常小(相当于创建一个新目录),因此鼓励您为每个用户、项目、工作区等创建一个文件系统。通过此设计,可定义细分的管理点。

ZFS 术语

本节介绍了在本书中使用的基本术语:

备用引导环境

通过 lucreate 命令创建且可能通过 luupgrade 命令更新的引导环境,但它不是活动环境或主引导环境。通过运行 luactivate 命令,可以使备用引导环境成为主引导环境。

校验和

文件系统块中数据的 256 位散列。校验和功能的范围可以从简单快速的 fletcher4(缺省值)到强加密散列(如 SHA256)。

clone

其初始内容与快照内容相同的文件系统。

有关克隆的信息,请参见ZFS 克隆概述

数据集

以下 ZFS 组件的通用名称: 克隆、文件系统、快照和卷。

每个数据集由 ZFS 名称空间中的唯一名称标识。数据集使用以下格式进行标识:

pool/path[ @snapshot]

pool

标识包含数据集的存储池的名称

path

数据集组件的斜杠分隔路径名

snapshot

用于标识数据集快照的可选组件

有关数据集的更多信息,请参见第 6 章

文件系统

挂载在标准系统名称空间中且行为与其他文件系统相似的 filesystem 类型的 ZFS 数据集。

有关文件系统的更多信息,请参见第 6 章

镜像

在两个或更多磁盘上存储相同数据副本的虚拟设备。如果镜像中的任一磁盘出现故障,则该镜像中的其他任何磁盘都可以提供相同的数据。

设备的逻辑组,用于说明可用存储的布局和物理特征。数据集的磁盘空间是从池中分配的。

有关存储池的更多信息,请参见第 4 章

主引导环境

lucreate 命令生成备用引导环境所用的引导环境。缺省情况下,主引导环境是当前引导环境。可以使用 lucreate -s 选项覆盖此缺省设置。

RAID-Z

在多个磁盘上存储数据和奇偶校验的虚拟设备。有关 RAID-Z 的更多信息,请参见RAID-Z 存储池配置

重新同步

将数据从一个设备复制到另一个设备的过程称为重新同步。例如,如果替换了镜像设备或使其脱机,则最新镜像设备中的数据会复制到刚恢复的镜像设备。此过程在传统的卷管理产品中称为镜像重新同步

有关 ZFS 重新同步的更多信息,请参见查看重新同步状态

快照

文件系统或卷在给定时间点的只读副本。

有关快照的更多信息,请参见ZFS 快照概述

虚拟设备

池中的逻辑设备,可以是物理设备、文件或设备集合。

有关虚拟设备的更多信息,请参见显示存储池虚拟设备信息

表示块设备的数据集。例如,可以创建 ZFS 卷作为交换设备。

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

ZFS 组件命名要求

每个 ZFS 组件(如数据集和池等)必须根据以下规则进行命名:

此外,不允许使用空组件。