本 HOWTO 已弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/
本节介绍软件 RAID 系统的日常使用,包括与阵列通信和进行调整。
请注意,在处理 md 设备时,您应始终记住您正在操作整个文件系统。因此,尽管可能存在一些冗余来保证您的文件安全,但您必须谨慎操作。
这没什么神秘的。只需快速查看标准日志和状态文件即可注意到驱动器故障。
无论发生什么,/var/log/messages
总是会充斥着大量的错误消息。但是,当涉及到磁盘崩溃时,会报告大量的内核错误。给受虐狂们看一些令人讨厌的例子:
kernel: scsi0 channel 0 : resetting for second half of retries. kernel: SCSI bus is being reset for host 0 channel 0. kernel: scsi0: Sending Bus Device Reset CCB #2666 to Target 0 kernel: scsi0: Bus Device Reset CCB #2666 to Target 0 Completed kernel: scsi : aborting command due to timeout : pid 2649, scsi0, channel 0, id 0, lun 0 Write (6) 18 33 11 24 00 kernel: scsi0: Aborting CCB #2669 to Target 0 kernel: SCSI host 0 channel 0 reset (pid 2644) timed out - trying harder kernel: SCSI bus is being reset for host 0 channel 0. kernel: scsi0: CCB #2669 to Target 0 Aborted kernel: scsi0: Resetting BusLogic BT-958 due to Target 0 kernel: scsi0: *** BusLogic BT-958 Initialized Successfully ***大多数情况下,磁盘故障看起来像这样:
kernel: sidisk I/O error: dev 08:01, sector 1590410 kernel: SCSI disk error : host 0 channel 0 id 0 lun 0 return code = 28000002或者这样
kernel: hde: read_intr: error=0x10 { SectorIdNotFound }, CHS=31563/14/35, sector=0 kernel: hde: read_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }而且,正如预期的那样,经典的
/proc/mdstat
输出也将显示问题:Personalities : [linear] [raid0] [raid1] [translucent] read_ahead not set md7 : active raid1 sdc9[0] sdd5[8] 32000 blocks [2/1] [U_]在本节后面,我们将学习如何使用 mdadm 监控 RAID,以便我们可以接收关于磁盘故障的警报报告。现在是时候了解更多关于
/proc/mdstat
的解释了。
您可以随时查看 /proc/mdstat
。这没什么坏处。让我们学习如何读取该文件。例如,
Personalities : [raid1] read_ahead 1024 sectors md5 : active raid1 sdb5[1] sda5[0] 4200896 blocks [2/2] [UU] md6 : active raid1 sdb6[1] sda6[0] 2104384 blocks [2/2] [UU] md7 : active raid1 sdb7[1] sda7[0] 2104384 blocks [2/2] [UU] md2 : active raid1 sdc7[1] sdd8[2] sde5[0] 1052160 blocks [2/2] [UU] unused devices: none要识别备用设备,首先查找行上的 [#/#] 值。第一个数字是已定义的完整 raid 设备的数量。假设它是 “n”。每个设备后面的 raid 角色编号 [#] 指示其在 raid 集中的角色或功能。任何角色编号为 “n” 或更高的设备都是备用磁盘。0,1,..,n-1 用于工作阵列。
此外,如果发生故障,故障设备将在 [#] 后标记为 (F)。替换此设备的备用设备将是角色编号为 n 或更高且未标记 (F) 的最低编号设备。一旦重新同步操作完成,设备的角色编号将交换。
设备在 /proc/mdstat
输出中出现的顺序没有任何意义。
最后,请记住,您可以随时使用 raidtools 或 mdadm 来检查阵列。
mdadm --detail /dev/mdx lsraid -a /dev/mdx这些命令将清晰地显示备用磁盘和故障磁盘。
如果您计划使用 RAID 来获得容错能力,您可能还需要测试您的设置,以查看它是否真的有效。那么,如何模拟磁盘故障呢?
简而言之,您无法模拟,除非您用消防斧劈开您想要“模拟”故障的驱动器。您永远无法知道驱动器发生故障时会发生什么。它可能会在电气上将其连接的总线一起带走,导致该总线上的所有驱动器都无法访问。我从未听说过这种情况发生,但这完全有可能。驱动器也可能只是向 SCSI/IDE 层报告读/写故障,这反过来使 RAID 层优雅地处理这种情况。幸运的是,这通常是事情的走向。
请记住,您必须运行 RAID-{1,4,5},您的阵列才能在磁盘故障中幸存下来。当设备丢失时,Linear 或 RAID-0 将完全失败。
如果您想模拟驱动器故障,您可以直接拔出驱动器。您应该在断电的情况下执行此操作。如果您有兴趣测试在磁盘数量少于通常数量的情况下,您的数据是否可以幸存下来,那么在这里当热插拔牛仔是毫无意义的。关闭系统,拔下磁盘,然后再次启动。
查看系统日志,并查看 /proc/mdstat
以了解 RAID 的运行状况。它工作了吗?
如果您查看 /proc/mdstat
,故障磁盘应标记为 (F)
。此外,mdadm 用户应看到设备状态为 faulty
。
当您再次重新连接磁盘时(当然,请记住,断电状态),您可以使用 raidhotadd 命令将“新”设备再次添加到 RAID。
较新版本的 raidtools 附带 raidsetfaulty
命令。通过使用 raidsetfaulty
,您可以模拟驱动器故障,而无需拔出任何东西。
只需运行命令
raidsetfaulty /dev/md1 /dev/sdc2应该足以使阵列 /dev/md1 的磁盘 /dev/sdc2 发生故障。如果您使用的是 mdadm,只需键入
mdadm --manage --set-faulty /dev/md1 /dev/sdc2现在事情开始变得有趣起来。首先,您应该在系统的日志中看到类似于第一行的内容。如果您配置了备用磁盘,则会出现类似于第二行的内容。
kernel: raid1: Disk failure on sdc2, disabling device. kernel: md1: resyncing spare disk sdb7 to replace failed disk检查
/proc/mdstat
输出将显示降级的阵列。如果存在可用的备用磁盘,则应该已经开始重建。
最新 raidtools 中的另一个新实用程序是 lsraid
。尝试使用
lsraid -a /dev/md1mdadm 用户可以运行命令
mdadm --detail /dev/md1并欣赏结果。
现在您已经了解了设备发生故障时的情况。让我们修复问题。
首先,我们将从阵列中删除故障磁盘。运行命令
raidhotremove /dev/md1 /dev/sdc2mdadm 用户可以运行命令
mdadm /dev/md1 -r /dev/sdc2请注意,
raidhotremove
无法从正在运行的阵列中拔出磁盘。出于显而易见的原因,只有崩溃的磁盘才能从阵列中热移除(运行 raidstop 和卸载设备无济于事)。
现在我们有一个 /dev/md1,它刚刚丢失了一个设备。这可能是降级的 RAID 或许是处于重建过程中的系统。我们等到恢复结束后再将一切恢复正常。
因此,当我们把 /dev/sdc2 送回家时,旅程结束了。
raidhotadd /dev/md1 /dev/sdc2与往常一样,您可以使用 mdadm 而不是 raidtools。这应该是命令
mdadm /dev/md1 -a /dev/sdc2当浪子回头回到阵列时,我们将看到它在必要时成为 /dev/md1 的活跃成员。如果不是,它将被标记为备用磁盘。这就是简化的管理。
RAID(无论是硬件 RAID 还是软件 RAID)都假定,如果对磁盘的写入未返回错误,则写入成功。因此,如果您的磁盘在不返回错误的情况下损坏数据,您的数据将被损坏。这当然不太可能发生,但这是有可能的,并且会导致文件系统损坏。
RAID 不能也不应该防止介质上的数据损坏。因此,故意损坏磁盘上的数据(例如使用 dd
)以查看 RAID 系统将如何处理也是没有任何意义的。最有可能的是(除非您损坏了 RAID 超级块),RAID 层永远不会发现损坏,但 RAID 设备上的文件系统将被损坏。
这就是事情应该运作的方式。RAID 不是数据完整性的保证,它只是允许您在磁盘发生故障时保留数据(当然,对于 RAID 级别高于或等于 1 的情况)。
您可以使用 follow-monitor 模式将 mdadm 作为守护程序运行。如果需要,这将使 mdadm 在阵列遇到错误或故障时向系统管理员发送电子邮件警报。此外,follow 模式可用于在磁盘发生故障时触发应急命令,例如通过移除并重新插入故障磁盘来给予其第二次机会,从而自动解决非致命故障。
让我们看一个基本示例。运行
mdadm --monitor --mail=root@localhost --delay=1800 /dev/md2应该会释放一个 mdadm 守护程序来监控 /dev/md2。delay 参数意味着轮询将以 1800 秒的间隔进行。最后,关键事件和致命错误应通过电子邮件发送给系统管理员。这就是简化的 RAID 监控。
最后,--program
或 --alert
参数指定在检测到事件时要运行的程序。
请注意,一旦 mdadm 守护程序确定有阵列需要监控,它将永远不会退出,因此通常应在后台运行。请记住,您正在运行的是守护程序,而不是 shell 命令。
使用 mdadm 监控 RAID 阵列既简单又有效。但是,这种监控存在一些根本性问题 - 例如,如果 mdadm 守护程序停止了会发生什么?为了克服这个问题,应该寻找“真正的”监控解决方案。有许多免费软件、开源和商业解决方案可用于 Linux 上的软件 RAID 监控。在 FreshMeat 上搜索应该会返回很多匹配项。