下一页 上一页 目录

4. 错误恢复

  1. : 我有一个 RAID-1 (镜像) 设置,在磁盘活动时断电了。现在我该怎么办?
    : RAID 级别的冗余旨在防止磁盘故障,而不是电源故障。有几种方法可以从这种情况中恢复。
    • 方法 (1): 使用 raid 工具。这些工具可以用来同步 raid 阵列。它们不修复文件系统损坏;在 raid 阵列同步后,仍然需要使用 fsck 修复文件系统。可以使用 ckraid /etc/raid1.conf (对于 RAID-1,否则,使用 /etc/raid5.conf 等)检查 Raid 阵列。调用 ckraid /etc/raid1.conf --fix 将选择阵列中的一个磁盘(通常是第一个),并将其用作主副本,并将其块复制到镜像中的其他磁盘。要指定哪个磁盘应被用作主磁盘,您可以使用 --force-source 标志:例如,ckraid /etc/raid1.conf --fix --force-source /dev/hdc3 ckraid 命令可以在不使用 --fix 选项的情况下安全运行,以验证非活动的 RAID 阵列,而不会进行任何更改。当您对建议的更改感到满意时,请提供 --fix 选项。
    • 方法 (2): 多疑的,耗时的,并不比第一种方法好多少。假设一个由分区 /dev/hda3/dev/hdc3 组成的双磁盘 RAID-1 阵列。您可以尝试以下操作
      1. fsck /dev/hda3
      2. fsck /dev/hdc3
      3. 决定两个分区中哪个分区错误较少,或者更容易恢复,或者恢复了您想要的数据。选择一个,任何一个,作为您的新“主”副本。假设您选择了 /dev/hdc3
      4. dd if=/dev/hdc3 of=/dev/hda3
      5. mkraid raid1.conf -f --only-superblock
      您可以运行 ckraid /etc/raid1.conf --fix --force-source /dev/hdc3 来代替最后两个步骤,这应该会更快一些。
    • 方法 (3): 上述方法的懒人版本。如果您不想等待漫长的 fsck 完成,完全可以跳过上面的前三个步骤,直接进行最后两个步骤。只需确保在完成后运行 fsck /dev/md0 即可。方法 (3) 实际上只是方法 (1) 的伪装。
    在任何情况下,以上步骤都只会同步 raid 阵列。文件系统可能也需要修复:为此,需要在活动的、未挂载的 md 设备上运行 fsck。

    对于三磁盘 RAID-1 阵列,有更多的可能性,例如使用两个磁盘来“投票”多数答案。目前(97 年 9 月)尚不存在自动化此过程的工具。

  2. : 我有一个 RAID-4 或 RAID-5 (奇偶校验) 设置,在磁盘活动时断电了。现在我该怎么办?
    : RAID 级别的冗余旨在防止磁盘故障,而不是电源故障。由于 RAID-4 或 RAID-5 阵列中的磁盘不包含 fsck 可以读取的文件系统,因此修复选项较少。您不能使用 fsck 进行初步检查和/或修复;您必须首先使用 ckraid。

    ckraid 命令可以在不使用 --fix 选项的情况下安全运行,以验证非活动的 RAID 阵列,而不会进行任何更改。当您对建议的更改感到满意时,请提供 --fix 选项。

    如果您愿意,您可以尝试将其中一个磁盘指定为“故障磁盘”。使用 --suggest-failed-disk-mask 标志执行此操作。

    标志中只能设置一位:RAID-5 无法恢复两个故障磁盘。掩码是一个二进制位掩码:因此

        0x1 == first disk
        0x2 == second disk
        0x4 == third disk
        0x8 == fourth disk, etc.
                
    

    或者,您可以选择修改奇偶校验扇区,方法是使用 --suggest-fix-parity 标志。这将从其他扇区重新计算奇偶校验。

    标志 --suggest-failed-dsk-mask--suggest-fix-parity 可以安全地用于验证。如果未指定 --fix 标志,则不会进行任何更改。因此,您可以尝试不同的可能修复方案。

  3. : 我的 RAID-1 设备 /dev/md0 由两个硬盘分区组成:/dev/hda3/dev/hdc3。最近,带有 /dev/hdc3 的磁盘发生故障,并已更换为新磁盘。我最好的朋友,他不了解 RAID,说现在正确的做法是“dd if=/dev/hda3 of=/dev/hdc3”。我尝试了,但事情仍然不起作用。
    : 您应该让您最好的朋友远离您的电脑。幸运的是,没有造成严重的损坏。您可以通过运行以下命令来恢复:
    mkraid raid1.conf -f --only-superblock
                
    
    通过使用 dd,创建了分区的两个相同副本。这几乎是正确的,只是 RAID-1 内核扩展期望 RAID 超级块是不同的。因此,当您尝试重新激活 RAID 时,软件会注意到问题,并停用两个分区之一。通过重新创建超级块,您应该拥有一个完全可用的系统。
  4. : 我的 mkraid 版本没有 --only-superblock 标志。我该怎么办?
    : 较新的工具放弃了对此标志的支持,并用 --force-resync 标志替换了它。据报告,以下顺序似乎适用于最新的工具和软件
      umount /web (where /dev/md0 was mounted on)
      raidstop /dev/md0
      mkraid /dev/md0 --force-resync --really-force
      raidstart /dev/md0
                
    
    完成此操作后,cat /proc/mdstat 应该报告 resync in progress,并且此时应该可以 mount /dev/md0
  5. : 我的 RAID-1 设备 /dev/md0 由两个硬盘分区组成:/dev/hda3/dev/hdc3。我最好的(女性?)朋友,她不了解 RAID,在我没注意的时候在 /dev/hda3 上运行了 fsck,现在 RAID 无法工作了。我该怎么办?
    : 您应该重新审视您对“最好的朋友”的概念。通常,永远不应在组成 RAID 阵列的各个分区上运行 fsck。假设两个分区都没有/没有受到严重损坏,则没有发生数据丢失,并且可以按如下方式恢复 RAID-1 设备
    1. 备份 /dev/hda3 上的文件系统
    2. dd if=/dev/hda3 of=/dev/hdc3
    3. mkraid raid1.conf -f --only-superblock
    这应该让您拥有一个正常工作的磁盘镜像。
  6. : 为什么上述方法可以作为恢复程序?
    : 因为 RAID-1 镜像中的每个组件分区都是文件系统的完全有效副本。在紧急情况下,可以禁用镜像,并且可以挂载其中一个分区并安全地作为普通的非 RAID 文件系统运行。当您准备好重新开始使用 RAID-1 时,请卸载分区,并按照上述说明恢复镜像。请注意,以上方法仅适用于 RAID-1,而不适用于任何其他级别。

    将上面的复制方向反转可能会让您感觉更舒服:未触及的磁盘复制被触及的磁盘。只需确保对最终的 md 执行 fsck 即可。

  7. : 我对以上问题感到困惑,但还没有放弃。运行 fsck /dev/md0 安全吗?
    : 是的,在 md 设备上运行 fsck 是安全的。事实上,这是运行 fsck唯一安全位置。
  8. : 如果一个磁盘正在缓慢地发生故障,它会很明显是哪个磁盘吗?我担心情况并非如此,这种困惑可能会导致系统管理员做出一些危险的决定。
    : 一旦磁盘发生故障,低级驱动程序将向 RAID 驱动程序返回一个错误代码。RAID 驱动程序将在“良好”磁盘的 RAID 超级块中将其标记为“坏”(这样我们稍后就会知道哪些镜像良好,哪些镜像不良),并在剩余的可用镜像上继续 RAID 操作。

    当然,这假设磁盘和低级驱动程序可以检测到读/写错误,并且不会例如静默地损坏数据。这对于当前驱动器来说是正确的(内部正在使用错误检测方案),并且是 RAID 操作的基础。

  9. : 热修复呢?
    : 完成“热重建”的工作正在进行中。使用此功能,可以将几个“备用”磁盘添加到 RAID 集(无论是级别 1 还是 4/5),一旦磁盘发生故障,它将在运行时在其中一个备用磁盘上重建,而无需关闭阵列。

    但是,要使用此功能,备用磁盘必须在启动时声明,或者必须热添加,这需要使用特殊的机箱和连接器,以便在电源打开时添加磁盘。

    截至 97 年 10 月,有一个 MD 的 beta 版本允许

    • 在备用驱动器上进行 RAID 1 和 5 重建
    • 在不干净的关机后进行 RAID-5 奇偶校验重建
    • 将备用磁盘热添加到已运行的 RAID 1 或 4/5 阵列
    默认情况下,由于这项工作的初步性质,自动重建目前(97 年 12 月)默认禁用。可以通过更改 include/linux/md.hSUPPORT_RECONSTRUCTION 的值来启用它。

    如果在创建阵列时将备用驱动器配置到阵列中,并且启用了基于内核的重建,则备用驱动器将已经包含 RAID 超级块(由 mkraid 写入),并且内核将自动重建其内容(无需通常的 mdstop、更换驱动器、ckraidmdrun 步骤)。

    如果您没有运行自动重建,并且没有配置热备用磁盘,则建议使用 Gadi Oxman < gadio@netvision.net.il> 描述的步骤

    • 目前,一旦第一个磁盘被移除,RAID 集将在降级模式下运行。要恢复完全运行模式,您需要
      • 停止阵列 (mdstop /dev/md0)
      • 更换故障驱动器
      • 运行 ckraid raid.conf 以重建其内容
      • 再次运行阵列 (mdadd, mdrun)。
      此时,阵列将在所有驱动器上运行,并再次防止单个驱动器故障。

    目前,不可能为多个阵列分配单个热备用磁盘。每个阵列都需要自己的热备用磁盘。

  10. : 我想要一个“你这个笨蛋,镜像中的一个磁盘坏了”的音频警报,以便新手系统管理员知道存在问题。
    : 内核正在 syslog 中以 “KERN_ALERT” 优先级记录该事件。有几个软件包可以监视 syslog 文件,并自动发出 PC 扬声器蜂鸣声、呼叫寻呼机、发送电子邮件等。
  11. : 如何在降级模式下(一个磁盘故障,尚未更换)运行 RAID-5?
    : Gadi Oxman < gadio@netvision.net.il> 写道:通常,要运行由 n 个驱动器组成的 RAID-5 集,您必须
    mdadd /dev/md0 /dev/disk1 ... /dev/disk(n)
    mdrun -p5 /dev/md0
                  
    
    即使其中一个磁盘发生故障,您仍然必须像在正常设置中一样 mdadd 它。(?? 尝试使用 /dev/null 代替故障磁盘 ??? 注意)然后,阵列将在降级模式下激活,并带有 (n - 1) 个驱动器。如果 “mdrun” 失败,则内核已注意到错误(例如,多个故障驱动器或不干净的关机)。使用 “dmesg” 显示来自 “mdrun” 的内核错误消息。如果 raid-5 集由于电源故障而不是磁盘崩溃而损坏,则可以尝试通过创建新的 RAID 超级块来恢复
    mkraid -f --only-superblock raid5.conf
                
    
    RAID 阵列不提供针对电源故障或内核崩溃的保护,并且无法保证正确恢复。重建超级块将只是通过将所有驱动器标记为“OK”来使系统忽略该情况,就好像什么都没发生一样。
  12. : 当磁盘发生故障时,RAID-5 是如何工作的?
    : 典型的操作场景如下
    • RAID-5 阵列处于活动状态。
    • 一个驱动器在阵列活动时发生故障。
    • 驱动器固件和低级 Linux 磁盘/控制器驱动程序检测到故障,并向 MD 驱动程序报告错误代码。
    • MD 驱动程序继续通过使用剩余的可用驱动器,向内核的更高级别提供无错误的 /dev/md0 设备(性能有所下降)。
    • 系统管理员可以像往常一样 umount /dev/md0mdstop /dev/md0
    • 如果未更换故障驱动器,系统管理员仍然可以像往常一样在降级模式下启动阵列,方法是运行 mdaddmdrun
  13. :
    :
  14. : 为什么没有问题 13?
    : 如果您关注 RAID、高可用性和 UPS,那么迷信也是一个好主意。这没什么坏处,不是吗?
  15. : 我刚刚更换了 RAID-5 阵列中的一个故障磁盘。重建阵列后,fsck 报告了很多很多错误。这正常吗?
    : 不正常。而且,除非您在“仅验证;不更新”模式下运行 fsck,否则您很可能已损坏您的数据。不幸的是,一个并非不常见的场景是在更换硬盘驱动器后,意外地更改了 RAID-5 阵列中的磁盘顺序。尽管 RAID 超级块存储了正确的顺序,但并非所有工具都使用此信息。特别是,当前版本的 ckraid 将使用 -f 标志(通常是文件 /etc/raid5.conf)指定的信息,而不是超级块中的数据。如果指定的顺序不正确,则更换的磁盘将重建不正确。这种错误的症状似乎是大量且众多的 fsck 错误。

    而且,如果您想知道,是的,有人因为犯了这个错误而丢失了所有数据。强烈建议在重新配置 RAID 阵列之前备份所有数据。

  16. : 快速入门指南说 mdstop 只是为了确保磁盘已同步。这真的有必要吗?卸载文件系统还不够吗?
    : 命令 mdstop /dev/md0 将会
    • 将其标记为“干净”。这使我们能够检测到不干净的关机,例如由于电源故障或内核崩溃。
    • 同步阵列。在卸载文件系统后,这不太重要,但如果直接访问 /dev/md0 而不是通过文件系统(例如,通过 e2fsck),则很重要。

下一页 上一页 目录