解决 ZFS 存储设备问题

解决 ZFS 存储设备问题

请查看以下各节来解决缺少设备、设备被移除或发生故障等问题。

解决缺少设备或设备被移除的问题

如果设备无法打开,则它在 zpool status 输出中显示为 UNAVAIL状态。此状态表示在首次访问池时 ZFS 无法打开设备,或者设备自那时以来已变得不可用。如果设备导致顶层虚拟设备不可用,则无法访问池中的任何内容。此外,池的容错能力可能已受到损害。无论哪种情况,只需要将设备重新附加到系统即可恢复正常操作。如果需要替换因发生故障而处于 UNAVAIL 状态的设备,请参见替换 ZFS 存储池中的设备

如果根池或镜像的根池中的某个设备状态为 UNAVAIL,请参见以下参考资料:

例如,设备出现故障后,可能会在 fmd 的输出中看到类似于以下内容的消息:

SUNW-MSG-ID: ZFS-8000-FD, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Thu Jun 24 10:42:36 PDT 2010
PLATFORM: SUNW,Sun-Fire-T200, CSN: -, HOSTNAME: daleks
SOURCE: zfs-diagnosis, REV: 1.0
EVENT-ID: a1fb66d0-cc51-cd14-a835-961c15696fcb
DESC: The number of I/O errors associated with a ZFS device exceeded
acceptable levels.  Refer to http://sun.com/msg/ZFS-8000-FD for more information.
AUTO-RESPONSE: The device has been offlined and marked as faulted.  An attempt
will be made to activate a hot spare if available. 
IMPACT: Fault tolerance of the pool may be compromised.
REC-ACTION: Run 'zpool status -x' and replace the bad device.

要查看有关设备问题和解决办法的更详细信息,请使用 zpool status -x 命令。例如:

# zpool status -x
  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
  scan: scrub repaired 0 in 0h0m with 0 errors on Tue Sep 27 16:59:07 2011
config:

        NAME        STATE     READ WRITE CKSUM
        tank        DEGRADED     0     0     0
          mirror-0  DEGRADED     0     0     0
            c2t2d0  ONLINE       0     0     0
            c2t1d0  UNAVAIL      0     0     0  cannot open

errors: No known data errors

从此输出中可以看到,设备 c2t1d0 未正常运行。如果您确定该设备有问题,请予以替换。

如有必要,可使用 zpool online 命令使替换的设备联机。例如:

# zpool online tank c2t1d0

如果 fmadm faulty 的输出标识出了该设备错误,请让 FMA 知道设备已被替换。例如:

# fmadm faulty
--------------- ------------------------------------  -------------- ---------
TIME            EVENT-ID                              MSG-ID         SEVERITY
--------------- ------------------------------------  -------------- ---------
Sep 27 16:58:50 e6bb52c3-5fe0-41a1-9ccc-c2f8a6b56100  ZFS-8000-D3    Major     

Host        : neo
Platform    : SUNW,Sun-Fire-T200        Chassis_id  : 
Product_sn  : 

Fault class : fault.fs.zfs.device
Affects     : zfs://pool=tank/vdev=c75a8336cda03110
                  faulted and taken out of service
Problem in  : zfs://pool=tank/vdev=c75a8336cda03110
                  faulted and taken out of service

Description : A ZFS device failed.  Refer to http://sun.com/msg/ZFS-8000-D3 for
              more information.

Response    : No automated response will occur.

Impact      : Fault tolerance of the pool may be compromised.

Action      : Run 'zpool status -x' and replace the bad device.

# fmadm repaired zfs://pool=tank/vdev=c75a8336cda03110

最后一步是确认设备更换后的池正常运行。例如:

# zpool status -x tank
pool 'tank' is healthy

解决设备被移除的问题

如果某个设备已从系统中彻底删除,则 ZFS 会检测到该设备无法打开,并将其置于 REMOVED 状态。这一删除可能会导致整个池变得不可用,但也可能不会,具体取决于池的数据复制级别。如果镜像设备或 RAID-Z 设备中的一个磁盘被删除,仍可以继续访问池。在以下情况下,池可能会变为 UNAVAIL 状态,即无法访问数据,除非重新附加设备:

  • 镜像的所有组件都被删除

  • RAID-Z (raidz1) 设备中有一个以上设备被删除

  • 单磁盘配置中移除了顶层设备

以物理方式重新附加设备

重新附加缺少的设备的具体方式取决于相关设备。如果设备是网络连接驱动器,则应该恢复与网络的连接。如果设备是 USB 设备或其他可移除介质,则应该将它重新附加到系统。如果设备是本地磁盘,则控制器可能已出现故障,以致设备对于系统不再可见。在这种情况下,应该替换控制器,以使磁盘重新可用。可能存在其他问题,具体取决于硬件的类型及其配置。如果驱动器出现故障,且对系统不再可见,则应该将该设备视为损坏的设备。按照更换或修复损坏的设备中概述的过程进行操作。

如果设备连接受到损害,池可能变为 SUSPENDED 状态。在设备问题得到解决之前,SUSPENDED 池一直处于 wait 状态。例如:

# zpool status cybermen
  pool: cybermen
 state: SUSPENDED
status: One or more devices are unavailable in response to IO failures.
        The pool is suspended.
action: Make sure the affected devices are connected, then run 'zpool clear' or
        'fmadm repaired'.
    see: http://www.sun.com/msg/ZFS-8000-HC
  scan: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        cybermen       UNAVAIL      0    16     0
            c8t3d0     UNAVAIL      0     0     0
            c8t1d0     UNAVAIL      0     0     0

当设备连接恢复后,请清除池或设备错误。

# zpool clear cybermen
# fmadm repaired zfs://pool=name/vdev=guid

将设备可用性通知 ZFS

将设备重新附加到系统后,ZFS 可能会也可能不会自动检测其可用性。如果池先前为 UNAVAIL 或 SUSPENDED 状态,或者在执行 attach 的过程中系统进行了重新引导,则 ZFS 在尝试打开该池时,会自动重新扫描所有设备。如果在系统运行时池的性能降低且设备已替换,则必须通知 ZFS 设备现在是可用的并可以使用 zpool online 命令重新打开。例如:

# zpool online tank c0t1d0

有关使设备联机的更多信息,请参见使设备联机

更换或修复损坏的设备

本节介绍如何确定设备故障类型、清除瞬态错误和替换设备。

确定设备故障的类型

术语损坏的设备相当含糊,它可以用来描述许多可能的情况:

  • 位损坏-随着时间的推移,随机事件(如电磁感应和宇宙射线)可能会导致存储在磁盘上的位发生翻转。这些事件相对少见,但是通常足以导致大系统或长时间运行的系统出现潜在的数据损坏。

  • 误导的读取或写入-固件已知问题或硬件故障可以导致整个块的读取或写入引用磁盘上的不正确位置。这些错误通常是瞬态的,尽管大量此类错误可能指示驱动器有故障。

  • 管理员错误-管理员可能无意中用错误的数据覆盖了部分磁盘(如在部分磁盘上复制 /dev/zero),从而导致磁盘上出现永久性损坏。这些错误始终是瞬态的。

  • 临时故障-磁盘可能在某段时间内变得不可用,从而导致 I/O 失败。此情况通常与网络连接设备相关联,尽管本地磁盘也可能遇到临时故障。这些错误可能是也可能不是瞬态的。

  • 劣质或不可靠的硬件-这种情况涵盖故障硬件表现出来的所有各种问题,包括一致的 I/O 错误、故障传输导致随机损坏或任何数量的故障。这些错误通常是永久性的。

  • 脱机的设备-如果设备处于脱机状态,则假定是管理员因该设备有故障而将它置于此状态。将设备置于此状态的管理员可以确定此假定是否正确。

准确确定设备的问题可能是一个很困难的过程。第一步是检查 zpool status 输出中的错误计数。例如:

# zpool status -v tank
  pool: tank
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://www.sun.com/msg/ZFS-8000-8A
  scan: scrub in progress since Tue Sep 27 17:12:40 2011
    63.9M scanned out of 528M at 10.7M/s, 0h0m to go
    0 repaired, 12.11% done
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       2     0     0
          mirror-0  ONLINE       2     0     0
            c2t2d0  ONLINE       2     0     0
            c2t1d0  ONLINE       2     0     0

errors: Permanent errors have been detected in the following files:

        /tank/words

错误分为 I/O 错误与校验和错误,这两种错误都指示可能的故障类型。典型操作可预知的错误数非常少(在很长一段时间内只能预知几个错误)。如果看到大量的错误,则此情况可能指示即将出现或已出现设备故障。然而,管理员错误也可能导致错误计数较大。另一信息源是 syslog 系统日志。如果日志显示大量的 SCSI 或光纤通道驱动程序消息,则此情况可能指示出现了严重的硬件问题。如果未生成 syslog 消息,则损坏很可能是瞬态的。

目的是回答以下问题:

此设备上是否可能出现另一错误?

仅出现一次的错误被认为是瞬态的,不指示存在潜在的故障。其持久性或严重性足以指明潜在硬件故障的错误被认为是致命的。由于确定错误类型的行为已超出当前可用于 ZFS 的任何自动化软件的功能范围,因此如此多的操作必须由您(即管理员)手动执行。在确定后,可以执行相应的操作。清除瞬态错误,或者替换出现致命错误的设备。以下几节将介绍这些修复过程。

即使设备错误被认为是瞬态的,仍然可能导致池中出现了无法更正的数据错误。这些错误需要特殊的修复过程,即使认为底层设备运行状况良好或已进行修复也是如此。有关修复数据错误的更多信息,请参见修复损坏的数据

清除瞬态设备错误

如果认为设备错误是瞬态的(因为它们不大可能影响设备将来的运行状况),则可以安全地清除设备错误,以指示未出现致命错误。要将 RAID-Z 或镜像设备的错误计数器清零,请使用 zpool clear 命令。例如:

# zpool clear tank c1t1d0

此语法清除所有设备错误,并清除与设备关联的任何数据错误计数。

要清除与池中虚拟设备关联的所有错误,并清除与池关联的任何数据错误计数,请使用以下语法:

# zpool clear tank

有关清除池错误的更多信息,请参见清除存储池设备错误

替换 ZFS 存储池中的设备

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

确定是否可以替换设备

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

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

mirror            DEGRADED
    c1t0d0             ONLINE
    c1t1d0             FAULTED

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

在以下配置中,无法替换任一 UNAVAIL 磁盘。也无法替换 ONLINE 磁盘,因为池本身为 UNAVAIL 状态。

raidz              FAULTED
    c1t0d0             ONLINE
    c2t0d0             FAULTED
    c3t0d0             FAULTED
    c4t0d0             ONLINE

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

c1t0d0         ONLINE
c1t1d0         ONLINE

如果任一个磁盘为 UNAVAIL 状态,则无法执行任何替换操作,因为池本身为 UNAVAIL 状态。

无法替换的设备

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

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

替换 ZFS 存储池中的设备

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

# zpool replace tank c1t1d0 c2t0d0

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

# zpool replace tank c1t1d0

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

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

示例 10-1 替换 ZFS 存储池中的 SATA 磁盘

以下示例展示了如何将系统上的镜像存储池 tank 中的设备 (c1t3d0) 替换为 SATA 设备。要在同一位置将磁盘 c1t3d0 替换为新磁盘 (c1t3d0),尝试替换磁盘之前必须取消磁盘配置。如果要替换的磁盘不是 SATA 磁盘,则请参见替换存储池中的设备

基本步骤如下:

  • 使要替换的磁盘 (c1t3d0) 脱机。您不能取消配置当前正在使用的 SATA 磁盘。

  • 使用 cfgadm 命令确定要取消配置的 SATA 磁盘 (c1t3d0) 并取消其配置。如果磁盘在此镜像配置中脱机,该池将降级,但该池将继续可用。

  • 物理替换磁盘 (c1t3d0)。在物理移除 UNAVAIL 状态的驱动器(如果有)之前,请确保蓝色的 Ready to Remove(可以移除)LED 指示灯亮起。

  • 重新配置 SATA 磁盘 (c1t3d0)。

  • 使新磁盘 (c1t3d0) 联机。

  • 运行 zpool replace 命令以替换磁盘 (c1t3d0)。

    注 - 如果先前将池属性 autoreplace 设置为 on,则会自动对在先前属于池的设备的同一物理位置处找到的任何新设备进行格式化和替换,而无需使用 zpool replace 命令。此功能可能并不是在所有硬件上都受支持。

  • 如果已使用热备件自动替换了故障磁盘,则您可能需要在替换故障磁盘后分离该热备件。例如,如果替换故障磁盘后,c2t4d0 仍为活动热备件,则对其进行分离。

    # zpool detach tank c2t4d0
  • 如果 FMA 报告了有故障的设备,您应当清除设备故障。

    # fmadm faulty
    # fmadm repaired zfs://pool=name/vdev=guid

以下示例分步显示了替换 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

示例 10-2 更换出现故障的日志设备

ZFS 在 zpool status 命令输出中标识意图日志 (intent log) 故障。故障管理架构 (Fault Management Architecture, FMA) 也会报告这些错误。ZFS 和 FMA 都介绍如何从意图日志 (intent log) 故障中恢复。

以下示例说明如何从存储池 (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
# fmadm faulty
# fmadm repair zfs://pool=name/vdev=guid

您可以通过以下方式解决日志设备故障:

  • 更换或恢复日志设备。在此示例中,日志设备是 c0t5d0。

  • 将日志设备重新联机。

    # zpool online pool c0t5d0
  • 重置故障日志设备的错误状态。

    # zpool clear pool

要从此错误中恢复而不更换故障日志设备,可以使用 zpool clear 命令清除该错误。在这种情况下,池将在降级模式下运行,并且日志记录将被写入到主池,直到更换单独的日志设备。

请考虑使用镜像日志设备来避免日志设备故障情形。

查看重新同步状态

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

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

  • ZFS 仅重新同步最少量的必要数据。如果是短暂的断电(而不是设备替换),整个磁盘可以在几分钟或几秒内重新同步。替换整个磁盘时,重新同步过程所用的时间与磁盘上所用的数据量成比例。如果只使用了池中几 GB 的磁盘空间,则替换 500 GB 的磁盘可能只需要几秒的时间。

  • 重新同步是可中断的和安全的。如果系统断电或者进行重新引导,则重新同步过程会准确地从它停止的位置继续,而无需手动干预。

要查看重新同步过程,请使用 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 ,可观察到此替换虚拟设备的事件。此设备不是真正的设备,不可能使用它创建池。此设备的用途仅仅是显示重新同步进度,以及确定被替换的设备。

请注意,当前正进行重新同步的任何池都处于 ONLINE 或 DEGRADED 状态,这是因为在重新同步过程完成之前,池无法提供所需的冗余级别。虽然 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) 已从配置中删除。

猜你喜欢

转载自my.oschina.net/u/2306127/blog/2875478
zfs