JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11.1 管理:ZFS 文件系统     Oracle Solaris 11.1 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

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

2.  Oracle Solaris ZFS 入门

3.  管理 Oracle Solaris ZFS 存储池

ZFS 存储池的组件

使用 ZFS 存储池中的磁盘

使用 ZFS 存储池中的分片

使用 ZFS 存储池中的文件

ZFS 存储池的注意事项

ZFS 存储池的复制功能

镜像存储池配置

RAID-Z 存储池配置

ZFS 混合存储池

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

存储池中的动态条带化

创建和销毁 ZFS 存储池

创建 ZFS 存储池

创建基本存储池

创建镜像存储池

创建 ZFS 根池

创建 RAID-Z 存储池

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

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

创建存储池的注意事项

显示存储池虚拟设备信息

处理 ZFS 存储池创建错误

检测使用中的设备

不匹配的复制级别

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

存储池的缺省挂载点

销毁 ZFS 存储池

销毁包含不可用设备的池

管理 ZFS 存储池中的设备

向存储池中添加设备

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

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

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

使设备脱机

使设备联机

清除存储池设备错误

替换存储池中的设备

在存储池中指定热备件

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

管理 ZFS 存储池属性

查询 ZFS 存储池的状态

显示有关 ZFS 存储池的信息

显示有关所有存储池或某个特定池的信息

按物理位置显示池设备

显示特定的存储池统计信息

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

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

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

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

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

确定 ZFS 存储池的运行状况

基本的存储池运行状况

详细运行状况

收集 ZFS 存储池状态信息

迁移 ZFS 存储池

准备迁移 ZFS 存储池

导出 ZFS 存储池

确定要导入的可用存储池

从替换目录导入 ZFS 存储池

导入 ZFS 存储池

导入缺少日志设备的池

在只读模式下导入池

通过特定的设备路径导入池

恢复已销毁的 ZFS 存储池

升级 ZFS 存储池

4.  管理 ZFS 根池组件

5.  管理 Oracle Solaris ZFS 文件系统

6.  使用 Oracle Solaris ZFS 快照和克隆

7.  使用 ACL 和属性保护 Oracle Solaris ZFS 文件

8.  Oracle Solaris ZFS 委托管理

9.  Oracle Solaris ZFS 高级主题

10.  Oracle Solaris ZFS 故障排除和池恢复

11.  归档快照和根池恢复

12.  建议的 Oracle Solaris ZFS 做法

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

有关建议的镜像配置的更多信息,请参见第 12 章

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

不能直接从镜像存储池中移除非备用设备、非日志设备或非缓存设备。

创建 ZFS 根池

请考虑以下根池配置要求:

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

创建 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 c8t0d0
# 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
            c8t0d0  ONLINE       0     0     0
errors: No known data errors

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

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

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

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

为了满足对同步事务的 POSIX 要求,提供了 ZFS 意图日志 (ZFS intent log, ZIL)。例如,数据库通常要求其事务在从系统调用中返回时应该在稳定的存储设备上。NFS 和其他应用程序还可以使用 fsync() 来确保数据稳定性。

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

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

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

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

# zpool create datap mirror c0t5000C500335F95E3d0 c0t5000C500335F907Fd0 mirror
c0t5000C500335BD117d0 c0t5000C500335DC60Fd0 log mirror c0t5000C500335E106Bd0 c0t5000C500335FC3E7d0
# 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
            c0t5000C500335F95E3d0  ONLINE       0     0     0
            c0t5000C500335F907Fd0  ONLINE       0     0     0
          mirror-1                 ONLINE       0     0     0
            c0t5000C500335BD117d0  ONLINE       0     0     0
            c0t5000C500335DC60Fd0  ONLINE       0     0     0
        logs
          mirror-2                 ONLINE       0     0     0
            c0t5000C500335E106Bd0  ONLINE       0     0     0
            c0t5000C500335FC3E7d0  ONLINE       0     0     0

errors: No known data errors

有关从日志设备故障中进行恢复的信息,请参见示例 10-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

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

# zpool iostat -v pool 5

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

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

创建存储池的注意事项

创建和管理 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 卷的一部分。

导出的 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 存储池


如果使用 zpool destroy 命令销毁池,该池仍可用于导入,如恢复已销毁的 ZFS 存储池中所述。这意味着属于该池的磁盘上的机密数据可能仍可用。如果希望将已销毁池的磁盘上的数据销毁,必须对已销毁池中的每个磁盘使用类似于 format 实用程序的 analyze->purge 选项的功能。

使文件系统数据保密的另一种方法是创建加密的 ZFS 文件系统。采用加密文件系统的池被销毁后,即使恢复了已销毁的池,在没有加密密钥的情况下也无法访问其中的数据。有关更多信息,请参见加密 ZFS 文件系统

销毁包含不可用设备的池

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

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

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

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

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