运行时如何检查“ mdadm” RAID?


41

我开始在家中收集一台计算机,并且为了支持它们,我让我的“服务器” linux盒运行RAID阵列。

目前mdadm RAID-1,它会在RAID-5我拥有更多驱动器时(然后RAID-6我希望)。但是,我听说过有关一个驱动器上的数据损坏的各种故事,直到第一个驱动器发生故障,直到发现第二个驱动器也被拧紧(直到第三个,第四个驱动器),您才会注意到由于使用了另一个驱动器,第5个驱动器)。

显然,备份很重要,我也将对此加以注意,但是我知道我以前见过一些脚本,这些脚本声称可以帮助解决此问题,并允许您在RAID运行时检查RAID。但是,现在再次寻找这些脚本,我发现很难找到任何与我之前运行的脚本类似的东西,而且我觉得我已经过时了,不了解发生了什么变化。

您如何检查正在运行的RAID,以确保所有磁盘仍正常运行?

我监视所有驱动器上的SMART,并且mdadm设置为在发生故障的情况下向我发送电子邮件,但我想知道我的驱动器有时也会对其进行“检查”。


听起来您已经在正确的道路上,只需要设置一个cron即可将驱动器的smartctl结果发送给您。
laebshade 2012年

Answers:


56

具有冗余的RAID的要点是它会一直保持运行状态,但是很显然它将检测到使它进入降级模式的错误,例如磁盘故障。您可以使用以下命令显示阵列的当前状态mdadm -D

# mdadm -D /dev/md0
<snip>
       0       8        5        0      active sync   /dev/sda5
       1       8       23        1      active sync   /dev/sdb7

此外,mdadm -D如果存在诸如组件故障之类的任何问题(1表示RAID模式进行补偿的错误,而2表示完全故障),则返回状态非零。

您还可以通过查看,快速获得所有RAID设备状态的摘要/proc/mdstat。您也可以从中获取有关RAID设备的信息/sys/class/block/md*/md/*。请参阅Documentation/md.txt内核文档。有些/sys条目也是可写的。例如,你可以触发一个完整的检查md0echo check >/sys/class/block/md0/md/sync_action

除了这些抽查之外,mdadm还可在发生问题时立即通知您。确保已经安装MAILADDR root/etc/mdadm.conf(某些发行版(例如Debian)会自动设置它)。然后,一旦发生错误(降级的阵列),您将收到一封电子邮件通知

确保您确实收到了发送到本地计算机上的root的邮件(某些现代发行版忽略了这一点,因为他们认为所有电子邮件都是通过外部提供程序发送的,但是对于任何认真的系统管理员而言,接收本地邮件都是必需的)。通过向root发送邮件进行测试:echo hello | mail -s test root@localhost。通常,正确的电子邮件设置需要两件事:

  • 在本地计算机上运行MTA。MTA必须至少设置为允许本地邮件传递。所有发行版都附带合适的MTA,选择任何内容(但如果您希望将电子邮件本地发送,则不选择nullmailer)。
  • 将进入系统帐户的邮件(至少root)重定向到您经常阅读的地址。这可以是您在本地计算机上的帐户,也可以是外部电子邮件地址。对于大多数MTA,可以在中配置地址/etc/aliases。你应该有这样一条线

    root: djsmiley2k
    

    用于本地交付,或

    root: djsmiley2k@mail-provider.example.com
    

    用于远程交付。如果选择远程传递,请确保为此配置了MTA。根据您的MTA,您可能需要newaliases在编辑后运行命令/etc/aliases


您能解释为什么不应该使用nullmailer吗?是因为unix.stackexchange.com/questions/1449/…中提到的原因吗?您会推荐哪种MTA?
卡梅隆·马丁

@CameronMartin Nullmailer仅将邮件转发到远程计算机,它不进行本地传递。如果您的某台SMTP服务器可以接收来自计算机的邮件,则可以使用它,但是如果要在本地传递邮件,则不能使用它。我已经编辑了答案以弄清楚。
吉尔(Gilles)'所以

19

您可以在联机时强制检查整个阵列。例如,要检查上的数组/dev/md0,请以root身份运行:

echo check > /sys/block/md0/md/sync_action

我还有一个cron作业,每月运行一次以下命令:

tar c /dir/of/raid/filesystem > /dev/null

这不是对驱动器本身的彻底检查,但是它确实迫使系统定期验证(几乎)每个文件都可以从磁盘中成功读取。是的,某些文件将从内存缓存而不是磁盘中读取。但是我认为,如果该文件位于内存缓存中,那么该文件最近已成功从磁盘上读取,或者即将被写入磁盘,并且这些操作中的任何一个都会发现驱动器错误。无论如何,运行此作业会测试RAID阵列的最重要标准(“我能否成功读取数据?”),并且在运行阵列的三年中,有一次我的驱动器坏了,那是发现它的该命令。

一个小警告是,如果您的文件系统很大,那么此命令将花费很长时间。我的系统大约需要6小时/ TiB。我使用来运行它,ionice以便在驱动器检查期间系统的其余部分不会停止运行:

ionice -c3 tar c /dir/of/raid/filesystem > /dev/null

请注意,ionice仅在使用(默认)CFQ I / O调度程序时,此方法才有效。
Totor

因此,这对于大多数人来说可能是显而易见的,但对我而言并非如此-运行将其输出重定向到devnull的脚本实际上如何通知您某些事情?如果“ tar”遇到任何错误,是否会传播到mdadm守护程序,该守护程序(大概)会向您发送电子邮件?
ljwobker

我想问您的问题是,如果它是由cron作业运行的,您如何处理tar错误?该输出在哪里?我以为您会为stderr添加一个重定向到一个文件,该文件可以定期监视,也可以将其尾部打印到打开终端窗口的控制台中:)
Madivad

1
@ljwobker对不起,恢复旧线程。我认为tar命令的目的是尝试读取该卷的全部内容。这将验证整个卷仍然可读,并使md有机会检测到损坏的磁盘。
mikepj

1
如果来自cronjob,cron通常会将其所有输出直接发送到mailto =位置(如果已设置),否则将其发送到root。但是...我想知道dd是否比tar更好,以降低开销?
djsmiley2k-CoW

11

Debian和Ubuntu'mdadm'软件包中包含该文件

/etc/cron.d/mdadm

依次在每个月的第一个星期日运行命令

/usr/share/mdadm/checkarray --cron --all --idle --quiet

这将检查所有数组的一致性(除非您在/ etc / default / mdadm中将AUTOCHECK设置为false )。报告将发送给“ root”用户(确保您收到此类电子邮件)。


8

我使用这个简单的功能来检查/proc/mdstat

#Health of RAID array
raid() { awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}'  /proc/mdstat; }

整齐!我喜欢这种风格:) ..这正是我想要放入MOTD的目的:)谢谢!
jirislav
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.