Oracle Solaris ZFS 管理指南

替换 ZFS 存储池中的设备

如果设备损坏是永久性的,或者将来很可能出现永久性损坏,则必须替换该设备。是否可以替换设备取决于配置。

确定是否可以替换设备

对于要替换的设备,池必须处于 ONLINE 状态。设备必须是冗余配置的一部分,或者其运行状况必须良好(处于 ONLINE 状态)。如果设备是冗余配置的一部分,则必须存在可以从其中检索正确数据的足够副本。如果四向镜像中有两个磁盘是有故障的,则可以替换其中任一磁盘(因为运行状况良好的副本是可用的)。但是,如果四向 RAID-Z (raidz1) 虚拟设备中有两个磁盘是有故障的,则两个磁盘都不能替换,因为不存在从其中检索数据的足够副本。如果设备已损坏但处于联机状态,则只要池不处于 FAULTED 状态就可以替换它。但是,除非存在包含正确数据的足够副本,否则会将设备上的任何损坏数据复制到新设备。

在以下配置中,可以替换磁盘 c1t1d0,而且将从完好的副本 c1t0d0 复制池中的任何数据:


    mirror            DEGRADED
    c1t0d0             ONLINE
    c1t1d0             FAULTED

虽然因没有可用的正确副本而无法对数据进行自我修复,但还是可以替换磁盘 c1t0d0

在以下配置中,无法替换任一有故障磁盘。也无法替换 ONLINE 磁盘,因为池本身是有故障的。


    raidz              FAULTED
    c1t0d0             ONLINE
    c2t0d0             FAULTED
    c3t0d0             FAULTED
    c4t0d0             ONLINE

在以下配置中,尽管已将磁盘上存在的错误数据复制到新磁盘,但是任一顶层磁盘都可替换。


c1t0d0         ONLINE
c1t1d0         ONLINE

如果其中一个磁盘是有故障的,则无法执行替换操作,因为池本身是有故障的。

无法替换的设备

如果设备缺失导致池出现故障,或者设备在非冗余配置中包含太多的数据错误,则无法安全地替换设备。如果没有足够的冗余,则不存在可用来恢复损坏设备的正确数据。这种情况下,唯一的选择是销毁池并重新创建配置,然后从备份副本恢复数据。

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

替换 ZFS 存储池中的设备

确定可以替换设备后,可以使用 zpool replace 命令替换设备。如果要用不同的设备替换损坏的设备,请使用类似以下的语法:


# zpool replace tank c1t1d0 c2t0d0

此命令将数据从损坏的设备或从池中的其他设备(如果处于冗余配置中)迁移到新设备。此命令完成后,将从配置中拆离损坏的设备,此时可以将该设备从系统中移除。如果已移除设备并在同一位置中将它替换为新设备,请使用命令的单设备形式。例如:


# zpool replace tank c1t1d0

此命令接受未格式化的磁盘,适当地将它格式化,然后重新同步其余配置中的数据。

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


示例 11–1 替换 ZFS 存储池中的设备

以下示例说明如何替换 Oracle Sun Fire x4500 系统上的镜像存储池 tank 中的设备 (c1t3d0)。要在同一位置将磁盘 c1t3d0 替换为新磁盘 (c1t3d0),尝试替换磁盘之前必须取消磁盘配置。基本步骤如下:

以下示例分步显示了替换 ZFS 存储池中的磁盘的过程。


# zpool offline tank c1t3d0
# cfgadm | grep c1t3d0
sata1/3::dsk/c1t3d0            disk         connected    configured   ok
# cfgadm -c unconfigure sata1/3
Unconfigure the device at: /devices/pci@0,0/pci1022,7458@2/pci11ab,11ab@1:3
This operation will suspend activity on the SATA device
Continue (yes/no)? yes
# cfgadm | grep sata1/3
sata1/3                        disk         connected    unconfigured ok
<Physically replace the failed disk c1t3d0>
# cfgadm -c configure sata1/3
# cfgadm | grep sata1/3
sata1/3::dsk/c1t3d0            disk         connected    configured   ok
# zpool online tank c1t3d0
# zpool replace tank c1t3d0
# zpool status tank
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Feb  2 13:17:32 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
          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

请注意,上述 zpool output 可能会在 replacing 标题下显示新磁盘和旧磁盘。例如:


replacing     DEGRADED     0     0    0
  c1t3d0s0/o  FAULTED      0     0    0
  c1t3d0      ONLINE       0     0    0

此文本表示替换过程正在进行,且新磁盘正在重新同步。

如果您打算将一个磁盘 (c1t3d0) 替换为另一个磁盘 (c4t3d0),则只需运行 zpool replace 命令。例如:


# zpool replace tank c1t3d0 c4t3d0
# zpool status
  pool: tank
 state: DEGRADED
 scrub: resilver completed after 0h0m with 0 errors on Tue Feb  2 13:35:41 2010
config:

        NAME             STATE     READ WRITE CKSUM
        tank             DEGRADED     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       DEGRADED     0     0     0
            c0t3d0       ONLINE       0     0     0
            replacing    DEGRADED     0     0     0
              c1t3d0     OFFLINE      0     0     0
              c4t3d0     ONLINE       0     0     0

errors: No known data errors

磁盘替换完成之前,您可能需要多次运行 zpool status 命令。


# zpool status tank
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Feb  2 13:35:41 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
          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
            c4t3d0    ONLINE       0     0     0


示例 11–2 更换出现故障的日志设备

以下示例说明如何从存储池 (pool) 中出现故障的日志设备 (c0t5d0) 进行恢复。基本步骤如下:


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

        NAME        STATE     READ WRITE CKSUM
        pool        FAULTED      0     0     0 bad intent log
          mirror    ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
        logs        FAULTED      0     0     0 bad intent log
          c0t5d0    UNAVAIL      0     0     0 cannot open
<Physically replace the failed log device>
# zpool online pool c0t5d0
# zpool clear pool

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

        NAME          STATE     READ WRITE CKSUM
        pool          FAULTED      0     0     0 bad intent log
          mirror-0    ONLINE       0     0     0
            c0t1d0    ONLINE       0     0     0
            c0t4d0    ONLINE       0     0     0
        logs          FAULTED      0     0     0 bad intent log
          c0t5d0      UNAVAIL      0     0     0 cannot open
<Physically replace the failed log device>
# zpool online pool c0t5d0
# zpool clear pool

查看重新同步状态

替换设备这一过程可能需要很长一段时间,具体取决于设备的大小和池中的数据量。将数据从一个设备移动到另一个设备的过程称为重新同步,可以使用 zpool status 命令监视此过程。

传统的文件系统在块级别上重新同步数据。由于 ZFS 消除了卷管理器的人为分层,因此它能够以更强大的受控方式执行重新同步。此功能的两个主要优点如下:

要查看重新同步过程,请使用 zpool status 命令。例如:


# zpool status tank
  pool: tank
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h0m, 22.60% done, 0h1m to go
config:
        NAME                  STATE     READ WRITE CKSUM 
        tank             DEGRADED     0     0     0
          mirror-0       DEGRADED     0     0     0
            replacing-0  DEGRADED     0     0     0
              c1t0d0     UNAVAIL      0     0     0  cannot open
              c2t0d0     ONLINE       0     0     0  85.0M resilvered
            c1t1d0       ONLINE       0     0     0

errors: No known data errors

在本示例中,磁盘 c1t0d0 被替换为 c2t0d0。通过查看状态输出的配置部分中是否显示有 replacing ,可观察到此替换虚拟设备的事件。此设备不是真正的设备,不可能使用它创建池。此设备的用途仅仅是显示重新同步进度,以及确定被替换的设备。

请注意,当前正进行重新同步的任何池都处于 ONLINEDEGRADED 状态,这是因为在重新同步过程完成之前,池无法提供所需的冗余级别。虽然 I/O 始终是按照比用户请求的 I/O 更低的优先级调度的(以最大限度地减少对系统的影响),但是重新同步会尽可能快地进行。重新同步完成后,该配置将恢复为新的完整配置。例如:


# zpool status tank
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h1m with 0 errors on Tue Feb  2 13:54:30 2010
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2t0d0  ONLINE       0     0     0  377M resilvered
            c1t1d0  ONLINE       0     0     0

errors: No known data errors

池再次处于 ONLINE 状态,而且原故障磁盘 (c1t0d0) 已从配置中删除。