本节介绍如何确定设备故障类型、清除瞬态错误和替换设备。
位损坏-随着时间的推移,随机事件(如电磁感应和宇宙射线)可能会导致存储在磁盘上的位发生翻转。这些事件相对少见,但是通常足以导致大系统或长时间运行的系统出现潜在的数据损坏。
误导的读取或写入-固件错误或硬件故障可以导致整个块的读取或写入引用磁盘上的不正确位置。这些错误通常是瞬态的,尽管大量此类错误可能指示驱动器有故障。
管理员错误-管理员可能无意中用错误的数据覆写了部分磁盘(如在部分磁盘上复制 /dev/zero),从而导致磁盘上出现永久性损坏。这些错误始终是瞬态的。
临时故障-磁盘可能在某段时间内变得不可用,从而导致 I/O 失败。此情况通常与网络连接设备相关联,尽管本地磁盘也可能遇到临时故障。这些错误可能是也可能不是瞬态的。
劣质或不可靠的硬件–这种情况涵盖故障硬件表现出来的所有各种问题,包括一致的 I/O 错误、故障传输导致随机损坏或任何数量的故障。这些错误通常是永久性的。
脱机的设备-如果设备处于脱机状态,则假定是管理员因该设备有故障而将它置于此状态。将设备置于此状态的管理员可以确定此假定是否正确。
准确确定设备的问题可能是一个很困难的过程。第一步是检查 zpool status 输出中的错误计数。例如:
# zpool status -v tpool pool: tpool 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 scrub: scrub completed after 0h0m with 2 errors on Tue Jul 13 11:08:37 2010 config: NAME STATE READ WRITE CKSUM tpool ONLINE 2 0 0 c1t1d0 ONLINE 2 0 0 c1t3d0 ONLINE 0 0 0 errors: Permanent errors have been detected in the following files: /tpool/words |
错误分为 I/O 错误与校验和错误,这两种错误都指示可能的故障类型。典型操作可预知的错误数非常少(在很长一段时间内只能预知几个错误)。如果看到大量的错误,则此情况可能指示即将出现或已出现设备故障。然而,管理员错误也可能导致错误计数较大。另一信息源是 syslog 系统日志。如果日志显示大量的 SCSI 或光纤通道驱动程序消息,则此情况可能指示出现了严重的硬件问题。如果未生成 syslog 消息,则损坏很可能是瞬态的。
目的是回答以下问题:
此设备上是否可能出现另一错误?
仅出现一次的错误被认为是瞬态的,不指示存在潜在的故障。其持久性或严重性足以指明潜在硬件故障的错误被认为是致命的。由于确定错误类型的行为已超出当前可用于 ZFS 的任何自动化软件的功能范围,因此如此多的操作必须由您(即管理员)手动执行。在确定后,可以执行相应的操作。清除瞬态错误,或者替换出现致命错误的设备。以下几节将介绍这些修复过程。
即使设备错误被认为是瞬态的,仍然可能导致池中出现了无法更正的数据错误。这些错误需要特殊的修复过程,即使认为底层设备运行状况良好或已进行修复也是如此。有关修复数据错误的更多信息,请参见修复损坏的数据。
如果认为设备错误是瞬态的(因为它们不大可能影响设备将来的运行状况),则可以安全地清除设备错误,以指示未出现致命错误。要将 RAID-Z 或镜像设备的错误计数器清零,请使用 zpool clear 命令。例如:
# zpool clear tank c1t1d0 |
此语法清除所有设备错误,并清除与设备关联的任何数据错误计数。
要清除与池中虚拟设备关联的所有错误,并清除与池关联的任何数据错误计数,请使用以下语法:
# zpool clear tank |
有关清除池错误的更多信息,请参见清除存储池设备错误。
如果设备损坏是永久性的,或者将来很可能出现永久性损坏,则必须替换该设备。是否可以替换设备取决于配置。
对于要替换的设备,池必须处于 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 存储池范围内的损坏。
确定可以替换设备后,可以使用 zpool replace 命令替换设备。如果要用不同的设备替换损坏的设备,请使用类似以下的语法:
# zpool replace tank c1t1d0 c2t0d0 |
此命令将数据从损坏的设备或从池中的其他设备(如果处于冗余配置中)迁移到新设备。此命令完成后,将从配置中拆离损坏的设备,此时可以将该设备从系统中移除。如果已移除设备并在同一位置中将它替换为新设备,请使用命令的单设备形式。例如:
# zpool replace tank c1t1d0 |
此命令接受未格式化的磁盘,适当地将它格式化,然后重新同步其余配置中的数据。
有关 zpool replace 命令的更多信息,请参见替换存储池中的设备。
以下示例说明如何替换 Oracle Sun Fire x4500 系统上的镜像存储池 tank 中的设备 (c1t3d0)。要在同一位置将磁盘 c1t3d0 替换为新磁盘 (c1t3d0),尝试替换磁盘之前必须取消磁盘配置。基本步骤如下:
使要替换的磁盘 (c1t3d0) 脱机。您不能取消配置当前正在使用的磁盘。
使用 cfgadm 命令确定要取消配置的磁盘 (c1t3d0) 并取消其配置。如果磁盘在此镜像配置中脱机,该池将降级,但该池将继续可用。
物理替换磁盘 (c1t3d0)。在物理移除故障驱动器之前,请确保蓝色的可以移除 LED 指示灯亮起。
重新配置磁盘 (c1t3d0)。
使新磁盘 (c1t3d0) 联机。
运行 zpool replace 命令以替换磁盘 (c1t3d0)。
如果先前将池属性 autoreplace 设置为 on,则会自动对在先前属于池的设备的同一物理位置处找到的任何新设备进行格式化和替换,而无需使用 zpool replace 命令。此功能可能并不是在所有硬件上都受支持。
如果已使用热备件自动替换了故障磁盘,则您可能需要在替换故障磁盘后分离该热备件。例如,如果替换故障磁盘后,c2t4d0 仍为活动热备件,则对其进行分离。
# zpool detach tank c2t4d0 |
以下示例分步显示了替换 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 |
以下示例说明如何从存储池 (pool) 中出现故障的日志设备 (c0t5d0) 进行恢复。基本步骤如下:
查看 zpool status -x 输出和 FMA 诊断消息。有关说明,请参见以下页面:
物理更换出现故障的日志设备。
使新日志设备联机。
清除池的错误状态。
# 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 消除了卷管理器的人为分层,因此它能够以更强大的受控方式执行重新同步。此功能的两个主要优点如下:
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) 已从配置中删除。