免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1573 | 回复: 0
打印 上一主题 下一主题

第 9 章 ZFS 疑难解答和数据恢复 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-21 12:39 |只看该作者 |倒序浏览

第 9 章 ZFS 疑难解答和数据恢复
本章介绍如何确定 ZFS 故障模式以及如何从相应故障模式中恢复。还提供了有关预防故障的信息。
本章包含以下各节:

ZFS 故障模式
作为组合的文件系统和卷管理器,ZFS 可以呈现许多不同的故障模式。本章首先概述各种故障模式,然后讨论如何在正运行的系统上确定各种故障。本章最后讨论如何修复问题。ZFS 可能会遇到以下三种基本类型的错误:


  • 缺少设备

  • 设备已损坏

  • 数据已损坏

请注意,单个池可能会遇到所有这三种错误,因此完整的修复过程依次查找和更正各个错误。
ZFS 存储池中缺少设备
如果某设备已从系统中彻底删除,则 ZFS 会检测到该设备无法打开,并将其置于 FAULTED 状态。这可能会导致整个池变得不可用,但也可能不会,具体取决于池的数据复制级别。如果镜像设备或 RAID-Z 设备中的一个磁盘被删除,仍可以继续访问池。如果删除了镜像的所有组件,删除了 RAID-Z 设备中的多个设备,或删除了单磁盘顶层设备,则池将变成 FAULTED。在重新连接设备之前,无法访问任何数据。
ZFS 存储池中的设备已损坏
术语“损坏”包含各种可能出现的错误。以下是错误示例:


  • 由于损坏的磁盘或控制器而导致的瞬态 I/O 错误

  • 磁盘上的数据因宇宙射线而损坏

  • 导致数据传输至错误目标或从错误源位置传输的驱动程序错误

  • 只是另一个用户意外地覆写了物理设备的某些部分

在一些情况下,这些错误是瞬态的,如控制器出现问题时的随机 I/O 错误。在另外一些情况下,损坏是永久性的,如磁盘损坏。但是,若损坏是永久性的,则并不一定表明该错误很可能会再次出现。例如,如果管理员意外覆写了磁盘的一部分,且未出现某种硬盘故障,则不需要替换该设备。准确确定设备出现的错误不是一项轻松的任务,在稍后的一节中将对此进行更详细的介绍。
ZFS 数据已损坏
一个或多个设备错误(指示缺少设备或设备已损坏)影响顶层虚拟设备时,将出现数据损坏。例如,镜像的一半可能会遇到数千个绝不会导致数据损坏的设备错误。如果在镜像另一面的完全相同位置中遇到错误,则会导致数据损坏。
数据损坏始终是永久性的,因此在修复期间需要特别注意。即使修复或替换基础设备,也将永远丢失原始数据。这种情况通常要求从备份恢复数据。在遇到数据错误时会记录错误,并可以通过常规磁盘清理对错误进行控制,如下一节所述。删除损坏的块后,下一遍清理会识别出数据损坏已不再存在,并从系统中删除该错误的任何记录。
检查 ZFS 数据完整性
对于 ZFS,不存在与 fsck 等效的实用程序。此实用程序一直以来用于两个目的:数据修复和数据验证。
数据修复
对于传统的文件系统,写入数据的方法本身容易出现导致数据不一致的意外故障。由于传统的文件系统不是事务性的,因此可能会出现未引用的块、错误的链接计数或其他不一致的数据结构。添加日志记录确实解决了其中的一些问题,但是在无法回滚日志时可能会带来其他问题。对于 ZFS,这些问题都不存在。磁盘上存在不一致数据的唯一原因是出现硬盘故障(在这种情况下,应该已复制池)或 ZFS 软件中存在错误。
假定 fsck 实用程序设计用于修复特定于单独文件系统的已知异常,为没有已知反常的文件系统编写这样的实用程序就是不可能的。将来的经验可能证明某些数据损坏问题是足够常见、足够简单的,以致于可以开发修复实用程序,但是使用复制的池始终可以避免这些问题。
如果未复制池,则数据损坏造成无法访问某些或所有数据的可能性将始终存在。
数据验证
除了数据修复外,fsck 实用程序还验证磁盘上的数据是否没有问题。过去,此任务是通过取消挂载文件系统再运行 fsck 实用程序执行的,在该过程中可能会使系统进入单用户模式。此情况导致的停机时间的长短与所检查文件系统的大小成比例。ZFS 提供了一种对所有数据执行常规检查的机制,而不是要求显式实用程序执行必要的检查。此功能称为清理,在内存和其他系统中经常将它用作一种在错误导致硬盘或软件故障之前检测和防止错误的方法。
控制 ZFS 数据清理
每当 ZFS 遇到错误时(不管是在清理中还是按需访问文件时),都会在内部记录该错误,以便您可以快速查看池中所有已知错误的概览信息。
显式 ZFS 数据清理
检查数据完整性的最简单的方法是,对池中所有数据启动显式清理操作。此操作对池中的所有数据遍历一次,并验证是否可以读取所有块。尽管任何 I/O 的优先级一直低于常规操作的优先级,但是清理以设备所允许的最快速度进行。虽然进行清理时文件系统应该保持可用而且几乎都做出响应,但是此操作可能会对性能产生负面影响。要启动显式清理,请使用 zpool scrub 命令。例如:
# zpool scrub tank
可以在 zpool status 输出中显示当前清理的状态。例如:
# zpool status -v tank
  pool: tank
state: ONLINE
scrub: scrub completed with 0 errors on Tue Mar  7 15:27:36 2006
config:
        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          mirror     ONLINE       0     0     0
            c1t0d0   ONLINE       0     0     0
            c1t1d0   ONLINE       0     0     0
errors: No known data errors
请注意,每个池一次只能发生一个活动的清理操作。
执行常规清理还可保证对系统上所有磁盘执行连续的 I/O。常规清理具有副作用,即阻止电源管理将空闲磁盘置于低功耗模式。如果系统通常一直执行 I/O,或功率消耗不是重要的考虑因素,则可以安全地忽略此问题。
有关解释 zpool status 输出的更多信息,请参见
查询 ZFS 存储池的状态

ZFS 数据清理和重新同步
替换设备时,将启动重新同步操作,以便将正确副本中的数据移动到新设备。此操作是一种形式的磁盘清理。因此,在给定的时间,池中只能发生一个这样的操作。如果清理操作正在进行,则重新同步操作会暂停当前清理,并在重新同步完成后将其重新启动。
有关重新同步的更多信息,请参见
查看重新同步状态

确定 ZFS 中的问题
所有的 ZFS 疑难解答都以 zpool status 命令为中心。此命令对系统中的各种故障进行分析并确定最严重的问题,同时为您提供建议的操作和指向知识文章(用于获取更多信息)的链接。请注意,虽然池可能存在多个问题,但是此命令仅确定其中的一个问题。例如,出现数据损坏错误时总是指示设备之一出现了故障。但替换该故障设备并不能修复数据损坏问题。
此外,提供了 ZFS 诊断引擎,用于诊断和报告池故障及设备故障。另外,还可与池或设备的故障关联的校验和 I/O 设备和池错误。fmd 报告的 ZFS 故障在控制台上以及系统消息文件中显示。在大多数情况下,fmd 消息指导您查看 zpool status 命令中的进一步恢复说明。
基本的恢复过程如下所示:


  • 通过在系统控制台上或 /var/adm/messages 文件中显示的 fmd 消息来确定错误。

  • 在 zpool status -x 命令中查找进一步的修复说明。

  • 修复故障,如:


    • 替换故障设备或缺少的设备,并使其联机。

    • 从备份恢复故障配置或损坏的数据。

    • 使用 zpool status x 命令验证恢复。

    • 备份所恢复的配置(如果适用)。

本章介绍如何解释 zpool status 输出以便诊断故障类型,并会将您导向后续有关如何修复该问题的相应部分。尽管大多数工作是由命令自动执行的,但是准确了解所确定的问题以便诊断故障类型是很重要的。
确定 ZFS 存储池中是否存在问题
确定系统上是否存在任何已知问题的最简单的方法是使用 zpool status -x 命令。此命令仅对出现问题的池进行说明。如果系统上不存在错误池,则该命令显示一条简单的消息,如下所示:
# zpool status -x
all pools are healthy
如果没有 -x 标志,则该命令显示所有池(如果在命令行上指定了池,则为请求的池)的完整状态,即使池的运行状况良好也是如此。
有关 zpool status 命令的命令行选项的更多信息,请参见
查询 ZFS 存储池的状态

了解 zpool status 输出
完整的 zpool status 输出与以下内容类似:
# zpool status tank
  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: none requested
config:
        NAME         STATE     READ WRITE CKSUM
        tank         DEGRADED     0     0     0
          mirror     DEGRADED     0     0     0
            c1t0d0   ONLINE       0     0     0
            c1t1d0   OFFLINE      0     0     0
errors: No known data errors
此输出分为以下几部分:
总体池状态信息
此zpool status 输出中的开始部分包含以下字段(其中一些字段仅针对出现问题的池显示):
pool
池的名称。
state
池的当前运行状况。此信息仅指池提供必要复制级别的能力。处于 ONLINE 状态的池可能仍存在故障设备或数据损坏。
status
对池故障的说明。如果未发现问题,则省略此字段。
action
建议用于修复错误的操作。此字段为缩写形式,使用户转到以下节之一。如果未发现问题,则省略此字段。
see
对包含详细修复信息的知识文章的引用。联机文章的更新频率比本指南要高,因此应始终参考其中的最新修复过程。如果未发现问题,则省略此字段。
scrub
确定清理操作的当前状态,它可能包括完成上一清理的日期和时间、正在进行的清理或者是否未请求清理。
errors
确定是否存在已知的数据错误。
配置信息
zpool status 输出中的 config 字段说明构成池的设备的配置布局,以及设备的状态和设备产成的任何错误。其状态可以是以下状态之一:ONLINE、FAULTED、DEGRADED、UNAVAILABLE 或 OFFLINE。如果状态是除 ONLINE 之外的任何状态,则说明池的容错能力已受到损害。
配置输出的第二部分显示错误统计信息。这些错误分为以下三类:


  • READ-发出读取请求时出现 I/O 错误。

  • WRITE-发出写入请求时出现 I/O 错误。

  • CKSUM-校验和错误。设备将损坏的数据作为读取请求的结果返回。

这些错误可用于确定损坏是否是永久性的。小量 I/O 错误数可能指示临时故障,而大量 I/O 错误则可能指示设备出现了永久性问题。这些错误不一定对应于应用程序所解释的数据损坏。如果设备处于冗余配置中,则磁盘设备可能显示无法更正的错误,而镜像或 RAID-Z 设备级别上不显示错误。如果是这种情况,则说明 ZFS 成功检索了正确数据,并尝试从现有副本修复损坏的数据。
有关解释这些错误以确定设备故障的更多信息,请参见
确定设备故障的类型

最后,在 zpool status 输出的最后一列中显示其他辅助信息。此信息是对 state 字段的详述,以帮助诊断故障模式。如果设备处于 FAULTED 状态,则此字段指示是否无法访问设备或者设备上的数据是否已损坏。如果设备正在进行重新同步,则此字段显示当前的进度。
有关监视重新同步进度的更多信息,请参见
查看重新同步状态

清理状态
zpool status 输出的第三部分说明任何显式清理的当前状态。此信息不是用于指示系统上是否检测到任何错误,但是可以利用此信息来判定数据损坏错误报告的准确性。如果上一清理是最近结束的,则很可能已发现任何已知的数据损坏。
有关数据清理以及如何解释此信息的更多信息,请参见
检查 ZFS 数据完整性

数据损坏错误
zpool status 命令还显示是否有已知错误与池关联。在磁盘清理或常规操作期间,可能已发现这些错误。ZFS 将与池关联的所有数据错误记录在持久性日志中。每当系统的完整清理完成时,都会轮转此日志。
数据损坏错误始终是致命的。出现这种错误表明至少一个应用程序因池中的数据损坏而遇到 I/O 错误。复制池中的设备错误不会导致数据损坏,而且不会被记录为此日志的一部分。缺省情况下,仅显示发现的错误数。使用 zpool status -v 选项可以列出带有详细说明的完整错误列表。例如:
# zpool status -v
  pool: tank
state: DEGRADED
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: resilver completed with 1 errors on Fri Mar 17 15:42:18 2006
config:
        NAME         STATE     READ WRITE CKSUM
        tank         DEGRADED     0     0     1
          mirror     DEGRADED     0     0     1
            c1t0d0   ONLINE       0     0     2
            c1t1d0   UNAVAIL      0     0     0  corrupted data
errors: The following persistent errors have been detected:
          DATASET  OBJECT  RANGE
          5        0       lvl=4294967295 blkid=0
也可使用 fmd 在系统控制台上和 /var/adm/messages 文件中显示类似的消息。还可以使用 fmdump 命令跟踪这些消息。
有关解释数据损坏错误的更多信息,请参见
确定数据损坏的类型

ZFS 错误消息的系统报告
除了持久跟踪池中的错误外,ZFS 还在发生相关事件时显示系统日志消息。以下情况将生成事件以通知管理员:


  • 设备状态转换-如果设备变为 FAULTED 状态,则 ZFS 将记录一条消息,指出池的容错能力可能已受到损害。如果稍后将设备联机,将池恢复正常,则将发送类似的消息。

  • 数据损坏-如果检测到任何数据损坏,则 ZFS 将记录一条消息,以说明检测到损坏的时间和位置。仅在首次检测到数据损坏时才记录此消息。后续访问不生成消息。

  • 池故障和设备故障-如果出现池故障或设备故障,则故障管理器守护进程将通过系统日志消息以及 fmdump 命令报告这些错误。

如果 ZFS 检测到设备错误并自动从其恢复,则不进行通知。这样的错误不会造成池冗余或数据完整性方面的故障。并且,这样的错误通常是由伴随有自己的一组错误消息的驱动程序问题导致的。
修复损坏的 ZFS 配置
ZFS 在根文件系统上维护活动池及其配置的高速缓存。如果此文件已损坏或者不知何故变得与磁盘上所存储的内容不同步,则无法再打开池。虽然基础文件系统和存储的质量始终可能会带来任意的损坏,但是 ZFS 会尽量避免出现此情况。此情况通常会导致池从系统中消失(它原本应该是可用的)。此情况还可能表明其本身并不是一个完整的配置,缺少一定数目(具体数目未知)的顶层虚拟设备。在这两种情况下,都可以通过先导出池(如果它确实是可见的)再重新导入它来恢复配置。
有关导入和导出池的更多信息,请参见
迁移 ZFS 存储池

修复缺少的设备
如果设备无法打开,则它在 zpool status 输出中显示为 UNAVAILABLE。此状态表示在首次访问池时 ZFS 无法打开设备,或者设备自那时以来已变得不可用。如果设备导致顶层虚拟设备不可用,则无法访问池中的任何内容。此外,池的容错能力可能已受到损害。无论哪种情况,只需要将设备重新附加到系统即可恢复正常操作。
例如,设备出现故障后,可能会在 fmd 的输出中看到与以下内容类似的消息:
SUNW-MSG-ID: ZFS-8000-D3, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Fri Mar 17 14:38:47 MST 2006
PLATFORM: SUNW,Ultra-60, CSN: -, HOSTNAME: neo
SOURCE: zfs-diagnosis, REV: 1.0
EVENT-ID: 043bb0dd-f0a5-4b8f-a52d-8809e2ce2e0a
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 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-D3
scrub: resilver completed with 0 errors on Fri Mar 10 11:08:29 2006
config:
        NAME         STATE     READ WRITE CKSUM
        tank         DEGRADED     0     0     0
          mirror     DEGRADED     0     0     0
            c0t1d0   UNAVAIL      0     0     0  cannot open
            c1t1d0   ONLINE       0     0     0
从此输出中可以看到,缺少的设备 c0t1d0 不起作用。如果确定驱动器有故障,请替换该设备。
然后,使用 zpool online 命令将替换的设备联机。例如:
# zpool online tank c0t1d0
确认池在替换设备后运行状况良好。
# zpool status -x tank
pool 'tank' is healthy
以物理方式重新附加设备
重新附加缺少的设备的具体方式取决于相关设备。如果设备是网络连接驱动器,则应该恢复连通性。如果设备是 USB 或其他可移除介质,则应该将它重新附加到系统。如果设备是本地磁盘,则控制器可能已出现故障,以致设备对于系统不再可见。在这种情况下,应该替换控制器,以使磁盘重新可用。可能存在其他反常,具体取决于硬件的类型及其配置。如果驱动器出现故障,且对系统不再可见(不大可能的事件),则应该将该设备视为损坏的设备。按照
修复损坏的设备
中概述的过程操作。
将设备可用性通知 ZFS
将设备重新附加到系统后,ZFS 可能会也可能不会自动检测其可用性。如果池以前是有故障的,或者在附加过程中重新引导了系统,则 ZFS 在尝试打开池时会自动地重新扫描所有驱动器。如果在系统启动时池的性能降低且设备已替换,则必须通知 ZFS 设备现在是可用的并可以使用 zpool online 命令重新打开。例如:
# zpool online tank c0t1d0
有关使设备联机的更多信息,请参见
使设备联机

修复损坏的设备
本节介绍如何确定设备故障类型、清除瞬态错误和替换设备。
确定设备故障的类型
术语损坏的设备概念相当含糊,它可以用来描述许多可能的情况:


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

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

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

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

  • 损坏或反常的硬件-此情况是损坏的硬件所呈现的各种问题的集中体现。这可能是一致的 I/O 错误、导致随机损坏的有故障传输或任何数目的故障。这些错误通常是永久性的。

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

准确确定出现的错误可能是一个很困难的过程。第一步是检查 zpool status 输出中的错误计数,如下所示:
# zpool status -v pool
错误分为 I/O 错误与校验和错误,这两种错误都指示可能的故障类型。典型操作可预知的错误数非常少(在很长一段时间内只能预知几个错误)。如果看到大量的错误,则此情况可能指示即将出现或已出现设备故障。但是,管理员错误的反常可能会导致大的错误计数。另一信息源是系统日志。如果日志显示大量的 SCSI 或光纤通道驱动程序消息,则此情况可能指示出现了严重的硬件问题。如果未生成系统日志消息,则损坏很可能是瞬态的。
目的是回答以下问题:
此设备上是否可能出现另一错误?
仅出现一次的错误被认为是瞬态的,不指示存在潜在的故障。其持久性或严重性足以指示潜在硬件故障的错误被认为是“致命的”。确定错误类型的行为已超出当前可用于 ZFS 的任何自动化软件的功能范围,所以如此多的任务必须由您(即管理员)手动执行。在确定后,可以执行相应的操作。清除瞬态错误,或者替换出现致命错误的设备。以下几节将介绍这些修复过程。
即使设备错误被认为是瞬态的,它仍然可能导致池中出现了无法更正的数据错误。这些错误需要特殊的修复过程,即使认为基础设备运行状况良好或已进行修复也是如此。有关修复数据错误的更多信息,请参见
修复损坏的数据

清除瞬态错误
如果认为设备错误是瞬态的(因为它们不大可能影响设备将来的运行状况),则可以安全地清除设备错误,以指示未出现致命错误。要将 RAID-Z 或镜像设备的错误计数器清零,请使用 zpool clear 命令。例如:
# zpool clear tank c1t0d0
此语法清除与设备关联的任何错误,并清除与设备关联的任何数据错误计数。
要清除与池中虚拟设备关联的所有错误,并清除与池关联的任何数据错误计数,请使用以下语法:
# zpool clear tank
有关清除池错误的更多信息,请参见
清除存储池设备

替换 ZFS 存储池中的设备
如果设备损坏是永久性的,或者将来很可能出现永久性损坏,则必须替换该设备。是否可以替换设备取决于配置。
确定是否可以替换设备
对于要替换的设备,池必须处于 ONLINE 状态。设备必须是复制配置的一部分,或者其运行状况必须良好(处于 ONLINE 状态)。如果磁盘是复制配置的一部分,则必须存在从其中检索正确数据的足够副本。如果四向镜像中有两个磁盘是有故障的,则可以替换其中任一磁盘(因为运行状况良好的副本是可用的)。但是,如果四向 RAID-Z 设备中有两个磁盘是有故障的,则两个磁盘都不能替换(因为不存在从其中检索数据的足够副本)。如果设备已损坏但处于联机状态,则只要池不处于 FAULTED 状态就可以替换它。但是,除非存在包含正确数据的足够副本,否则会将设备上的任何错误数据复制到新设备。
在以下配置中,可以替换磁盘 c1t1d0,而且将从正确的副本 c1t0d0 复制池中的任何数据。
mirror            DEGRADED
    c1t0d0             ONLINE
    c1t1d0             FAULTED
虽然因没有可用的正确副本而无法对数据进行自我修复,但是还可以替换磁盘 c1t0d0。
在以下配置中,无法替换任一有故障磁盘。也无法替换 ONLINE 磁盘,因为池本身是有故障的。
raidz             FAULTED
    c1t0d0             ONLINE
    c2t0d0             FAULTED
    c3t0d0             FAULTED
    c3t0d0             ONLINE
在以下配置中,尽管已将磁盘上存在的错误数据复制到新磁盘,但是任一顶层磁盘都可替换。
c1t0d0         ONLINE
c1t1d0         ONLINE
如果其中一个磁盘是有故障的,则无法执行替换操作,因为池本身是有故障的。
无法替换的设备
如果设备缺失导致池出现故障,或者设备在未复制的配置中包含太多的数据错误,则无法安全地替换设备。如果没有足够的副本,则不存在可用来恢复损坏设备的正确数据。在这种情况下,唯一的选择是销毁池再重新创建配置,在该过程中恢复数据。
有关恢复整个池的更多信息,请参见
修复 ZFS 存储池范围内的损坏

替换设备
确定可以替换设备后,可以使用 zpool replace 命令替换设备。如果要将损坏的设备替换为另一个不同设备,请使用以下命令:
# zpool replace tank c1t0d0 c2t0d0
此命令首先将数据从损坏的设备或池中的其他设备(如果它在复制配置中)迁移到新设备。此命令完成后,将从配置中拆离损坏的设备,此时可以将该设备从系统中移除。如果已移除设备并在同一位置中将它替换为新设备,请使用命令的单设备形式。例如:
# zpool replace tank c1t0d0
此命令接受未格式化的磁盘,适当地将它格式化,然后开始重新同步其余配置中的数据。
有关 zpool replace 命令的更多信息,请参见
替换存储池中的设备

查看重新同步状态
替换驱动器这一过程可能需要很长一段时间,具体取决于驱动器的大小和池中的数据量。将数据从一个设备移动到另一设备的过程称为重新同步,可以使用 zpool status 命令对其进行监视。
传统的文件系统在块级别上重新同步数据。由于 ZFS 消除了卷管理器的人为分层,因此它能够以更强大的受控方式执行重新同步。此功能的两个主要优点如下:


  • ZFS 仅重新同步最少量的必要数据。出现暂时故障(与完全的设备替换相对)时,整个磁盘可以在几分钟或几秒内完成重新同步,而不用重新同步整个磁盘,或者通过一些卷管理器支持的“脏区域”日志记录使问题复杂化。替换整个磁盘时,重新同步过程所用的时间与磁盘上所用的数据量成比例。如果只使用了池中几 GB 的空间,则替换 500 GB 的磁盘可能只需要几秒的时间。

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

要查看重新同步过程,请使用 zpool status 命令。例如:
# zpool status tank
  pool: tank
state: DEGRADED
reason: One or more devices is being resilvered.
action: Wait for the resilvering process to complete.
   see: http://www.sun.com/msg/ZFS-XXXX-08
scrub: none requested
config:
        NAME                  STATE     READ WRITE CKSUM
        tank                  DEGRADED     0     0     0
          mirror              DEGRADED     0     0     0
            replacing         DEGRADED     0     0     0  52% resilvered
              c1t0d0          ONLINE       0     0     0
              c2t0d0          ONLINE       0     0     0  
            c1t1d0            ONLINE       0     0     0
在本示例中,磁盘 c1t0d0 被替换为 c2t0d0。 通过查看状态输出的配置部分中是否显示有 replacing ,可观察到此替换虚拟设备的事件。 此设备不是真正的设备,不可能使用此虚拟设备类型创建池。此设备的用途仅仅是显示重新同步过程,以及准确确定被替换的设备。
请注意,当前正进行重新同步的任何池都置于 DEGRADED 状态,因为在重新同步过程完成之前,池无法提供所需的复制级别。虽然 I/O 始终是按照比用户请求的 I/O 更低的优先级调度的(以最大限度地减少对系统的影响),但是重新同步会尽可能快地进行。重新同步完成后,该配置将恢复为新的完整配置。例如:
# zpool status tank
  pool: tank
state: ONLINE
scrub: scrub completed with 0 errors on Tue Mar  7 15:27:36 2006
config:
        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          mirror     ONLINE       0     0     0
            c2t0d0   ONLINE       0     0     0
            c1t1d0   ONLINE       0     0     0
errors: No known data errors
池再次处于 ONLINE 状态,而且原始的坏磁盘 (c1t0d0) 已从配置中删除。
修复损坏的数据
ZFS 使用校验和、复制和自我修复数据来最大限度地减少出现数据损坏的可能性。但是,如果未复制池,如果将池降级时出现损坏,或者不大可能发生的一系列事件协同损坏数据段的多个副本,则可能会出现数据损坏。不管是什么原因,结果都是相同的:数据被损坏,因此无法再进行访问。所执行的操作取决于被损坏数据的类型及其相对值。可能损坏以下两种基本类型的数据:


  • 池元数据-ZFS 需要解析一定量的数据才能打开池和访问数据集。如果此数据被损坏,则整个池或数据集分层结构的整个部分将变得不可用。

  • 对象数据-在这种情况下,损坏发生在特定的文件或目录中。此问题可能会导致无法访问该文件或目录的一部分,或者此问题可能导致对象完全损坏。

数据是在常规操作期间和清理过程中验证的。有关如何验证池数据完整性的更多信息,请参见
检查 ZFS 数据完整性

确定数据损坏的类型
缺省情况下,zpool status 命令仅说明已出现损坏,而不说明出现此损坏的位置。例如:
# zpool status tank -v
   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
         scrub: none requested
        config:
                NAME         STATE     READ WRITE CKSUM
                tank         ONLINE       1     0     0
                  mirror     ONLINE       1     0     0
                    c2t0d0   ONLINE       2     0     0
                    c1t1d0   ONLINE       2     0     0
        errors: The following persistent errors have been detected:
                  DATASET  OBJECT  RANGE
                  tank     6       0-512
每个错误仅指示在给定时间点出现了错误。每个错误不一定仍存在于系统上。在正常情况下,会出现此状况。某些临时故障可能会导致数据损坏(在故障结束后将得到自动修复)。完整的池清理可保证检查池中的每个活动块,因此每当清理完成后都会重置错误日志。如果确定错误不再存在,并且不希望等待清理完成,则使用 zpool online 命令重置池中的所有错误。
如果数据损坏位于池范围内的元数据中,则输出稍有不同。例如:
# zpool status -v morpheus
  pool: morpheus
    id: 1422736890544688191
state: FAULTED
status: The pool metadata is corrupted.
action: The pool cannot be imported due to damaged devices or data.
   see: http://www.sun.com/msg/ZFS-8000-72
config:
        morpheus    FAULTED   corrupted data
          c1t10d0   ONLINE
在出现池范围内损坏的情况下,池被置于 FAULTED 状态,因为池可能无法提供所需的复制级别。
修复损坏的文件或目录
如果文件或目录被损坏,则系统也许仍然能够正常工作,具体取决于损坏的类型。任何损坏实际上都是无法恢复的。系统上的任何位置都不存在数据的正确副本。如果数据很重要,则只能选择从备份恢复受影响的数据。尽管这样,您也许能够从此损坏恢复而不必恢复整个池。
如果损坏出现在文件数据块中,则可以安全地删除该文件,从而清除系统中的错误。第一步是尝试使用 rm 命令删除文件。如果此命令不起作用,则说明损坏出现在文件的元数据中,ZFS 无法为删除损坏而确定哪些块属于该文件。
如果损坏出现在目录或文件的元数据中,则唯一的选择是将文件移动到别处。可以安全地将任何文件或目录移动到不太方便的位置,以允许恢复原始对象。
修复 ZFS 存储池范围内的损坏
如果损坏出现在池元数据中(该损坏防碍打开池),则必须从备份恢复池及其所有数据。所用的机制通常随池配置和备份策略的不同而不同。首先,保存 zpool status 所显示的配置,以便在销毁池后可以重新创建它。然后,使用 zpool destroy -f 销毁池。此外,将说明数据集的布局和在本地设置的各种属性的文件保存在某个安全的位置(因为在使池无法访问后此信息将变得无法访问)。使用池配置和数据集布局,可以在销毁池后重新构造完整的配置。然后可以使用任何备份或恢复策略填充数据。
修复无法引导的系统
根据设计,即使在出错时 ZFS 也是强健而稳定的。尽管这样,在访问池时,软件错误或某些意外反常可能导致系统发出警告音。在引导过程中,必须打开每个池,这意味着这样的故障将导致系统进入应急重新引导循环。为了从此情况恢复,必须通知 ZFS 不要在启动时查找任何池。
ZFS 在 /etc/zfs/zpool.cache 中维护可用池及其配置的内部高速缓存。此文件的位置和内容是专用的,有可能更改。如果系统变得无法引导,则使用 -m milestone=none 引导选项引导到 none 里程碑。系统启动后,将根文件系统重新挂载为可写入,然后删除 /etc/zfs/zpool.cache。这些操作使 ZFS 忘记系统上存在池,从而阻止它尝试访问导致问题的损坏池。然后可以通过发出 svcadm milestone all 命令进入正常系统状态。从备用根引导时,可以使用类似的过程执行修复。
系统启动后,可以尝试使用 zpool import 命令导入池。但是,这样做很可能会导致在引导期间出现的相同错误,因为该命令使用相同机制访问池。如果系统上有多个池,而且您希望导入某个特定池而不访问任何其他池,则必须重新初始化已损坏池中的设备 ,此时可以安全地导入正确的池。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26090/showart_325730.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP