本章介绍如何创建和管理 Oracle Solaris 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)来指定磁盘。例如,以下是有效的磁盘名称:
c1t0d0
/dev/dsk/c1t0d0
/dev/foo/disk
创建 ZFS 存储池的最简单方法是使用整个物理磁盘。在从磁盘片、硬件 RAID 阵列中的 LUN 或基于软件的卷管理器所提供的卷中生成池时,无论从管理、可靠性还是性能的角度而言,ZFS 配置都变得越来越复杂。以下注意事项可能有助于确定如何用其他硬件或软件存储解决方案来配置 ZFS:
如果在硬件 RAID 阵列中的 LUN 上构建 ZFS 配置,则需要了解 ZFS 冗余功能与该阵列所提供的冗余功能之间的关系。有些配置可能会提供足够的冗余和性能,而其他配置可能不会提供足够的冗余和性能。
可以使用基于软件的卷管理器(如 Solaris 卷管理器 (Solaris Volume Manager, SVM) 或 Veritas 卷管理器 (Veritas Volume Manager, VxVM))所提供的卷来为 ZFS 构建逻辑设备。但是,建议不要使用这些配置。尽管 ZFS 可在这类设备上正常运行,但结果可能是实际性能低于最佳性能。
有关存储池建议的其他信息,请参见 ZFS 最佳做法站点:
http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide
磁盘由其路径及其设备 ID(如果可用)标识。在设备 ID 信息可用的系统上,这种标识方法允许重新配置设备而无需更新 ZFS。由于设备 ID 生成和管理可能因系统而异,因此应在移动设备之前导出池,例如在将磁盘从一个控制器移动到另一个控制器之前。诸如固件更新或其它硬件变化之类的系统事件可能会更改 ZFS 存储池中的设备 ID,导致设备不可用。
创建包含磁盘片的存储池时,可以使用传统的 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 还允许将 UFS 文件用作存储池中的虚拟设备。此功能主要用于测试和启用简单的实验,而不是用于生产。原因是文件的任何使用都依赖于底层文件系统以实现一致性。如果创建了由 UFS 文件系统中的文件支持的 ZFS 池,则会隐式依赖于 UFS 来保证正确性和同步语义。
但是,如果首次试用 ZFS,或者在没有足够的物理设备时尝试更复杂的配置,则文件会非常有用。所有文件必须以完整路径的形式指定,并且大小至少为 64 MB。
ZFS 在镜像配置和 RAID-Z 配置中提供数据冗余和自我修复属性。
镜像存储池配置至少需要两个磁盘,而且磁盘最好位于不同的控制器上。可以在一个镜像配置中使用许多磁盘。此外,还可以在每个池中创建多个镜像。从概念上讲,简单的镜像配置与以下内容类似:
mirror c1t0d0 c2t0d0 |
从概念上讲,更复杂的镜像配置与以下内容类似:
mirror c1t0d0 c2t0d0 c3t0d0 mirror c4t0d0 c5t0d0 c6t0d0 |
有关创建镜像存储池的信息,请参见创建镜像存储池。
除镜像存储池配置外,ZFS 还提供具有单/双/三奇偶校验容错性的 RAID-Z 配置。单奇偶校验 RAID-Z (raidz 或 raidz1) 与 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
Oracle Sun Storage 7000 产品系列所提供的 ZFS 混合存储池是一种组合了 DRAM、SSD 和 HDD 的特殊存储池,可以提高性能、增加容量并降低能耗。通过此产品的管理界面,您可以选择存储池的 ZFS 冗余配置,并轻松管理其他配置选项。
有关此产品的更多信息,请参见《Sun Storage Unified Storage System 管理指南》。
ZFS 在镜像配置或 RAID-Z 配置中提供了自我修复数据。
检测到坏的数据块时,ZFS 不仅会从另一个冗余副本中提取正确的数据,还会通过将错误数据替换为正确的副本对其进行修复。
ZFS 以条带形式将数据动态分布在所有顶层虚拟设备上。由于是在写入时确定放置数据的位置,因此在分配时不会创建固定宽度的条带。
向池中添加新虚拟设备时,ZFS 会将数据逐渐分配给新设备,以便维护性能和磁盘空间分配策略。每个虚拟设备也可以是包含其他磁盘设备或文件的镜像或 RAID-Z 设备。使用此配置,可以灵活地控制池的故障特征。例如,可以通过 4 个磁盘创建以下配置:
使用动态条带化的四个磁盘
一个四向 RAID-Z 配置
使用动态条带化的两个双向镜像
虽然 ZFS 支持一个池包含不同类型的虚拟设备,但应避免这种做法。例如,可以创建一个包含一个双向镜像和一个三向 RAID-Z 配置的池。但是,容错能力几乎与最差的虚拟设备(在本示例中为 RAID-Z)相同。最佳做法是使用相同类型的顶层虚拟设备,并且每个设备的冗余级别相同。
以下各节介绍创建和销毁 ZFS 存储池的不同情况:
可以快速轻松地创建和销毁池。但是,执行这些操作务必谨慎。虽然进行了检查,以防止在新的池中使用现已使用的设备,但是 ZFS 无法始终知道设备何时已在使用中。存储池销毁容易创建难。请谨慎使用 zpool destroy。这个简单的命令会产生严重的后果。
要创建存储池,请使用 zpool create 命令。此命令采用池名称和任意数目的虚拟设备作为参数。池名称必须符合ZFS 组件命名要求中的命名要求。
以下命令创建了一个名为 tank 的新池,该池由磁盘 c1t0d0 和 c1t1d0 组成:
# 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 镜像配置中支持以下操作:
向现有镜像配置中添加用于其他顶层虚拟设备 (vdev) 的另一组磁盘。有关更多信息,请参见向存储池中添加设备。
向现有镜像配置中附加其他磁盘。或者,向非复制配置中附加其他磁盘,以创建镜像配置。有关更多信息,请参见附加和分离存储池中的设备。
只要替换磁盘的大小大于或等于要被替换的设备,便可替换现有镜像配置中的一个或多个磁盘。有关更多信息,请参见替换存储池中的设备。
只要剩余设备可为配置提供足够冗余,便可分离镜像配置中的磁盘。有关更多信息,请参见附加和分离存储池中的设备。
通过分离其中一个磁盘来分割镜像配置,以创建新的相同池。有关更多信息,请参见通过分割镜像 ZFS 存储池创建新池。
不能直接从镜像存储池中移除非日志或缓存设备。对于此功能,已经申请了 RFE(请求提高)。
您可以从 ZFS 根文件系统进行安装和引导。查看以下根池配置信息:
用于根池的磁盘必须有 VTOC (SMI) 标签,并且必须使用磁盘片创建池。
根池必须作为镜像配置或单磁盘配置创建。不能使用 zpool add 命令添加其他磁盘以创建多个镜像顶层虚拟设备,但可以使用 zpool attach 命令扩展镜像虚拟设备。
不支持 RAID-Z 或条带化配置.
根池不能有单独的日志设备。
如果您尝试使用不受支持的根池配置,将会看到类似如下的消息:
ERROR: ZFS pool <pool-name> does not support boot environments |
# zpool add -f rpool log c0t6d0s0 cannot add to 'rpool': root pool can not have multiple vdevs or separate logs |
有关安装和引导 ZFS 根文件系统的更多信息,请参见第 5 章。
创建单奇偶校验 RAID-Z 池与创建镜像池基本相同,不同之处是使用 raidz 或 raidz1 关键字而不是 mirror。以下示例说明如何创建一个包含由 5 个磁盘组成的单个 RAID-Z 设备的池:
# zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0 |
本例说明可以通过设备的缩写名称或全名指定磁盘。/dev/dsk/c5t0d0 和 c5t0d0 指代同一个磁盘。
创建池时,使用 raidz2 或 raidz3 关键字可以创建双奇偶校验或三奇偶校验 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 配置中不支持以下操作:
向现有 RAID-Z 配置中附加其他磁盘。
从 RAID-Z 配置分离磁盘,分离由备用磁盘替换的磁盘除外。
不能直接从 RAID-Z 配置中移除非日志或缓存设备。对于此功能,已经申请了 RFE(请求提高)。
有关 RAID-Z 配置的更多信息,请参见RAID-Z 存储池配置。
缺省情况下,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。
您可以使用高速缓存设备创建一个存储池,来缓存存储池数据。例如:
# 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 存储池时,请考虑以下几点:
使用高速缓存设备,可以最大程度地提高大多数静态内容的随机读取工作的性能。
可以使用 zpool iostat 命令监视容量和读取操作。
创建池时,可以添加一个或多个高速缓存设备。也可以在创建池后添加或删除高速缓存设备。有关更多信息,请参见示例 4–4。
高速缓存设备不能镜像或成为 RAID-Z 配置的一部分。
如果高速缓存设备发生读取错误,则会向原始存储池设备(它可能是镜像配置或 RAID-Z 配置的一部分)重新发出读取 I/O。高速缓存设备的内容是易失性的,与其它系统高速缓存类似。
每个存储池都包含一个或多个虚拟设备。虚拟设备是存储池的内部表示形式,用于说明物理存储器的布局以及存储池的故障特征。因此,虚拟设备表示用于创建存储池的磁盘设备或文件。一个池可以在配置的顶层具有任意数目的虚拟设备,称为顶层 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 或操作系统的某个其他部分是否正在使用磁盘。如果磁盘正在使用,则可能会显示类似以下的错误:
# 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 文件中的相应行。
正在将磁盘用作系统的专用转储设备。要更正此错误,请使用 dumpadm 命令。
磁盘或文件是活动 ZFS 存储池的一部分。要更正此错误,请使用 zpool destroy 命令来销毁其他池(如果不再需要)。或者,使用 zpool detach 命令将磁盘与其他池分离。您只能将磁盘从镜像存储池中分离。
以下使用情况检查用作帮助性警告,并可以使用 -f 选项进行覆盖以创建池:
磁盘包含已知的文件系统,尽管该系统未挂载并且看起来未被使用。
磁盘是 Solaris Volume Manager 卷的一部分。
正在将磁盘用作 Oracle Solaris Live Upgrade 的替换引导环境。
磁盘是已导出的或者从系统中手动删除的存储池的一部分。如果是后一种情况,则会将池的状态报告为可能处于活动状态,因为磁盘可能是也可能不是由其他系统使用的网络连接驱动器。覆盖可能处于活动状态的池时请务必谨慎。
以下示例说明如何使用 -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/zfs 的 home 数据集。
有关挂载点的更多信息,请参见管理 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 存储池的组件中介绍了有关设备的大多数基本信息。创建池后,即可执行几项任务来管理池中的物理设备。
通过添加新的顶层虚拟设备,可以向池中动态添加磁盘空间。此磁盘空间立即可供池中的所有数据集使用。要向池中添加新虚拟设备,请使用 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 |
此命令语法会将镜像设备 c3t1d0 和 c3t2d0 添加到 zeepool 池的现有配置中。
有关如何执行虚拟设备验证的更多信息,请参见检测使用中的设备。
在以下示例中,会将另一个镜像添加到 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 |
可按类似方式向 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 |
以下示例说明如何向镜像存储池中添加镜像日志设备。有关在存储池中使用日志设备的更多信息,请参见设置单独的 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 |
可以向 ZFS 存储池中添加高速缓存设备,不再需要时可以删除。
# 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 根池中的磁盘。
在本示例中,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 |
如果现有设备是三向镜像的一部分,则附加新设备将创建四向镜像,依此类推。在任一情况下,新设备都会立即开始重新同步。
此外,还可以通过使用 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 |
使用 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 功能之前,请检查以下几点:
对于 RAIDZ 配置或者由多个磁盘组成的非冗余池,此功能不可用。
尝试 zpool split 操作之前,数据和应用程序操作应停顿。
必须拥有认可而不是忽略磁盘刷新写高速缓存命令的磁盘。
如果重新同步正在进行中,则无法分割池。
分割由两到三个磁盘组成的镜像池最佳,其中原池中的最后一个磁盘用于新创建的池。然后,可以使用 zpool attach 命令重新创建原镜像存储池,或者将新创建的池转换为镜像存储池。目前无法从现有镜像池创建新镜像池。
如果现有池是一个三向池,则在分割操作之后,新池将包含一个磁盘。如果现有池是一个由两个磁盘组成的双向池,则结果是由两个磁盘组成的两个非冗余池。您需要附加两个磁盘,以将非冗余池转换为镜像池。
在分割操作期间,保持数据冗余性的良好方法是分割由三个磁盘组成的镜像存储池,这样在分割操作之后,原池由两个镜像磁盘组成。
以下示例分割一个称为 trinity 的镜像存储池,它具有三个磁盘:c1t0d0、c1t2d0 和 c1t3d0。结果产生两个池:镜像池 trinity 包括磁盘 c1t0d0 和 c1t2d0,新池 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 |
使设备脱机时,请考虑以下几点:
不能将池脱机到它出现故障的点。例如,不能使 raidz1 配置中的两个设备脱机,也不能使顶层虚拟设备脱机。
# zpool offline tank c1t0d0 cannot offline c1t0d0: no valid replicas |
缺省情况下,脱机状态是持久性的。重新引导系统时,设备会一直处于脱机状态。
要暂时使设备脱机,请使用 zpool offline -t 选项。例如:
# zpool offline -t tank c1t0d0 bringing device 'c1t0d0' offline |
重新引导系统时,此设备会自动恢复到 ONLINE 状态。
当设备脱机时,它不会从存储池中分离出来。如果尝试使用其他池中的脱机设备,那么即使在销毁原始池之后,也会看到类似如下内容的消息:
device is part of exported or potentially active ZFS pool. Please see zpool(1M) |
如果要在销毁原始存储池之后使用其他存储池中的脱机设备,请先使该设备恢复联机,然后销毁原始存储池。
要在保留原存储池的同时使用其他存储池中的设备,还有一种方法是用另一个类似的设备替换原存储池中的现有设备。有关替换设备的信息,请参见替换存储池中的设备。
查询池的状态时,已脱机的设备以 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 根池中的磁盘。
下面是替换磁盘的基本步骤:
使用 zpool offline 命令使磁盘脱机(如有必要)。
移除要替换的磁盘。
插入替换磁盘。
运行 zpool replace 命令。例如:
# zpool replace tank c1t1d0 |
使用 zpool online 命令使磁盘联机。
在某些系统(如 Sun Fire x4500)上,必须先取消磁盘配置,才能使其脱机。如果在该系统的同一插槽位置替换磁盘,则可以仅执行 zpool replace 命令,如本节的第一个示例所示。
有关在 Sun Fire X4500 系统上替换磁盘的示例,请参见示例 11–1。
替换 ZFS 存储池中的设备时,请考虑以下几点:
如果将池属性 autoreplace 设置为 on,则会自动对在先前属于该池的设备的同一物理位置处找到的任何新设备进行格式化和替换。启用此属性时,你无需使用 zpool replace 命令。此功能可能并不是在所有硬件类型上都可用。
替换设备的大小必须等于或大于镜像或 RAID-Z 配置中最小磁盘的大小。
将大小大于要替换设备的替换设备添加到池中后,它不会自动扩展到完整大小。池属性 autoexpand 的值决定当磁盘添加到池中时,是否将替换 LUN 扩展到其完整大小。缺省情况下,autoexpand 属性禁用。您可以在较大的 LUN 添加到池中之前或之后,启用此属性以扩展 LUN 大小。
在以下示例中,两个 72-GB 磁盘替换镜像池中的两个 16-GB 磁盘。磁盘替换后,启用 autoexpand 属性以扩展到完整 LUN 大小。
# zpool create pool mirror c1t16d0 c1t17d0 # zpool status pool: pool state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool ONLINE 0 0 0 mirror ONLINE 0 0 0 c1t16d0 ONLINE 0 0 0 c1t17d0 ONLINE 0 0 0 zpool list pool NAME SIZE ALLOC FREE CAP HEALTH ALTROOT pool 16.8G 76.5K 16.7G 0% ONLINE - # zpool replace pool c1t16d0 c1t1d0 # zpool replace pool c1t17d0 c1t2d0 # zpool list pool NAME SIZE ALLOC FREE CAP HEALTH ALTROOT pool 16.8G 88.5K 16.7G 0% ONLINE - # zpool set autoexpand=on pool # zpool list pool NAME SIZE ALLOC FREE CAP HEALTH ALTROOT pool 68.2G 117K 68.2G 0% ONLINE - |
替换较大池中的多个磁盘需要较长时间,这是因为需要将数据重新同步到新磁盘。此外,还可以考虑在两次磁盘替换操作之间运行 zpool scrub 命令,以确保可供替换的设备可以正常运行,并且正确写入数据。
如果已使用热备件自动替换了故障磁盘,则您可能需要在替换故障磁盘后分离该热备件。有关分离热备件的信息,请参见在存储池中激活和取消激活热备件。
有关更换设备的更多信息,请参见解决缺少设备的问题和更换或修复损坏的设备。
借助热备件功能,可以在一个或多个存储池中确定能用来替换发生故障或失败的磁盘。指定一个设备作为热备件意味着该设备不是池中的活动设备,但如果池中的某一活动设备发生故障,热备件将自动替换该故障设备。
可通过以下方式将设备指定为热备件:
使用 zpool create 命令创建池时。
使用 zpool add 命令创建池之后。
# 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 remove 命令只能用来删除热备件、高速缓存设备和日志设备。
要添加磁盘作为热备件,热备件的大小必须等于或大于池中最大磁盘的大小。允许向池中添加更小的磁盘作为备件。但是,当自动激活或使用 zpool replace 命令激活较小的备用磁盘时,操作将失败,并显示类似以下内容的错误:
cannot replace disk3 with disk4: device is too small |
可通过以下方式激活热备件:
手动替换-通过 zpool replace 命令用热备件替换存储池中的故障设备。
自动替换-检测到故障后,FMA 代理将检查池中是否有任何可用的热备件。如果有,将使用可用备件替换故障设备。
如果当前正在使用的热备件发生故障,FMA 代理将分离该备件,从而取消替换。然后,代理将尝试用另一个热备件(如果有)替换该设备。目前,由于 ZFS 诊断引擎仅在设备从系统中消失时才会产生故障信息,因此此功能受到限制。
如果将故障设备物理替换为活动备件,则可以使用 zpool detach 命令分离该备件,从而重新激活原设备。如果将 autoreplace 池属性设置为 on,则在插入新设备并完成联机操作后,该备件会自动分离并回到备件池。
通过 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 |
目前,取消激活热备件的方法有以下几种:
本例使用 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 |
本例使用 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 |
如果想临时或永久性换入用于替换的热备件,以此替换故障磁盘,则应分离原(故障)磁盘。故障磁盘完成替换后,可以将其再添加到存储池用作备件。例如:
# 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 |
您可以使用 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 |
属性名 |
类型 |
缺省值 |
说明 |
---|---|---|---|
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 |
控制发生灾难性池故障时的系统行为。这种情况通常是由于失去与底层存储设备的连接或池中所有设备出现故障而导致的。这种事件的行为由下列值之一决定:
|
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 命令所报告的当前版本之间的任何数值。 |
zpool list 命令提供了多种方法来请求有关池状态的信息。可用信息通常分为以下三个类别: 基本使用情况信息、I/O 统计信息和运行状况。本节介绍了所有这三种类型的存储池信息。
可以使用 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 - |
此命令输出显示以下信息:
池的名称。
池的总大小,等于所有顶层虚拟设备大小的总和。
分配给所有数据集和内部元数据的物理空间量。请注意,此数量与在文件系统级别报告的磁盘空间量不同。
有关确定可用文件系统空间的更多信息,请参见ZFS 磁盘空间记帐。
池中未分配的空间量。
已用磁盘空间量,以总磁盘空间的百分比表示。
池的当前运行状况。
有关池运行状况的更多信息,请参见确定 ZFS 存储池的运行状况。
池的备用根(如有)。
有关备用根池的更多信息,请参见使用 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 |
列名称与列出有关所有存储池或特定池的信息中列出的属性相对应。
zpool list 命令的缺省输出旨在提高可读性,因此不能轻易用作 shell 脚本的一部分。为了便于在程序中使用该命令,可以使用 -H 选项以便不显示列标题,并使用制表符而不是空格分隔字段。例如,要请求系统中所有池的名称列表,可以使用以下语法:
# zpool list -Ho name tank dozer |
以下是另一个示例:
# zpool list -H -o name,size tank 80.0G dozer 1.2T |
ZFS 会自动记录成功的 zfs 和 zpool 命令(用于修改池状态信息)。使用 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 命令。
历史记录日志有如下特点:
不能禁用日志。
日志持久保存在磁盘上,这意味着系统重新引导后,将保存日志。
日志作为环形缓冲区来实现。最小大小为 128 KB。最大大小为 32 MB。
对于较小的池,日志最大大小的上限设置为池大小的 1%,而池大小是在创建池时确定的。
日志无需任何管理,这意味着不需要调整日志大小或更改日志位置。
要确定特定存储池的命令历史记录,请使用类似以下内容的语法:
# 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 |
要请求池或特定虚拟设备的 I/O 统计信息,请使用 zpool iostat 命令。与 iostat 命令类似,此命令也可以显示所有 I/O 活动的静态快照,以及每个指定时间间隔的更新统计信息。报告的统计信息如下:
当前存储在池或设备中的数据量。由于具体的内部实现的原因,此数量与可供实际文件系统使用的磁盘空间量有少量差异。
有关池空间与数据集空间之间的差异的更多信息,请参见ZFS 磁盘空间记帐。
池或设备中的可用磁盘空间量。与 used 统计信息一样,这与可供数据集使用的磁盘空间量也有少量差异。
发送到池或设备的读取 I/O 操作数,包括元数据请求。
发送到池或设备的写入 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 统计信息外,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 统计信息时,必须注意以下两点:
首先,磁盘空间使用情况统计信息仅适用于顶层虚拟设备。在镜像和 RAID-Z 虚拟设备中分配磁盘空间的方法是特定于实现的,不能简单地表示为一个数字。
其次,这些数字可能不会完全按期望的那样累加。具体来说,通过 RAID-Z 设备和通过镜像设备进行的操作不是完全均等的。这种差异在创建池之后即特别明显,因为在创建池的过程中直接对磁盘执行了大量 I/O,但在镜像级别并没有考虑这些 I/O。随着时间推移,这些数值会逐渐变得相等。不过,损坏的、无响应的或脱机设备也会影响这种对称性。
检查虚拟设备统计信息时,可以使用相同的一组选项(时间间隔和计次)。
ZFS 提供了一种检查池和设备运行状况的集成方法。池的运行状况是根据其所有设备的状态确定的。使用 zpool status 命令可以显示此状态信息。此外,池和设备的潜在故障由 fmd 报告,显示在系统控制台上,并记录于 /var/adm/messages 文件中。
本节介绍如何确定池和设备的运行状况。本章不介绍如何修复运行不良的池或从其恢复。有关故障排除和数据恢复的更多信息,请参见第 11 章。
每个设备都可以处于以下状态之一:
设备或虚拟设备处于正常工作状态。尽管仍然可能会出现一些瞬态错误,但是设备在其他方面处于正常工作状态。
虚拟设备出现过故障,但仍能工作。此状态在镜像或 RAID-Z 设备缺少一个或多个组成设备时最为常见。池的容错能力可能会受到损害,因为另一个设备中的后续故障可能无法恢复。
设备或虚拟设备完全无法访问。此状态通常表示设备出现全面故障,以致于 ZFS 无法向该设备发送数据或从该设备接收数据。如果顶层虚拟设备处于此状态,则完全无法访问池。
管理员已将设备显式脱机。
无法打开设备或虚拟设备。在某些情况下,包含 UNAVAIL 设备的池会以 DEGRADED 模式显示。如果顶层虚拟设备的状态为 UNAVAIL,则无法访问池中的任何设备。
系统正在运行时已物理移除了该设备。设备移除检测依赖于硬件,而且并非在所有平台上都受支持。
池的运行状况是根据其所有顶层虚拟设备的运行状况确定的。如果所有虚拟设备状态都为 ONLINE,则池的状态也为 ONLINE。如果任何一个虚拟设备状态为 DEGRADED 或 UNAVAIL,则池的状态也为 DEGRADED。如果顶层虚拟设备的状态为 FAULTED 或 OFFLINE,则池的状态也为 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 |
READ 和 WRITE 列提供了在设备上出现的 I/O 错误的计数,而 CKSUM 列则提供了在设备上出现的无法更正的校验和错误的计数。这两种错误计数指示可能的设备故障,并且需要执行更正操作。如果针对顶层虚拟设备报告了非零错误,则表明部分数据可能无法访问。
errors: 字段标识任何已知的数据错误。
在以上示例输出中,脱机设备不会导致数据错误。
有关诊断和修复故障池和数据的更多信息,请参见第 11 章。
有时,可能需要在系统之间移动存储池。为此,必须将存储设备与原始系统断开,然后将其重新连接到目标系统。可以通过以下方法完成此任务:以物理方式重新为设备布线,或者使用多端口设备(如 SAN 中的设备)。使用 ZFS 可将池从一台计算机中导出,然后将其导入目标系统,即使这该系统采用不同的字节存储顺序 (endianness)。有关在不同存储池(可能驻留在不同的计算机上)之间复制或迁移文件系统的信息,请参见发送和接收 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. |
缺省情况下,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 |
确定要导入的池后,即可通过将该池的名称或者其数字标识符指定为 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 备用根池。
可以使用 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 |
如果您具有先前的 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 版本的系统中将无法访问该池。