Oracle Solaris ZFS 管理指南

创建和销毁 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 存储池