Oracle Solaris ZFS 管理指南

第 4 章 管理 Oracle Solaris ZFS 存储池

本章介绍如何创建和管理 Oracle Solaris ZFS 中的存储池。

本章包含以下各节:

ZFS 存储池的组件

以下各节提供有关以下存储池组件的详细信息:

使用 ZFS 存储池中的磁盘

存储池的最基本元素是物理存储器。物理存储器可以是大小至少为 128 MB 的任何块设备。通常,此设备是 /dev/dsk 目录中对系统可见的一个硬盘驱动器。

存储设备可以是整个磁盘 (c1t0d0) 或单个片 (c0t0d0s7)。建议的操作模式是使用整个磁盘,在这种情况下,无需对磁盘进行特殊格式化。ZFS 可格式化使用 EFI 标签的磁盘以包含单个大片。以此方式使用磁盘时,format 命令显示的分区表与以下信息类似:


Current partition table (original):
Total disk sectors available: 286722878 + 16384 (reserved sectors)

Part      Tag    Flag     First Sector         Size         Last Sector
  0        usr    wm                34      136.72GB          286722911    
  1 unassigned    wm                 0           0               0    
  2 unassigned    wm                 0           0               0    
  3 unassigned    wm                 0           0               0    
  4 unassigned    wm                 0           0               0    
  5 unassigned    wm                 0           0               0    
  6 unassigned    wm                 0           0               0    
  8   reserved    wm         286722912        8.00MB          286739295    

要使用整个磁盘,必须使用 /dev/dsk/cNtNdN 命名约定对磁盘进行命名。一些第三方驱动程序使用不同的命名约定,或者将磁盘放置在除 /dev/dsk 目录以外的位置中。要使用这些磁盘,必须手动标记磁盘并为 ZFS 提供片。

创建包含整个磁盘的存储池时,ZFS 会应用 EFI 标签。有关 EFI 标签的更多信息,请参见《系统管理指南:设备和文件系统》中的“带有 EFI 磁盘标号的多 TB 磁盘支持”

要用于 ZFS 根池的磁盘必须创建为具有 SMI 标签,而不是 EFI 标签。您可以使用 format -e 命令对磁盘重新进行标记,使其具有 SMI 标签。

可以使用全路径(如 /dev/dsk/c1t0d0)或构成 /dev/dsk 目录中设备名称的缩略名称(如 c1t0d0)来指定磁盘。例如,以下是有效的磁盘名称:

创建 ZFS 存储池的最简单方法是使用整个物理磁盘。在从磁盘片、硬件 RAID 阵列中的 LUN 或基于软件的卷管理器所提供的卷中生成池时,无论从管理、可靠性还是性能的角度而言,ZFS 配置都变得越来越复杂。以下注意事项可能有助于确定如何用其他硬件或软件存储解决方案来配置 ZFS:

有关存储池建议的其他信息,请参见 ZFS 最佳做法站点:

http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide

磁盘由其路径及其设备 ID(如果可用)标识。在设备 ID 信息可用的系统上,这种标识方法允许重新配置设备而无需更新 ZFS。由于设备 ID 生成和管理可能因系统而异,因此应在移动设备之前导出池,例如在将磁盘从一个控制器移动到另一个控制器之前。诸如固件更新或其它硬件变化之类的系统事件可能会更改 ZFS 存储池中的设备 ID,导致设备不可用。

使用 ZFS 存储池中的片

创建包含磁盘片的存储池时,可以使用传统的 Solaris VTOC (SMI) 标签来标记磁盘。

对于可引导的 ZFS 根池,池中的磁盘必须包含分片,并且必须具有 SMI 标签。最简单的配置为将整个磁盘容量置于片 0 中,并将该片用于根池。

在基于 SPARC 的系统上,72 GB 的磁盘在分片 0 上有 68 GB 的可用空间,如下列 format 输出所示。


# format
.
.
.
Specify disk (enter its number): 4
selecting c1t1d0
partition> p
Current partition table (original):
Total disk cylinders available: 14087 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       0 - 14086       68.35GB    (14087/0/0) 143349312
  1 unassigned    wm       0                0         (0/0/0)             0
  2     backup    wm       0 - 14086       68.35GB    (14087/0/0) 143349312
  3 unassigned    wm       0                0         (0/0/0)             0
  4 unassigned    wm       0                0         (0/0/0)             0
  5 unassigned    wm       0                0         (0/0/0)             0
  6 unassigned    wm       0                0         (0/0/0)             0
  7 unassigned    wm       0                0         (0/0/0)             0

在基于 x86C 的系统上,72 GB 的磁盘在分片 0 上有 68 GB 的可用磁盘空间,如下列 format 输出所示。分片 8 包含少量引导信息。 分片 8 不需要管理,并且无法对其进行更改。


# format
.
.
.
selecting c1t0d0
partition> p
Current partition table (original):
Total disk cylinders available: 49779 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       1 - 49778       68.36GB    (49778/0/0) 143360640
  1 unassigned    wu       0                0         (0/0/0)             0
  2     backup    wm       0 - 49778       68.36GB    (49779/0/0) 143363520
  3 unassigned    wu       0                0         (0/0/0)             0
  4 unassigned    wu       0                0         (0/0/0)             0
  5 unassigned    wu       0                0         (0/0/0)             0
  6 unassigned    wu       0                0         (0/0/0)             0
  7 unassigned    wu       0                0         (0/0/0)             0
  8       boot    wu       0 -     0        1.41MB    (1/0/0)          2880
  9 unassigned    wu       0                0         (0/0/0)             0

使用 ZFS 存储池中的文件

ZFS 还允许将 UFS 文件用作存储池中的虚拟设备。此功能主要用于测试和启用简单的实验,而不是用于生产。原因是文件的任何使用都依赖于底层文件系统以实现一致性。如果创建了由 UFS 文件系统中的文件支持的 ZFS 池,则会隐式依赖于 UFS 来保证正确性和同步语义。

但是,如果首次试用 ZFS,或者在没有足够的物理设备时尝试更复杂的配置,则文件会非常有用。所有文件必须以完整路径的形式指定,并且大小至少为 64 MB。

ZFS 存储池的复制功能

ZFS 在镜像配置和 RAID-Z 配置中提供数据冗余和自我修复属性。

镜像存储池配置

镜像存储池配置至少需要两个磁盘,而且磁盘最好位于不同的控制器上。可以在一个镜像配置中使用许多磁盘。此外,还可以在每个池中创建多个镜像。从概念上讲,简单的镜像配置与以下内容类似:


mirror c1t0d0 c2t0d0

从概念上讲,更复杂的镜像配置与以下内容类似:


mirror c1t0d0 c2t0d0 c3t0d0 mirror c4t0d0 c5t0d0 c6t0d0

有关创建镜像存储池的信息,请参见创建镜像存储池

RAID-Z 存储池配置

除镜像存储池配置外,ZFS 还提供具有单/双/三奇偶校验容错性的 RAID-Z 配置。单奇偶校验 RAID-Z (raidzraidz1) 与 RAID-5 类似。双奇偶校验 RAID-Z (raidz2) 与 RAID-6 类似。

有关 RAIDZ-3 (raidz3) 的更多信息,请参见以下博客:

http://blogs.sun.com/ahl/entry/triple_parity_raid_z

所有与 RAID-5 类似的传统算法(例如 RAID-4、RAID-6、RDP 和 EVEN-ODD)都可能存在称为“RAID-5 写入漏洞”的问题。如果仅写入了 RAID-5 条带的一部分,并且在所有块成功写入磁盘之前断电,则奇偶校验将与数据不同步,因此永远无用,除非后续的完全条带化写操作将其覆写。在 RAID-Z 中,ZFS 使用可变宽度的 RAID 条带,以便所有写操作都是完全条带化写操作。这是唯一可行的设计,因为 ZFS 通过以下方式将文件系统和设备管理集成在一起:文件系统的元数据包含有关底层数据冗余模型的足够信息以处理可变宽度的 RAID 条带。RAID-Z 是世界上针对 RAID-5 写入漏洞的第一个仅使用软件的解决方案。

一个 RAID-Z 配置包含 N 个大小为 X 的磁盘,其中有 P 个奇偶校验磁盘,该配置可以存放大约 (N-P)*X 字节的数据,并且只有在 P 个设备出现故障时才会危及数据完整性。单奇偶校验 RAID-Z 配置至少需要两个磁盘,双奇偶校验 RAID-Z 配置至少需要三个磁盘。例如,如果一个单奇偶校验 RAID-Z 配置中有三个磁盘,则奇偶校验数据占用的磁盘空间与其中一个磁盘的空间相等。除此之外,创建 RAID-Z 配置无需任何其他特殊硬件。

从概念上讲,包含三个磁盘的 RAID-Z 配置与以下内容类似:


raidz c1t0d0 c2t0d0 c3t0d0

从概念上讲,更复杂的 RAID-Z 配置与以下内容类似:


raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0 raidz c8t0d0 c9t0d0 c10t0d0 c11t0d0
c12t0d0 c13t0d0 c14t0d0

如果创建具有许多磁盘的 RAID-Z 配置,请考虑将这些磁盘分为多个组。例如,具有 14 个磁盘的 RAID-Z 配置最好分割为两个 7 磁盘组。若 RAID-Z 配置包含的分组中的磁盘数目为一位数 (1-9),则该配置的性能应该更好。

有关创建 RAID-Z 存储池的信息,请参见创建 RAID-Z 存储池

有关基于性能和磁盘空间考虑在镜像配置或 RAID-Z 配置之间进行选择的更多信息,请参见以下博客:

http://blogs.sun.com/roch/entry/when_to_and_not_to

有关 RAID-Z 存储池建议的其他信息,请参见 ZFS 最佳做法站点:

http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide

ZFS 混合存储池

Oracle Sun Storage 7000 产品系列所提供的 ZFS 混合存储池是一种组合了 DRAM、SSD 和 HDD 的特殊存储池,可以提高性能、增加容量并降低能耗。通过此产品的管理界面,您可以选择存储池的 ZFS 冗余配置,并轻松管理其他配置选项。

有关此产品的更多信息,请参见《Sun Storage Unified Storage System 管理指南》

冗余配置中的自我修复数据

ZFS 在镜像配置或 RAID-Z 配置中提供了自我修复数据。

检测到坏的数据块时,ZFS 不仅会从另一个冗余副本中提取正确的数据,还会通过将错误数据替换为正确的副本对其进行修复。

存储池中的动态条带化

ZFS 以条带形式将数据动态分布在所有顶层虚拟设备上。由于是在写入时确定放置数据的位置,因此在分配时不会创建固定宽度的条带。

向池中添加新虚拟设备时,ZFS 会将数据逐渐分配给新设备,以便维护性能和磁盘空间分配策略。每个虚拟设备也可以是包含其他磁盘设备或文件的镜像或 RAID-Z 设备。使用此配置,可以灵活地控制池的故障特征。例如,可以通过 4 个磁盘创建以下配置:

虽然 ZFS 支持一个池包含不同类型的虚拟设备,但应避免这种做法。例如,可以创建一个包含一个双向镜像和一个三向 RAID-Z 配置的池。但是,容错能力几乎与最差的虚拟设备(在本示例中为 RAID-Z)相同。最佳做法是使用相同类型的顶层虚拟设备,并且每个设备的冗余级别相同。

创建和销毁 ZFS 存储池

以下各节介绍创建和销毁 ZFS 存储池的不同情况:

可以快速轻松地创建和销毁池。但是,执行这些操作务必谨慎。虽然进行了检查,以防止在新的池中使用现已使用的设备,但是 ZFS 无法始终知道设备何时已在使用中。存储池销毁容易创建难。请谨慎使用 zpool destroy。这个简单的命令会产生严重的后果。

创建 ZFS 存储池

要创建存储池,请使用 zpool create 命令。此命令采用池名称和任意数目的虚拟设备作为参数。池名称必须符合ZFS 组件命名要求中的命名要求。

创建基本存储池

以下命令创建了一个名为 tank 的新池,该池由磁盘 c1t0d0c1t1d0 组成:


# zpool create tank c1t0d0 c1t1d0

代表整个磁盘的设备名称可在 /dev/dsk 目录中找到,并由 ZFS 适当标记以包含单个大片。数据通过这两个磁盘以动态方式进行条带化。

创建镜像存储池

要创建镜像池,请使用 mirror 关键字,后跟将组成镜像的任意数目的存储设备。可以通过在命令行中重复使用 mirror 关键字指定多个镜像。以下命令创建了一个包含两个双向镜像的池:


# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0

第二个 mirror 关键字表示将指定新的顶层虚拟设备。数据通过这两个镜像以动态方式进行条带化,并会相应地在每个磁盘之间创建冗余数据。

有关建议的镜像配置的更多信息,请参见以下站点:

http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide

目前,ZFS 镜像配置中支持以下操作:

不能直接从镜像存储池中移除非日志或缓存设备。对于此功能,已经申请了 RFE(请求提高)。

创建 ZFS 根池

您可以从 ZFS 根文件系统进行安装和引导。查看以下根池配置信息:

有关安装和引导 ZFS 根文件系统的更多信息,请参见第 5 章

创建 RAID-Z 存储池

创建单奇偶校验 RAID-Z 池与创建镜像池基本相同,不同之处是使用 raidzraidz1 关键字而不是 mirror。以下示例说明如何创建一个包含由 5 个磁盘组成的单个 RAID-Z 设备的池:


# zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0

本例说明可以通过设备的缩写名称或全名指定磁盘。/dev/dsk/c5t0d0c5t0d0 指代同一个磁盘。

创建池时,使用 raidz2raidz3 关键字可以创建双奇偶校验或三奇偶校验 RAID-Z 配置。例如,


# zpool create tank raidz2 c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0
# zpool status -v tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0
            c3t0d0  ONLINE       0     0     0
            c4t0d0  ONLINE       0     0     0
            c5t0d0  ONLINE       0     0     0

errors: No known data errors

# zpool create tank raidz3 c0t0d0 c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0
# zpool status -v tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz3-0  ONLINE       0     0     0
            c0t0d0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0
            c3t0d0  ONLINE       0     0     0
            c4t0d0  ONLINE       0     0     0
            c5t0d0  ONLINE       0     0     0
            c6t0d0  ONLINE       0     0     0
            c7t0d0  ONLINE       0     0     0

errors: No known data errors

目前,ZFS RAID-Z 配置中支持以下操作:

目前,RAID-Z 配置中支持以下操作:

有关 RAID-Z 配置的更多信息,请参见RAID-Z 存储池配置

使用日志设备创建 ZFS 存储池

缺省情况下,ZIL 是通过主池中的块分配的。但是,通过使用单独的意图日志设备(如使用 NVRAM 或专用磁盘)可能会获得更佳的性能。有关 ZFS 日志设备的更多信息,请参见设置单独的 ZFS 日志设备

创建存储池时或创建存储池以后,您可以设置 ZFS 日志设备。

以下示例显示如何使用镜像日志设备创建镜像存储池:


# zpool create datap mirror c1t1d0 c1t2d0 mirror c1t3d0 c1t4d0 log mirror c1t5d0 c1t8d0
# zpool status datap
  pool: datap
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        datap       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
            c1t4d0  ONLINE       0     0     0
        logs
          mirror-2  ONLINE       0     0     0
            c1t5d0  ONLINE       0     0     0
            c1t8d0  ONLINE       0     0     0

errors: No known data errors

有关从日志设备故障中进行恢复的信息,请参见示例 11–2

使用高速缓存设备创建 ZFS 存储池

您可以使用高速缓存设备创建一个存储池,来缓存存储池数据。例如:


# zpool create tank mirror c2t0d0 c2t1d0 c2t3d0 cache c2t5d0 c2t8d0
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0
        cache
          c2t5d0    ONLINE       0     0     0
          c2t8d0    ONLINE       0     0     0

errors: No known data errors

确定是否使用高速缓存设备创建 ZFS 存储池时,请考虑以下几点:

显示存储池虚拟设备信息

每个存储池都包含一个或多个虚拟设备。虚拟设备是存储池的内部表示形式,用于说明物理存储器的布局以及存储池的故障特征。因此,虚拟设备表示用于创建存储池的磁盘设备或文件。一个池可以在配置的顶层具有任意数目的虚拟设备,称为顶层 vdev

如果顶层虚拟设备包含两个或更多物理设备,配置将以镜像或 RAID-Z 虚拟设备的形式提供数据冗余。这些虚拟设备由磁盘、磁盘片或文件构成。备件是一种特殊虚拟设备,用于跟踪一个池的可用热备件。

以下示例说明如何创建一个包含两个顶层虚拟设备(各虚拟设备是由两个磁盘组成的镜像)的池:


# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0

以下示例说明如何创建包含一个顶层虚拟设备(由 4 个磁盘组成)的池。


# zpool create mypool raidz2 c1d0 c2d0 c3d0 c4d0

可以使用 zpool add 命令将另一个顶层虚拟设备添加到此池中。例如:


# zpool add mypool raidz2 c2d1 c3d1 c4d1 c5d1

非冗余池中使用的磁盘、磁盘片或文件可用作顶层虚拟设备。存储池通常由多个顶层虚拟设备构成。ZFS 将在池内的所有顶层虚拟设备中以动态方式对数据进行条带化。

可使用 zpool status 命令显示 ZFS 存储池中包含的虚拟设备和物理设备。例如:


# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
          mirror-2  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0

errors: No known data errors

处理 ZFS 存储池创建错误

出现池创建错误可以有许多原因。其中一些原因是显而易见的(如指定的设备不存在),而其他原因则不太明显。

检测使用中的设备

格式化设备之前,ZFS 会首先确定 ZFS 或操作系统的某个其他部分是否正在使用磁盘。如果磁盘正在使用,则可能会显示类似以下的错误:


# zpool create tank c1t0d0 c1t1d0
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t0d0s0 is currently mounted on /. Please see umount(1M).
/dev/dsk/c1t0d0s1 is currently mounted on swap. Please see swap(1M).
/dev/dsk/c1t1d0s0 is part of active ZFS pool zeepool. Please see zpool(1M).

使用 -f 选项可以覆盖其中的一些错误,但是无法覆盖大多数错误。使用 -f 选项无法覆盖下列条件,必须手动对这些错误进行更正:

挂载的文件系统

磁盘或其中一片包含当前挂载的文件系统。要更正此错误,请使用 umount 命令。

/etc/vfstab 中的文件系统

磁盘包含 /etc/vfstab 文件中列出的文件系统,但当前未挂载该文件系统。要更正此错误,请删除或注释掉 /etc/vfstab 文件中的相应行。

专用转储设备

正在将磁盘用作系统的专用转储设备。要更正此错误,请使用 dumpadm 命令。

ZFS 池的一部分

磁盘或文件是活动 ZFS 存储池的一部分。要更正此错误,请使用 zpool destroy 命令来销毁其他池(如果不再需要)。或者,使用 zpool detach 命令将磁盘与其他池分离。您只能将磁盘从镜像存储池中分离。

以下使用情况检查用作帮助性警告,并可以使用 -f 选项进行覆盖以创建池:

包含文件系统

磁盘包含已知的文件系统,尽管该系统未挂载并且看起来未被使用。

卷的一部分

磁盘是 Solaris Volume Manager 卷的一部分。

实时升级

正在将磁盘用作 Oracle Solaris Live Upgrade 的替换引导环境。

导出的 ZFS 池的一部分

磁盘是已导出的或者从系统中手动删除的存储池的一部分。如果是后一种情况,则会将池的状态报告为可能处于活动状态,因为磁盘可能是也可能不是由其他系统使用的网络连接驱动器。覆盖可能处于活动状态的池时请务必谨慎。

以下示例说明如何使用 -f 选项:


# zpool create tank c1t0d0
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t0d0s0 contains a ufs filesystem.
# zpool create -f tank c1t0d0

理想情况是更正错误,而不是使用 -f 选项覆盖错误。

不匹配的复制级别

建议不要创建包含不同复制级别的虚拟设备的池。zpool 命令可尝试防止意外创建冗余级别不匹配的池。如果尝试创建具有这样配置的池,则会显示类似以下的错误:


# zpool create tank c1t0d0 mirror c2t0d0 c3t0d0
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: both disk and mirror vdevs are present
# zpool create tank mirror c1t0d0 c2t0d0 mirror c3t0d0 c4t0d0 c5t0d0
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: 2-way mirror and 3-way mirror vdevs are present

可以使用 -f 选项覆盖这些错误,但应避免这种做法。此命令还会发出警告,指明正使用大小不同的设备创建镜像池或 RAID-Z 池。虽然允许这种配置,但冗余结果的不匹配程度会导致较大设备上出现未使用磁盘空间。要求使用 -f 选项覆盖警告。

在预运行模式下创建存储池

尝试创建池可能会以多种方式意外失败,格式化磁盘是一种潜在有害的操作。因此,zpool create 命令提供了一个额外选项 -n,它模拟创建池,但不真正写入设备。此预运行选项执行设备使用中检查和复制级别验证,并报告该过程中出现的任何错误。如果未找到错误,则会显示类似以下的输出:


# zpool create -n tank mirror c1t0d0 c1t1d0
would create 'tank' with the following layout:

        tank
          mirror
            c1t0d0
            c1t1d0

如果不实际创建池,则无法检测到某些错误。最常见的示例是在同一配置中两次指定同一设备。不真正写入数据将无法可靠地检测此错误,因此 zpool create -n 命令可以报告操作成功,但不会创建池。

存储池的缺省挂载点

创建池时,顶层数据集的缺省挂载点是 /pool-name。此目录必须不存在或者为空。如果目录不存在,则会自动创建该目录。如果该目录为空,则根数据集会挂载在现有目录的顶层。要使用不同的缺省挂载点创建池,请在 -zpool create 命令中使用 m 选项。例如,


# zpool create home c1t0d0
default mountpoint '/home' exists and is not empty
use '-m' option to provide a different default
# zpool create -m /export/zfs home c1t0d0

此命令会创建新池 home 和挂载点为 /export/zfshome 数据集。

有关挂载点的更多信息,请参见管理 ZFS 挂载点

销毁 ZFS 存储池

池是通过使用 zpool destroy 命令进行销毁的。此命令会销毁池,即使池中包含挂载的数据集也是如此。


# zpool destroy tank

注意 – 注意 –

销毁池时请务必小心。请确保确实要销毁池,并始终保留数据副本。如果意外销毁了不该销毁的池,则可以尝试恢复该池。有关更多信息,请参见恢复已销毁的 ZFS 存储池


销毁包含故障设备的池

销毁池这一操作要求将数据写入磁盘,以指示池不再有效。此状态信息可防止执行导入操作时这些设备作为潜在的池显示出来。在一个或多个设备不可用的情况下,仍可以销毁池。但是,必需的状态信息将不会写入这些不可用的设备。

经过适当修复后,当您创建新池时,这些设备被报告为潜在活动设备。当您搜索池以便导入时,这些设备显示为有效设备。如果池中包含足够多的故障设备以致于池本身出现故障(意味着顶层虚拟设备出现故障),则此命令将列显一条警告,并且在不使用 -f 选项的情况下无法完成。此选项是必需的,因为无法打开池,以致无法知道数据是否存储在池中。例如:


# zpool destroy tank
cannot destroy 'tank': pool is faulted
use '-f' to force destruction anyway
# zpool destroy -f tank

有关池和设备的运行状况的更多信息,请参见确定 ZFS 存储池的运行状况

有关导入池的更多信息,请参见导入 ZFS 存储池

管理 ZFS 存储池中的设备

ZFS 存储池的组件中介绍了有关设备的大多数基本信息。创建池后,即可执行几项任务来管理池中的物理设备。

向存储池中添加设备

通过添加新的顶层虚拟设备,可以向池中动态添加磁盘空间。此磁盘空间立即可供池中的所有数据集使用。要向池中添加新虚拟设备,请使用 zpool add 命令。例如:


# zpool add zeepool mirror c2t1d0 c2t2d0

用于指定虚拟设备的格式与 zpool create 命令中使用的虚拟设备格式相同。将对设备进行检查以确定是否正在使用这些设备,此命令在不使用 -f 选项的情况下无法更改冗余级别。此命令还支持 -n 选项,以便可以执行预运行。例如:


# zpool add -n zeepool mirror c3t1d0 c3t2d0
would update 'zeepool' to the following configuration:
      zeepool
        mirror
            c1t0d0
            c1t1d0
        mirror
            c2t1d0
            c2t2d0
        mirror
            c3t1d0
            c3t2d0

此命令语法会将镜像设备 c3t1d0c3t2d0 添加到 zeepool 池的现有配置中。

有关如何执行虚拟设备验证的更多信息,请参见检测使用中的设备


示例 4–1 向镜像 ZFS 配置中添加磁盘

在以下示例中,会将另一个镜像添加到 Oracle Sun Fire x4500 系统上的某个现有镜像 ZFS 配置中。


# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0

errors: No known data errors
# zpool add tank mirror c0t3d0 c1t3d0
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
          mirror-2  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0

errors: No known data errors


示例 4–2 向 RAID-Z 配置中添加磁盘

可按类似方式向 RAID-Z 配置中添加其他磁盘。以下示例说明如何将包含一个 RAID-Z 设备(含 3 个磁盘)的存储池转换为包含两个 RAID-Z 设备(各含 3 个磁盘)的存储池。


# zpool status rzpool
  pool: rzpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rzpool      ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
            c1t4d0  ONLINE       0     0     0

errors: No known data errors
# zpool add rzpool raidz c2t2d0 c2t3d0 c2t4d0
# zpool status rzpool
  pool: rzpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rzpool      ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
          raidz1-1  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0
            c2t4d0  ONLINE       0     0     0

errors: No known data errors


示例 4–3 添加和删除镜像日志设备

以下示例说明如何向镜像存储池中添加镜像日志设备。有关在存储池中使用日志设备的更多信息,请参见设置单独的 ZFS 日志设备


# zpool status newpool
  pool: newpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        newpool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
            c0t5d0  ONLINE       0     0     0

errors: No known data errors
# zpool add newpool log mirror c0t6d0 c0t7d0
# zpool status newpool
  pool: newpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        newpool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
            c0t5d0  ONLINE       0     0     0
        logs
          mirror-1  ONLINE       0     0     0
            c0t6d0  ONLINE       0     0     0
            c0t7d0  ONLINE       0     0     0

errors: No known data errors

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

可以使用 zpool remove 命令删除日志设备。通过指定 mirror-1 参数,可以删除上例中的镜像日志设备。例如:


# zpool remove newpool mirror-1
# zpool status newpool
  pool: newpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        newpool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
            c0t5d0  ONLINE       0     0     0

errors: No known data errors

如果池配置仅包含一个日志设备,则应通过指定设备名称的方式删除该日志设备。例如:


# zpool status pool
  pool: pool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c0t8d0  ONLINE       0     0     0
            c0t9d0  ONLINE       0     0     0
        logs
          c0t10d0   ONLINE       0     0     0

errors: No known data errors
# zpool remove pool c0t10d0


示例 4–4 添加和删除高速缓存设备

可以向 ZFS 存储池中添加高速缓存设备,不再需要时可以删除。

可使用 zpool add 命令添加高速缓存设备。例如:


# zpool add tank cache c2t5d0 c2t8d0
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0
        cache
          c2t5d0    ONLINE       0     0     0
          c2t8d0    ONLINE       0     0     0

errors: No known data errors

高速缓存设备不能镜像或成为 RAID-Z 配置的一部分。

可使用 zpool remove 命令删除高速缓存设备。例如:


# zpool remove tank c2t5d0 c2t8d0
# zpool status tank
 pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0

errors: No known data errors

目前,zpool remove 命令仅支持删除热备件、日志设备和高速缓存设备。可以使用 zpool detach 命令删除属于主镜像池配置的设备。非冗余设备和 RAID-Z 设备无法从池中删除。

有关在 ZFS 存储池中使用高速缓存设备的更多信息,请参见使用高速缓存设备创建 ZFS 存储池


附加和分离存储池中的设备

除了 zpool add 命令外,还可以使用 zpool attach 命令将新设备添加到现有镜像设备或非镜像设备中。

如果要附加磁盘以创建镜像根池,请参见如何创建镜像根池(安装后)

如果要替换 ZFS 根池中的磁盘,请参见如何替换 ZFS 根池中的磁盘


示例 4–5 将双向镜像存储池转换为三向镜像存储池

在本示例中,zeepool 是现有的双向镜像,通过将新设备 c2t1d0 附加到现有设备 c1t1d0 可将其转换为三向镜像。


# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zeepool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0

errors: No known data errors
# zpool attach zeepool c1t1d0 c2t1d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Fri Jan  8 12:59:20 2010
config:

        NAME        STATE     READ WRITE CKSUM
        zeepool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0  592K resilvered

errors: No known data errors

如果现有设备是三向镜像的一部分,则附加新设备将创建四向镜像,依此类推。在任一情况下,新设备都会立即开始重新同步。



示例 4–6 将非冗余 ZFS 存储池转换为镜像 ZFS 存储池

此外,还可以通过使用 zpool attach 命令将非冗余存储池转换为冗余存储池。例如:


# zpool create tank c0t1d0
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          c0t1d0    ONLINE       0     0     0

errors: No known data errors
# zpool attach tank c0t1d0 c1t1d0
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Fri Jan  8 14:28:23 2010
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0  73.5K resilvered

errors: No known data errors

可以使用 zpool detach 命令从镜像存储池中分离设备。例如:


# zpool detach zeepool c2t1d0

但是,如果不存在该数据的其他有效副本,此操作将失败。例如:


# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

通过分割镜像 ZFS 存储池创建新池

使用 zpool split 命令可以很快将镜像 ZFS 存储池克隆为备用池。

目前无法使用此功能来分割镜像根池。

可以使用 zpool split 命令从镜像 ZFS 存储池分离磁盘,以利用其中一个分离的磁盘创建新池。新池的内容与原镜像 ZFS 存储池完全相同。

缺省情况下,对镜像池执行 zpool split 操作将分离最后一个磁盘以用于新创建的池。分割操作之后,导入新池。例如:


# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0

errors: No known data errors
# zpool split tank tank2
# zpool import tank2
# zpool status tank tank2
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          c1t0d0    ONLINE       0     0     0

errors: No known data errors

  pool: tank2
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank2       ONLINE       0     0     0
          c1t2d0    ONLINE       0     0     0

errors: No known data errors

通过在 zpool split 命令中指定,您可以标识哪个磁盘应用于新创建的池。例如:


# zpool split tank tank2 c1t0d0

发生实际的分割操作之前,内存中的数据被刷新到镜像磁盘。数据刷新后,将磁盘从池中分离,并将其指定给一个新池 GUID。新池 GUID 即产生,以便能在分割该池的系统上导入该池。

如果要分割的该池具有非缺省的数据集挂载点,并且在同一系统上创建了新池,则需要使用 zpool split -R 选项标识新池的备用根目录,使得现有挂载点不会发生冲突。例如:


# zpool split -R /tank2 tank tank2

如果不使用 zpool split -R 选项,您可能会看到,当您尝试使用 -R 选项导入新池时,挂载点发生冲突。如果在不同的系统上创建新池,则不需要指定备用根目录,除非发生挂载点冲突。

使用 zpool split 功能之前,请检查以下几点:


示例 4–7 分割镜像 ZFS 存储池 (zpool split)

以下示例分割一个称为 trinity 的镜像存储池,它具有三个磁盘:c1t0d0c1t2d0 c1t3d0。结果产生两个池:镜像池 trinity 包括磁盘 c1t0d0c1t2d0,新池 neo 包括磁盘 c1t3d0。每个池的内容完全相同。


# zpool status trinity
  pool: trinity
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        trinity     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0

errors: No known data errors
# zpool split trinity neo
# zpool import neo
# zpool status trinity neo
  pool: neo
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        neo         ONLINE       0     0     0
          c1t3d0    ONLINE       0     0     0

errors: No known data errors

  pool: trinity
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        trinity     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0

errors: No known data errors

使存储池中的设备联机和脱机

使用 ZFS 可使单个设备脱机或联机。硬件不可靠或无法正常工作时(假定该情况只是暂时的),ZFS 会继续对设备读写数据。如果该情况不是暂时的,您可以指示 ZFS 通过使设备脱机来忽略该设备。ZFS 不会向已脱机的设备发送任何请求。


注 –

设备无需脱机即可进行替换。


需要临时断开存储器时,可以使用 zpool offline 命令。例如,如果需要以物理方式将阵列与一组光纤通道交换机断开连接,并将该阵列连接到另一组交换机,则可使 LUN 从 ZFS 存储池所使用的阵列中脱机。在该阵列重新连接并可正常使用新的一组交换机后,便可使上述 LUN 联机。在 LUN 脱机期间添加到存储池中的数据将在 LUN 恢复联机后重新同步到 LUN 中。

假定所涉及的系统在连接到新交换机后可以立即检测到存储器(可能采用与以前不同的控制器),并且您的池设置为 RAID-Z 配置或镜像配置,则上述情况是可能的。

使设备脱机

可以使用 zpool offline 命令使设备脱机。如果设备是磁盘,则可以使用路径或短名称指定设备。例如:


# zpool offline tank c1t0d0
bringing device c1t0d0 offline

使设备脱机时,请考虑以下几点:

查询池的状态时,已脱机的设备以 OFFLINE 状态显示。有关查询池的状态的信息,请参见查询 ZFS 存储池的状态

有关设备运行状况的更多信息,请参见确定 ZFS 存储池的运行状况

使设备联机

使设备脱机后,可以使用 zpool online 命令使其恢复联机。例如:


# zpool online tank c1t0d0
bringing device c1t0d0 online

使设备联机时,已写入池中的任何数据都将与最新可用的设备重新同步。请注意,不能通过使设备联机来替换磁盘。如果使设备脱机,然后替换该设备并尝试使其联机,则设备将一直处于故障状态。

如果尝试使故障设备联机,则会显示类似以下内容的消息:


# zpool online tank c1t0d0
warning: device 'c1t0d0' onlined, but remains in faulted state
use 'zpool replace' to replace devices that are no longer present

您还可能会看到故障磁盘消息显示在控制台上,或者写入 /var/adm/messages 文件中。例如:


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 online -e 命令扩展 LUN。 缺省情况下,添加至池中的 LUN 不会扩展到其完整大小,除非启用了 autoexpand 池属性。使用 zpool online -e 命令可以自动扩展 LUN,即使 LUN 已经联机或者 LUN 目前脱机。例如:


# zpool online -e tank c1t13d0

清除存储池设备错误

如果设备因出现故障(导致在 zpool status 输出中列出错误)而脱机,则可以使用 zpool clear 命令清除错误计数。

如果不指定任何参数,则此命令将清除池中的所有设备错误。例如:


# zpool clear tank

如果指定了一个或多个设备,则此命令仅清除与指定设备关联的错误。例如:


# zpool clear tank c1t0d0

有关清除 zpool 错误的更多信息,请参见清除瞬态错误

替换存储池中的设备

可以使用 zpool replace 命令替换存储池中的设备。

如果使用冗余池中同一位置的另一设备以物理方式替换某一设备,则可能只需标识被替换的设备。ZFS 会意识到该设备是某一硬件上同一位置的不同磁盘。例如,要通过删除磁盘并在同一位置替换该磁盘来替换出现故障的磁盘 (c1t1d0),请使用以下语法:


# zpool replace tank c1t1d0

如果用位于不同物理位置的磁盘替换存储池中的设备,则需要指定两个设备。例如:


# zpool replace tank c1t1d0 c1t2d0

如果要替换 ZFS 根池中的磁盘,请参见如何替换 ZFS 根池中的磁盘

下面是替换磁盘的基本步骤:

在某些系统(如 Sun Fire x4500)上,必须先取消磁盘配置,才能使其脱机。如果在该系统的同一插槽位置替换磁盘,则可以仅执行 zpool replace 命令,如本节的第一个示例所示。

有关在 Sun Fire X4500 系统上替换磁盘的示例,请参见示例 11–1

替换 ZFS 存储池中的设备时,请考虑以下几点:

有关更换设备的更多信息,请参见解决缺少设备的问题更换或修复损坏的设备

在存储池中指定热备件

借助热备件功能,可以在一个或多个存储池中确定能用来替换发生故障或失败的磁盘。指定一个设备作为热备件意味着该设备不是池中的活动设备,但如果池中的某一活动设备发生故障,热备件将自动替换该故障设备。

可通过以下方式将设备指定为热备件:

以下示例说明创建池时如何将设备指定为热备件:


# zpool create trinity mirror c1t1d0 c2t1d0 spare c1t2d0 c2t2d0
# zpool status trinity
  pool: trinity
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        trinity     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
        spares
          c1t2d0    AVAIL   
          c2t2d0    AVAIL   

errors: No known data errors

以下示例说明创建池之后如何通过向池中添加设备来指定热备件:


# zpool add neo spare c5t3d0 c6t3d0
# zpool status neo
  pool: neo
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        neo         ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c3t3d0  ONLINE       0     0     0
            c4t3d0  ONLINE       0     0     0
        spares
          c5t3d0    AVAIL   
          c6t3d0    AVAIL   

errors: No known data errors

可使用 zpool remove 命令从存储池中删除热备件。例如:


# zpool remove zeepool c2t3d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zeepool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
        spares
          c1t3d0    AVAIL   

errors: No known data errors

如果存储池当前正在使用热备件,则不能将其删除。

使用 ZFS 热备件时,请考虑以下几点:

在存储池中激活和取消激活热备件

可通过以下方式激活热备件:

通过 zpool replace 命令可以用热备件手动替换设备。请参见示例 4–8

如果热备件可用,将自动替换故障设备。例如:


# zpool status -x
  pool: zeepool
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: resilver completed after 0h0m with 0 errors on Mon Jan 11 10:20:35 2010
config:

        NAME          STATE     READ WRITE CKSUM
        zeepool       DEGRADED     0     0     0
          mirror-0    DEGRADED     0     0     0
            c1t2d0    ONLINE       0     0     0
            spare-1   DEGRADED     0     0     0
              c2t1d0  UNAVAIL      0     0     0  cannot open
              c2t3d0  ONLINE       0     0     0  88.5K resilvered
        spares
          c2t3d0      INUSE     currently in use

errors: No known data errors

目前,取消激活热备件的方法有以下几种:


示例 4–8 用热备件手动替换磁盘

本例使用 zpool replace 命令将磁盘 c2t1d0 替换为热备件 c2t3d0


# zpool replace zeepool c2t1d0 c2t3d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 10:00:50 2010
config:

        NAME          STATE     READ WRITE CKSUM
        zeepool       ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            c1t2d0    ONLINE       0     0     0
            spare-1   ONLINE       0     0     0
              c2t1d0  ONLINE       0     0     0
              c2t3d0  ONLINE       0     0     0  90K resilvered
        spares
          c2t3d0      INUSE     currently in use

errors: No known data errors

然后分离磁盘 c2t1d0


# zpool detach zeepool c2t1d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 10:00:50 2010
config:

        NAME        STATE     READ WRITE CKSUM
        zeepool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0  90K resilvered

errors: No known data errors


示例 4–9 替换故障磁盘后分离热备件

本例使用 zpool replace 命令物理替换磁盘 (c2t1d0) 并通知 ZFS。


# zpool replace zeepool c2t1d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 10:08:44 2010
config:

        NAME          STATE     READ WRITE CKSUM
        zeepool       ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            c1t2d0    ONLINE       0     0     0
            spare-1   ONLINE       0     0     0
              c2t3d0  ONLINE       0     0     0  90K resilvered
              c2t1d0  ONLINE       0     0     0
        spares
          c2t3d0      INUSE     currently in use

errors: No known data errors

然后,您可以使用 zpool detach 命令使热备件回到备件池。例如:


# zpool detach zeepool c2t3d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed with 0 errors on Wed Jan 20 10:08:44 2010
config:

        NAME               STATE     READ WRITE CKSUM
        zeepool            ONLINE       0     0     0
          mirror           ONLINE       0     0     0
            c1t2d0         ONLINE       0     0     0
            c2t1d0         ONLINE       0     0     0
        spares
          c2t3d0           AVAIL

errors: No known data errors


示例 4–10 分离故障磁盘并使用热备件

如果想临时或永久性换入用于替换的热备件,以此替换故障磁盘,则应分离原(故障)磁盘。故障磁盘完成替换后,可以将其再添加到存储池用作备件。例如:


# zpool status zeepool
  pool: zeepool
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: resilver in progress for 0h0m, 70.47% done, 0h0m to go
config:

        NAME          STATE     READ WRITE CKSUM
        zeepool       DEGRADED     0     0     0
          mirror-0    DEGRADED     0     0     0
            c1t2d0    ONLINE       0     0     0
            spare-1   DEGRADED     0     0     0
              c2t1d0  UNAVAIL      0     0     0  cannot open
              c2t3d0  ONLINE       0     0     0  70.5M resilvered
        spares
          c2t3d0      INUSE     currently in use

errors: No known data errors
# zpool detach zeepool c2t1d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 13:46:46 2010
config:

        NAME        STATE     READ WRITE CKSUM
        zeepool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0  70.5M resilvered

errors: No known data errors
(Original failed disk c2t1d0 is physically replaced)
# zpool add zeepool spare c2t1d0
# zpool status zeepool
  pool: zeepool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 13:48:46 2010
config:

        NAME        STATE     READ WRITE CKSUM
        zeepool     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c2t3d0  ONLINE       0     0     0  70.5M resilvered
        spares
          c2t1d0    AVAIL   

errors: No known data errors

管理 ZFS 存储池属性

您可以使用 zpool get 命令来显示池属性信息。例如:


# zpool get all mpool
NAME  PROPERTY       VALUE       SOURCE
pool  size           68G         -
pool  capacity       0%          -
pool  altroot        -           default
pool  health         ONLINE      -
pool  guid           601891032394735745  default
pool  version        22          default
pool  bootfs         -           default
pool  delegation     on          default
pool  autoreplace    off         default
pool  cachefile      -           default
pool  failmode       wait        default
pool  listsnapshots  on          default
pool  autoexpand     off         default
pool  free           68.0G       -
pool  allocated      76.5K       -

可以使用 zpool set 命令设置存储池属性。例如:


# zpool set autoreplace=on mpool
# zpool get autoreplace mpool
NAME  PROPERTY     VALUE    SOURCE
mpool autoreplace  on       default
表 4–1 ZFS 池属性说明

属性名 

类型 

缺省值 

说明 

allocated

字符串 

N/A 

只读值,表示池中物理分配的存储空间量。

altroot

字符串 

off

标识备用根目录。如果进行了设置,则该目录会被前置到池中的任何挂载点。检查未知池时,如果不能信任挂载点,或挂载点在备用根环境中(其中典型的路径无效),则可以使用此属性。

autoreplace

布尔值 

off

控制设备的自动替换。如果设置为 off,则必须使用 zpool replace 命令启动设备替换。如果设置为 on,则会自动对在先前属于池的设备的同一物理位置处找到的任何新设备进行格式化和替换。该属性缩写为 replace

bootfs

布尔值 

N/A 

标识根池的缺省可引导数据集。此属性通常由安装和升级程序进行设置。

cachefile

字符串 

N/A 

控制在何处缓存池配置信息。系统引导时会自动导入高速缓存中的所有池。但是,安装和群集环境可能需要将此信息高速缓存到不同的位置,以便不会自动导入池。可设置此属性以将池配置信息高速缓存于不同位置。以后可以使用 zpool import - c 命令导入此信息。大多数 ZFS 配置不使用此属性。

capacity

数字 

N/A 

用于标识已用池空间百分比的只读值。

此属性的缩写为 cap

delegation

布尔值 

on

控制是否可以向非特权用户授予为数据集定义的访问权限。有关更多信息,请参见第 9 章

failmode

字符串 

wait

控制发生灾难性池故障时的系统行为。这种情况通常是由于失去与底层存储设备的连接或池中所有设备出现故障而导致的。这种事件的行为由下列值之一决定:

  • wait-阻止所有对池的 I/O 请求,直到设备连接恢复且使用 zpool clear 命令清除错误为止。这种状态下,对池的 I/O 操作被阻止,但读操作可能会成功。在设备问题得到解决之前,池一直处于 wait 状态。

  • continue-对任何新的写入 I/O 请求返回 EIO 错误,但允许对其余任何运行状况良好的设备执行读取操作。任何未提交到磁盘的写入请求都会被阻止。重新连接或替换设备后,必须使用 zpool clear 命令清除错误。

  • 恐慌–向控制台打印一则消息并产生系统崩溃转储。

free

字符串 

N/A 

只读值,表示池中未分配的块数。

guid

字符串 

N/A 

用于标识池的唯一标识符的只读属性。

health

字符串 

N/A 

用于标识池的当前运行状况(例如 ONLINE、DEGRADED、FAULTED、OFFLINE、REMOVED 或 UNAVAIL)的只读属性。

listsnapshots

字符串 

on

控制使用 zfs list 命令是否可显示与此池有关的快照信息。如果禁用了此属性,可以通过 zfs list -t snapshot 命令显示快照信息。

size

数字 

N/A 

用于标识存储池总大小的只读属性。

version

数字 

N/A 

标识池的当前盘上版本。尽管在为了实现向后兼容性而需要一个特定版本时可以使用此属性,但首选的池更新方法是使用 zpool upgrade 命令。可以将此属性设置为 1 与 zpool upgrade -v 命令所报告的当前版本之间的任何数值。

查询 ZFS 存储池的状态

zpool list 命令提供了多种方法来请求有关池状态的信息。可用信息通常分为以下三个类别: 基本使用情况信息、I/O 统计信息和运行状况。本节介绍了所有这三种类型的存储池信息。

显示有关 ZFS 存储池的信息

可以使用 zpool list 命令显示有关池的基本信息。

列出有关所有存储池或特定池的信息

不带任何参数时,zpool list 命令显示有关系统上所有池的下列信息。


# zpool list
NAME                    SIZE    ALLOC   FREE    CAP  HEALTH     ALTROOT
tank                   80.0G   22.3G   47.7G    28%  ONLINE     -
dozer                   1.2T    384G    816G    32%  ONLINE     -

此命令输出显示以下信息:

NAME

池的名称。

SIZE

池的总大小,等于所有顶层虚拟设备大小的总和。

ALLOC

分配给所有数据集和内部元数据的物理空间量。请注意,此数量与在文件系统级别报告的磁盘空间量不同。

有关确定可用文件系统空间的更多信息,请参见ZFS 磁盘空间记帐

FREE

池中未分配的空间量。

CAP (CAPACITY)

已用磁盘空间量,以总磁盘空间的百分比表示。

HEALTH

池的当前运行状况。

有关池运行状况的更多信息,请参见确定 ZFS 存储池的运行状况

ALTROOT

池的备用根(如有)。

有关备用根池的更多信息,请参见使用 ZFS 备用根池

另外,也可以通过指定池的名称来收集特定池的统计信息。例如:


# zpool list tank
NAME                    SIZE    ALLOC   FREE    CAP   HEALTH     ALTROOT
tank                   80.0G    22.3G   47.7G    28%  ONLINE     -

列出特定的存储池统计信息

可以使用 -o 选项请求特定的统计信息。使用此选项可以生成自定义报告或快速列出相关信息。例如,要仅列出每个池的名称和大小,可使用以下语法:


# zpool list -o name,size
NAME                    SIZE
tank                   80.0G
dozer                   1.2T

列名称与列出有关所有存储池或特定池的信息中列出的属性相对应。

使用脚本处理 ZFS 存储池输出

zpool list 命令的缺省输出旨在提高可读性,因此不能轻易用作 shell 脚本的一部分。为了便于在程序中使用该命令,可以使用 -H 选项以便不显示列标题,并使用制表符而不是空格分隔字段。例如,要请求系统中所有池的名称列表,可以使用以下语法:


# zpool list -Ho name
tank
dozer

以下是另一个示例:


# zpool list -H -o name,size
tank   80.0G
dozer  1.2T

显示 ZFS 存储池命令历史记录

ZFS 会自动记录成功的 zfszpool 命令(用于修改池状态信息)。使用 zpool history 命令可显示此信息。

例如,以下语法显示了根池的命令输出:


# zpool history
History for 'rpool':
2010-05-11.10:18:54 zpool create -f -o failmode=continue -R /a -m legacy -o 
cachefile=/tmp/root/etc/zfs/zpool.cache rpool mirror c1t0d0s0 c1t1d0s0
2010-05-11.10:18:55 zfs set canmount=noauto rpool
2010-05-11.10:18:55 zfs set mountpoint=/rpool rpool
2010-05-11.10:18:56 zfs create -o mountpoint=legacy rpool/ROOT
2010-05-11.10:18:57 zfs create -b 8192 -V 2048m rpool/swap
2010-05-11.10:18:58 zfs create -b 131072 -V 1536m rpool/dump
2010-05-11.10:19:01 zfs create -o canmount=noauto rpool/ROOT/zfsBE
2010-05-11.10:19:02 zpool set bootfs=rpool/ROOT/zfsBE rpool
2010-05-11.10:19:02 zfs set mountpoint=/ rpool/ROOT/zfsBE
2010-05-11.10:19:03 zfs set canmount=on rpool
2010-05-11.10:19:04 zfs create -o mountpoint=/export rpool/export
2010-05-11.10:19:05 zfs create rpool/export/home
2010-05-11.11:11:10 zpool set bootfs=rpool rpool
2010-05-11.11:11:10 zpool set bootfs=rpool/ROOT/zfsBE rpool

您可以使用有关系统的类似输出来确定对错误状况进行故障排除时所执行的确切 ZFS 命令。

历史记录日志有如下特点:

要确定特定存储池的命令历史记录,请使用类似以下内容的语法:


# zpool history tank
History for 'tank':
2010-05-13.14:13:15 zpool create tank mirror c1t2d0 c1t3d0
2010-05-13.14:21:19 zfs create tank/snaps
2010-05-14.08:10:29 zfs create tank/ws01
2010-05-14.08:10:54 zfs snapshot tank/ws01@now
2010-05-14.08:11:05 zfs clone tank/ws01@now tank/ws01bugfix

可使用 -l 选项显示长格式(包括用户名、主机名和执行操作的区域)。例如:


# zpool history -l tank
History for 'tank':
2010-05-13.14:13:15 zpool create tank mirror c1t2d0 c1t3d0 [user root on neo]
2010-05-13.14:21:19 zfs create tank/snaps [user root on neo]
2010-05-14.08:10:29 zfs create tank/ws01 [user root on neo]
2010-05-14.08:10:54 zfs snapshot tank/ws01@now [user root on neo]
2010-05-14.08:11:05 zfs clone tank/ws01@now tank/ws01bugfix [user root on neo]

可使用 -i 选项显示可用于诊断目的的内部事件信息。例如:


# zpool history -i tank
2010-05-13.14:13:15 zpool create -f tank mirror c1t2d0 c1t23d0
2010-05-13.14:13:45 [internal pool create txg:6] pool spa 19; zfs spa 19; zpl 4;...
2010-05-13.14:21:19 zfs create tank/snaps
2010-05-13.14:22:02 [internal replay_inc_sync txg:20451] dataset = 41
2010-05-13.14:25:25 [internal snapshot txg:20480] dataset = 52
2010-05-13.14:25:25 [internal destroy_begin_sync txg:20481] dataset = 41
2010-05-13.14:25:26 [internal destroy txg:20488] dataset = 41
2010-05-13.14:25:26 [internal reservation set txg:20488] 0 dataset = 0
2010-05-14.08:10:29 zfs create tank/ws01
2010-05-14.08:10:54 [internal snapshot txg:53992] dataset = 42
2010-05-14.08:10:54 zfs snapshot tank/ws01@now
2010-05-14.08:11:04 [internal create txg:53994] dataset = 58
2010-05-14.08:11:05 zfs clone tank/ws01@now tank/ws01bugfix

查看 ZFS 存储池的 I/O 统计信息

要请求池或特定虚拟设备的 I/O 统计信息,请使用 zpool iostat 命令。与 iostat 命令类似,此命令也可以显示所有 I/O 活动的静态快照,以及每个指定时间间隔的更新统计信息。报告的统计信息如下:

alloc capacity

当前存储在池或设备中的数据量。由于具体的内部实现的原因,此数量与可供实际文件系统使用的磁盘空间量有少量差异。

有关池空间与数据集空间之间的差异的更多信息,请参见ZFS 磁盘空间记帐

free capacity

池或设备中的可用磁盘空间量。与 used 统计信息一样,这与可供数据集使用的磁盘空间量也有少量差异。

read operations

发送到池或设备的读取 I/O 操作数,包括元数据请求。

write operations

发送到池或设备的写入 I/O 操作数。

read bandwidth

所有读取操作(包括元数据)的带宽,以每秒单位数表示。

write bandwidth

所有写入操作的带宽,以每秒单位数表示。

列出池范围的 I/O 统计信息

如果不使用任何选项,则 zpool iostat 命令会显示自引导以来系统中所有池的累积统计信息。例如:


# zpool iostat
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
rpool       6.05G  61.9G      0      0    786    107
tank        31.3G  36.7G      4      1   296K  86.1K
----------  -----  -----  -----  -----  -----  -----

由于这些统计信息是自引导以来累积的,因此,如果池相对空闲,则带宽可能显示为较低。通过指定时间间隔,可以请求查看更准确的当前带宽使用情况。例如:


# zpool iostat tank 2
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank        18.5G  49.5G      0    187      0  23.3M
tank        18.5G  49.5G      0    464      0  57.7M
tank        18.5G  49.5G      0    457      0  56.6M
tank        18.8G  49.2G      0    435      0  51.3M

在本示例中,此命令显示了池 tank 的使用情况统计信息,每隔两秒显示一次,直到键入 Ctrl-C 组合键为止。或者,也可以再指定 count 参数,该参数用于使命令在指定的重复次数之后终止。例如, zpool iostat 2 3 每隔两秒列显一次摘要信息,重复三次,共六秒。如果仅有一个池,则会在连续的行上显示统计信息。如果存在多个池,则用附加虚线分隔每次重复,以提供直观的分隔效果。

列出虚拟设备 I/O 统计信息

除了池范围的 I/O 统计信息外,zpool iostat 命令还可以显示虚拟设备的 I/O 统计信息。此命令可用于识别异常缓慢的设备,或者观察 ZFS 生成的 I/O 的分布情况。要请求完整的虚拟设备布局以及所有 I/O 统计信息,请使用 zpool iostat -v 命令。例如:


# zpool iostat -v
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
rpool       6.05G  61.9G      0      0    785    107
  mirror    6.05G  61.9G      0      0    785    107
    c1t0d0s0    -      -      0      0    578    109
    c1t1d0s0    -      -      0      0    595    109
----------  -----  -----  -----  -----  -----  -----
tank        36.5G  31.5G      4      1   295K   146K
  mirror    36.5G  31.5G    126     45  8.13M  4.01M
    c1t2d0      -      -      0      3   100K   386K
    c1t3d0      -      -      0      3   104K   386K
----------  -----  -----  -----  -----  -----  -----

查看虚拟设备的 I/O 统计信息时,必须注意以下两点:

检查虚拟设备统计信息时,可以使用相同的一组选项(时间间隔和计次)。

确定 ZFS 存储池的运行状况

ZFS 提供了一种检查池和设备运行状况的集成方法。池的运行状况是根据其所有设备的状态确定的。使用 zpool status 命令可以显示此状态信息。此外,池和设备的潜在故障由 fmd 报告,显示在系统控制台上,并记录于 /var/adm/messages 文件中。

本节介绍如何确定池和设备的运行状况。本章不介绍如何修复运行不良的池或从其恢复。有关故障排除和数据恢复的更多信息,请参见第 11 章

每个设备都可以处于以下状态之一:

ONLINE

设备或虚拟设备处于正常工作状态。尽管仍然可能会出现一些瞬态错误,但是设备在其他方面处于正常工作状态。

DEGRADED

虚拟设备出现过故障,但仍能工作。此状态在镜像或 RAID-Z 设备缺少一个或多个组成设备时最为常见。池的容错能力可能会受到损害,因为另一个设备中的后续故障可能无法恢复。

FAULTED

设备或虚拟设备完全无法访问。此状态通常表示设备出现全面故障,以致于 ZFS 无法向该设备发送数据或从该设备接收数据。如果顶层虚拟设备处于此状态,则完全无法访问池。

OFFLINE

管理员已将设备显式脱机。

UNAVAIL

无法打开设备或虚拟设备。在某些情况下,包含 UNAVAIL 设备的池会以 DEGRADED 模式显示。如果顶层虚拟设备的状态为 UNAVAIL,则无法访问池中的任何设备。

REMOVED

系统正在运行时已物理移除了该设备。设备移除检测依赖于硬件,而且并非在所有平台上都受支持。

池的运行状况是根据其所有顶层虚拟设备的运行状况确定的。如果所有虚拟设备状态都为 ONLINE,则池的状态也为 ONLINE。如果任何一个虚拟设备状态为 DEGRADEDUNAVAIL,则池的状态也为 DEGRADED。如果顶层虚拟设备的状态为 FAULTEDOFFLINE,则池的状态也为 FAULTED。处于 FAULTED 状态的池完全无法访问。附加或修复必需的设备后,才能恢复数据。处于 DEGRADED 状态的池会继续运行,但是,如果池处于联机状态,则可能无法实现相同级别的数据冗余或数据吞吐量。

基本的存储池运行状况

使用 zpool status 命令可以快速查看池运行状态,如下所示:


# zpool status -x
all pools are healthy

通过在命令语法中指定池名称,可以检查特定池。如下节所述,应检查不处于 ONLINE 状态的所有池是否存在潜在的问题。

详细运行状况

使用 -v 选项可以请求更详细的运行状况摘要。例如:


# zpool status -v tank
  pool: tank
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: scrub completed after 0h0m with 0 errors on Wed Jan 20 15:13:59 2010
config:

        NAME        STATE     READ WRITE CKSUM
        tank        DEGRADED     0     0     0
          mirror-0  DEGRADED     0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t1d0  UNAVAIL      0     0     0  cannot open

errors: No known data errors

此输出显示了池处于其当前状态的原因的完整说明,其中包括问题的易读说明,以及指向知识文章(用于了解更多信息)的链接。每篇知识文章都提供了有关从当前问题恢复的最佳方法的最新信息。使用详细的配置信息,您可以确定哪个设备已损坏以及如何修复池。

在以上示例中,故障设备应该被替换。替换该设备后,请使用 zpool online 命令使设备联机。例如:


# zpool online tank c1t0d0
Bringing device c1t0d0 online
# zpool status -x
all pools are healthy

如果启用了 autoreplace 属性,则您可能不必使被替换的设备联机。

如果池包含脱机设备,则命令输出将标识有问题的池。例如:


# zpool status -x
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Online the device using 'zpool online' or replace the device with
        'zpool replace'.
 scrub: resilver completed after 0h0m with 0 errors on Wed Jan 20 15:15:09 2010
config:

        NAME        STATE     READ WRITE CKSUM
        tank        DEGRADED     0     0     0
          mirror-0  DEGRADED     0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t1d0  OFFLINE      0     0     0  48K resilvered

errors: No known data errors

READWRITE 列提供了在设备上出现的 I/O 错误的计数,而 CKSUM 列则提供了在设备上出现的无法更正的校验和错误的计数。这两种错误计数指示可能的设备故障,并且需要执行更正操作。如果针对顶层虚拟设备报告了非零错误,则表明部分数据可能无法访问。

errors: 字段标识任何已知的数据错误。

在以上示例输出中,脱机设备不会导致数据错误。

有关诊断和修复故障池和数据的更多信息,请参见第 11 章

迁移 ZFS 存储池

有时,可能需要在系统之间移动存储池。为此,必须将存储设备与原始系统断开,然后将其重新连接到目标系统。可以通过以下方法完成此任务:以物理方式重新为设备布线,或者使用多端口设备(如 SAN 中的设备)。使用 ZFS 可将池从一台计算机中导出,然后将其导入目标系统,即使这该系统采用不同的字节存储顺序 (endianness)。有关在不同存储池(可能驻留在不同的计算机上)之间复制或迁移文件系统的信息,请参见发送和接收 ZFS 数据

准备迁移 ZFS 存储池

应显式导出存储池,以表明可随时将其迁移。此操作会将任何未写入的数据刷新到磁盘,将数据写入磁盘以表明导出已完成,并从系统中删除有关池的所有信息。

如果不显式导出池,而是改为手动删除磁盘,则仍可以在其他系统中导入生成的池。但是,可能会丢失最后几秒的数据事务,并且由于设备不再存在,该池在原始系统中可能会显示为处于故障状态。缺省情况下,目标系统无法导入未显式导出的池。为防止意外导入包含仍在其他系统中使用的网络连接存储器的活动池,此条件是必要的。

导出 ZFS 存储池

要导出池,请使用 zpool export 命令。例如:


# zpool export tank

此命令将尝试取消挂载池中任何已挂载的文件系统,然后再继续执行。如果无法取消挂载任何文件系统,则可以使用 -f 选项强制取消挂载这些文件系统。例如:


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

执行此命令后,池 tank 在系统中即不再可见。

如果在导出时设备不可用,则无法将设备标识为正常导出。如果之后将某个这样的设备附加到不包含任何工作设备的系统中,则该设备的状态会显示为“可能处于活动状态”。

如果 ZFS 卷在池中处于使用状态,即使使用 -f 选项,也无法导出池。要导出包含 ZFS 卷的池,请首先确保卷的所有使用者都不再处于活动状态。

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

确定要导入的可用存储池

从系统中删除池后(通过显式导出或通过强制删除设备),可以将设备附加到目标系统。ZFS 可以处理仅有其中一些设备可用的情况,但池迁移成功与否取决于设备的整体运行状况。此外,没有必要使用相同的设备名称附加设备。ZFS 可检测任何移动的或重命名的设备,并相应地调整配置。要搜索可用的池,请运行不带任何选项的 zpool import 命令。例如:


# zpool import
 pool: tank
    id: 11809215114195894163
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        tank        ONLINE
          mirror-0  ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE

在本示例中,池 tank 可用于在目标系统中导入。每个池都由一个名称以及唯一的数字标识符标识。如果有多个同名池可用于导入,则可以使用数字标识符对其进行区分。

zpool status 命令输出类似,zpool import 输出也会包括一个知识文章链接,其中包含有关禁止导入池这一问题的修复过程的最新信息。在此示例中,用户可以强制导入池。但是,如果导入当前正由其他系统通过存储网络使用的池,则可能导致数据损坏和出现紧急情况,因为这两个系统都尝试写入同一存储器。如果池中的某些设备不可用,但是存在足够的冗余数据可确保池可用,则池会显示 DEGRADED 状态。例如:


# zpool import
  pool: tank
    id: 11809215114195894163
 state: DEGRADED
status: One or more devices are missing from the system.
action: The pool can be imported despite missing or damaged devices.  The
        fault tolerance of the pool may be compromised if imported.
   see: http://www.sun.com/msg/ZFS-8000-2Q
config:

        NAME        STATE     READ WRITE CKSUM
        tank        DEGRADED     0     0     0
          mirror-0  DEGRADED     0     0     0
            c1t0d0  UNAVAIL      0     0     0  cannot open
            c1t3d0  ONLINE       0     0     0

在本示例中,第一个磁盘已损坏或缺失,但仍可以导入池,这是因为仍可以访问镜像数据。如果存在过多故障设备或缺失设备,则无法导入池。例如:


# zpool import
  pool: dozer
    id: 9784486589352144634
 state: FAULTED
action: The pool cannot be imported. Attach the missing
        devices and try again.
   see: http://www.sun.com/msg/ZFS-8000-6X
config:
        raidz1-0       FAULTED
          c1t0d0       ONLINE
          c1t1d0       FAULTED
          c1t2d0       ONLINE
          c1t3d0       FAULTED

在本示例中,RAID-Z 虚拟设备中缺少两个磁盘,这意味着没有足够的可用冗余数据来重新构建池。在某些情况下,没有足够的设备就无法确定完整的配置。在这种情况下,虽然 ZFS 会尽可能多地报告有关该情况的信息,但是 ZFS 无法确定池中包含的其他设备。例如:


# zpool import
pool: dozer
    id: 9784486589352144634
 state: FAULTED
status: One or more devices are missing from the system.
action: The pool cannot be imported. Attach the missing
        devices and try again.
   see: http://www.sun.com/msg/ZFS-8000-6X
config:
        dozer          FAULTED   missing device
          raidz1-0     ONLINE
            c1t0d0     ONLINE
            c1t1d0     ONLINE
            c1t2d0     ONLINE
            c1t3d0     ONLINE
Additional devices are known to be part of this pool, though their
exact configuration cannot be determined.

从替换目录导入 ZFS 存储池

缺省情况下,zpool import 命令仅在 /dev/dsk 目录中搜索设备。如果设备存在于其他目录中,或者使用的是文件支持的池,则必须使用 -d 选项搜索其他目录。例如:


# zpool create dozer mirror /file/a /file/b
# zpool export dozer
# zpool import -d /file
  pool: dozer
    id: 7318163511366751416
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        dozer        ONLINE
          mirror-0   ONLINE
            /file/a  ONLINE
            /file/b  ONLINE
# zpool import -d /file dozer

如果设备存在于多个目录中,则可以指定多个 -d 选项。

导入 ZFS 存储池

确定要导入的池后,即可通过将该池的名称或者其数字标识符指定为 zpool import 命令的参数来将其导入。例如:


# zpool import tank

如果多个可用池具有相同名称,则必须使用数字标识符指定要导入的池。例如:


# zpool import
  pool: dozer
    id: 2704475622193776801
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        dozer       ONLINE
          c1t9d0    ONLINE

  pool: dozer
    id: 6223921996155991199
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        dozer       ONLINE
          c1t8d0    ONLINE
# zpool import dozer
cannot import 'dozer': more than one matching pool
import by numeric ID instead
# zpool import 6223921996155991199

如果该池的名称与现有的池名称冲突,则可以使用其他名称导入该池。例如:


# zpool import dozer zeepool

此命令使用新名称 zeepool 导入已导出的池 dozer

如果池未正常导出,则 ZFS 需要使用 -f 标志,以防止用户意外导入仍在其他系统中使用的池。例如:


# zpool import dozer
cannot import 'dozer': pool may be in use on another system
use '-f' to import anyway
# zpool import -f dozer

注 –

请勿尝试将一个系统上处于活动状态的池导入到另一个系统。ZFS 不是本机簇、分布式或平行文件系统,不能从多个不同主机进行并发访问。


也可以使用 -R 选项在备用根下导入池。有关备用根池的更多信息,请参见使用 ZFS 备用根池

恢复已销毁的 ZFS 存储池

可以使用 zpool import -D 命令恢复已销毁的存储池。例如:


# zpool destroy tank
# zpool import -D
  pool: tank
    id: 5154272182900538157
 state: ONLINE (DESTROYED)
action: The pool can be imported using its name or numeric identifier.
config:

        tank        ONLINE
          mirror-0  ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE

在此 zpool import 输出中,由于包含以下状态信息,因此可以将池 tank 确定为已销毁的池:


state: ONLINE (DESTROYED)

要恢复已销毁的池,请再次执行 zpool import -D 命令,并指定要恢复的池。例如:


# zpool import -D tank
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE
          mirror-0  ONLINE
            c1t0d0  ONLINE
            c1t1d0  ONLINE

errors: No known data errors

如果已销毁池中的某个设备出现故障或不可用,通过添加 -f 选项也许能够恢复已销毁的池。在此情况下,请导入已降级的池,然后尝试修复设备故障。例如:


# zpool destroy dozer
# zpool import -D
pool: dozer
    id: 13643595538644303788
 state: DEGRADED (DESTROYED)
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
config:

        NAME         STATE     READ WRITE CKSUM
        dozer        DEGRADED     0     0     0
          raidz2-0   DEGRADED     0     0     0
            c2t8d0   ONLINE       0     0     0
            c2t9d0   ONLINE       0     0     0
            c2t10d0  ONLINE       0     0     0
            c2t11d0  UNAVAIL      0    35     1  cannot open
            c2t12d0  ONLINE       0     0     0

errors: No known data errors
# zpool import -Df dozer
# zpool status -x
  pool: dozer
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: scrub completed after 0h0m with 0 errors on Thu Jan 21 15:38:48 2010
config:

        NAME         STATE     READ WRITE CKSUM
        dozer        DEGRADED     0     0     0
          raidz2-0   DEGRADED     0     0     0
            c2t8d0   ONLINE       0     0     0
            c2t9d0   ONLINE       0     0     0
            c2t10d0  ONLINE       0     0     0
            c2t11d0  UNAVAIL      0    37     0  cannot open
            c2t12d0  ONLINE       0     0     0

errors: No known data errors
# zpool online dozer c2t11d0
Bringing device c2t11d0 online
# zpool status -x
all pools are healthy

升级 ZFS 存储池

如果您具有先前的 Solaris 发行版(如 Solaris 10 10/09 发行版)的 ZFS 存储池,则可使用 zpool upgrade 命令升级池,以利用当前发行版中的池功能。此外,zpool status 命令已经修改,可在池运行较早的版本时发出通知。例如:


# zpool status
  pool: tank
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.
 scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t0d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
errors: No known data errors

可以使用以下语法来确定有关特殊版本和支持的发行版的其他信息:


# zpool upgrade -v
This system is currently running ZFS pool version 22.

The following versions are supported:

VER  DESCRIPTION
---  --------------------------------------------------------
 1   Initial ZFS version
 2   Ditto blocks (replicated metadata)
 3   Hot spares and double parity RAID-Z
 4   zpool history
 5   Compression using the gzip algorithm
 6   bootfs pool property
 7   Separate intent log devices
 8   Delegated administration
 9   refquota and refreservation properties
 10  Cache devices
 11  Improved scrub performance
 12  Snapshot properties
 13  snapused property
 14  passthrough-x aclinherit
 15  user/group space accounting
 16  stmf property support
 17  Triple-parity RAID-Z
 18  Snapshot user holds
 19  Log device removal
 20  Compression using zle (zero-length encoding)
 21  Reserved
 22  Received properties

For more information on a particular version, including supported releases,
see the ZFS Administration Guide.

然后,可通过运行 zpool upgrade 命令来升级所有池。例如:


# zpool upgrade -a

注 –

如果将池升级到更高的 ZFS 版本,则在运行较早 ZFS 版本的系统中将无法访问该池。