答: RAID 级别的冗余旨在防止磁盘故障,而不是电源故障。有几种方法可以从这种情况中恢复。在任何情况下,以上步骤都只会同步 raid 阵列。文件系统可能也需要修复:为此,需要在活动的、未挂载的 md 设备上运行 fsck。
- 方法 (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 阵列。您可以尝试以下操作您可以运行
fsck /dev/hda3
fsck /dev/hdc3
- 决定两个分区中哪个分区错误较少,或者更容易恢复,或者恢复了您想要的数据。选择一个,任何一个,作为您的新“主”副本。假设您选择了
/dev/hdc3
。dd if=/dev/hdc3 of=/dev/hda3
mkraid raid1.conf -f --only-superblock
ckraid /etc/raid1.conf --fix --force-source /dev/hdc3
来代替最后两个步骤,这应该会更快一些。- 方法 (3): 上述方法的懒人版本。如果您不想等待漫长的 fsck 完成,完全可以跳过上面的前三个步骤,直接进行最后两个步骤。只需确保在完成后运行
fsck /dev/md0
即可。方法 (3) 实际上只是方法 (1) 的伪装。对于三磁盘 RAID-1 阵列,有更多的可能性,例如使用两个磁盘来“投票”多数答案。目前(97 年 9 月)尚不存在自动化此过程的工具。
答: 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
标志,则不会进行任何更改。因此,您可以尝试不同的可能修复方案。
/dev/md0
由两个硬盘分区组成:/dev/hda3
和 /dev/hdc3
。最近,带有 /dev/hdc3
的磁盘发生故障,并已更换为新磁盘。我最好的朋友,他不了解 RAID,说现在正确的做法是“dd if=/dev/hda3 of=/dev/hdc3
”。我尝试了,但事情仍然不起作用。答: 您应该让您最好的朋友远离您的电脑。幸运的是,没有造成严重的损坏。您可以通过运行以下命令来恢复:通过使用
mkraid raid1.conf -f --only-superblockdd
,创建了分区的两个相同副本。这几乎是正确的,只是 RAID-1 内核扩展期望 RAID 超级块是不同的。因此,当您尝试重新激活 RAID 时,软件会注意到问题,并停用两个分区之一。通过重新创建超级块,您应该拥有一个完全可用的系统。
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/md0cat /proc/mdstat
应该报告resync in progress
,并且此时应该可以mount /dev/md0
。
/dev/md0
由两个硬盘分区组成:/dev/hda3
和 /dev/hdc3
。我最好的(女性?)朋友,她不了解 RAID,在我没注意的时候在 /dev/hda3
上运行了 fsck
,现在 RAID 无法工作了。我该怎么办?答: 您应该重新审视您对“最好的朋友”的概念。通常,永远不应在组成 RAID 阵列的各个分区上运行fsck
。假设两个分区都没有/没有受到严重损坏,则没有发生数据丢失,并且可以按如下方式恢复 RAID-1 设备这应该让您拥有一个正常工作的磁盘镜像。
- 备份
/dev/hda3
上的文件系统dd if=/dev/hda3 of=/dev/hdc3
mkraid raid1.conf -f --only-superblock
答: 因为 RAID-1 镜像中的每个组件分区都是文件系统的完全有效副本。在紧急情况下,可以禁用镜像,并且可以挂载其中一个分区并安全地作为普通的非 RAID 文件系统运行。当您准备好重新开始使用 RAID-1 时,请卸载分区,并按照上述说明恢复镜像。请注意,以上方法仅适用于 RAID-1,而不适用于任何其他级别。将上面的复制方向反转可能会让您感觉更舒服:从未触及的磁盘复制到被触及的磁盘。只需确保对最终的 md 执行 fsck 即可。
fsck /dev/md0
安全吗?答: 是的,在md
设备上运行fsck
是安全的。事实上,这是运行fsck
的唯一安全位置。
答: 一旦磁盘发生故障,低级驱动程序将向 RAID 驱动程序返回一个错误代码。RAID 驱动程序将在“良好”磁盘的 RAID 超级块中将其标记为“坏”(这样我们稍后就会知道哪些镜像良好,哪些镜像不良),并在剩余的可用镜像上继续 RAID 操作。当然,这假设磁盘和低级驱动程序可以检测到读/写错误,并且不会例如静默地损坏数据。这对于当前驱动器来说是正确的(内部正在使用错误检测方案),并且是 RAID 操作的基础。
答: 完成“热重建”的工作正在进行中。使用此功能,可以将几个“备用”磁盘添加到 RAID 集(无论是级别 1 还是 4/5),一旦磁盘发生故障,它将在运行时在其中一个备用磁盘上重建,而无需关闭阵列。但是,要使用此功能,备用磁盘必须在启动时声明,或者必须热添加,这需要使用特殊的机箱和连接器,以便在电源打开时添加磁盘。
截至 97 年 10 月,有一个 MD 的 beta 版本允许
默认情况下,由于这项工作的初步性质,自动重建目前(97 年 12 月)默认禁用。可以通过更改
- 在备用驱动器上进行 RAID 1 和 5 重建
- 在不干净的关机后进行 RAID-5 奇偶校验重建
- 将备用磁盘热添加到已运行的 RAID 1 或 4/5 阵列
include/linux/md.h
中SUPPORT_RECONSTRUCTION
的值来启用它。
如果在创建阵列时将备用驱动器配置到阵列中,并且启用了基于内核的重建,则备用驱动器将已经包含 RAID 超级块(由
mkraid
写入),并且内核将自动重建其内容(无需通常的mdstop
、更换驱动器、ckraid
、mdrun
步骤)。
如果您没有运行自动重建,并且没有配置热备用磁盘,则建议使用 Gadi Oxman < gadio@netvision.net.il> 描述的步骤
- 目前,一旦第一个磁盘被移除,RAID 集将在降级模式下运行。要恢复完全运行模式,您需要
此时,阵列将在所有驱动器上运行,并再次防止单个驱动器故障。
- 停止阵列 (
mdstop /dev/md0
)- 更换故障驱动器
- 运行
ckraid raid.conf
以重建其内容- 再次运行阵列 (
mdadd
,mdrun
)。目前,不可能为多个阵列分配单个热备用磁盘。每个阵列都需要自己的热备用磁盘。
答: 内核正在 syslog 中以 “KERN_ALERT
” 优先级记录该事件。有几个软件包可以监视 syslog 文件,并自动发出 PC 扬声器蜂鸣声、呼叫寻呼机、发送电子邮件等。
答: Gadi Oxman < gadio@netvision.net.il> 写道:通常,要运行由 n 个驱动器组成的 RAID-5 集,您必须即使其中一个磁盘发生故障,您仍然必须像在正常设置中一样
mdadd /dev/md0 /dev/disk1 ... /dev/disk(n) mdrun -p5 /dev/md0mdadd
它。(?? 尝试使用 /dev/null 代替故障磁盘 ??? 注意)然后,阵列将在降级模式下激活,并带有 (n - 1) 个驱动器。如果 “mdrun
” 失败,则内核已注意到错误(例如,多个故障驱动器或不干净的关机)。使用 “dmesg
” 显示来自 “mdrun
” 的内核错误消息。如果 raid-5 集由于电源故障而不是磁盘崩溃而损坏,则可以尝试通过创建新的 RAID 超级块来恢复RAID 阵列不提供针对电源故障或内核崩溃的保护,并且无法保证正确恢复。重建超级块将只是通过将所有驱动器标记为“OK”来使系统忽略该情况,就好像什么都没发生一样。
mkraid -f --only-superblock raid5.conf
答: 典型的操作场景如下
- RAID-5 阵列处于活动状态。
- 一个驱动器在阵列活动时发生故障。
- 驱动器固件和低级 Linux 磁盘/控制器驱动程序检测到故障,并向 MD 驱动程序报告错误代码。
- MD 驱动程序继续通过使用剩余的可用驱动器,向内核的更高级别提供无错误的
/dev/md0
设备(性能有所下降)。- 系统管理员可以像往常一样
umount /dev/md0
和mdstop /dev/md0
。- 如果未更换故障驱动器,系统管理员仍然可以像往常一样在降级模式下启动阵列,方法是运行
mdadd
和mdrun
。
答:
答: 如果您关注 RAID、高可用性和 UPS,那么迷信也是一个好主意。这没什么坏处,不是吗?
fsck
报告了很多很多错误。这正常吗?答: 不正常。而且,除非您在“仅验证;不更新”模式下运行 fsck,否则您很可能已损坏您的数据。不幸的是,一个并非不常见的场景是在更换硬盘驱动器后,意外地更改了 RAID-5 阵列中的磁盘顺序。尽管 RAID 超级块存储了正确的顺序,但并非所有工具都使用此信息。特别是,当前版本的ckraid
将使用-f
标志(通常是文件/etc/raid5.conf
)指定的信息,而不是超级块中的数据。如果指定的顺序不正确,则更换的磁盘将重建不正确。这种错误的症状似乎是大量且众多的fsck
错误。而且,如果您想知道,是的,有人因为犯了这个错误而丢失了所有数据。强烈建议在重新配置 RAID 阵列之前备份所有数据。
mdstop
只是为了确保磁盘已同步。这真的有必要吗?卸载文件系统还不够吗?答: 命令mdstop /dev/md0
将会
- 将其标记为“干净”。这使我们能够检测到不干净的关机,例如由于电源故障或内核崩溃。
- 同步阵列。在卸载文件系统后,这不太重要,但如果直接访问
/dev/md0
而不是通过文件系统(例如,通过e2fsck
),则很重要。