导致系统崩溃的严重 RAID 问题

导致系统崩溃的严重 RAID 问题

系统:双 Xeon E5-2630 CPU,32GB RAM,主磁盘为 SATA-III 512GB Crucial SSD 操作系统:Xubuntu 14.04.1

我在这个新系统上遇到了严重的 RAID 问题,希望你们能提供一些见解。目前,带有根文件系统的主 SSD 尚未镜像,但我计划将来将其镜像到第二个相同的 SSD。我正在尝试在辅助 HDD 组上设置 RAID,并且不愿意在问题解决之前升级主 SSD 组。

我在这个系统中有一对 SATA-III Seagate ST4000DM0004TB Baracuda 4TB 硬盘,它们的格式与单个大型 ext4 GPT 分区相同。我一直在尝试在这些磁盘上创建一个有用的 RAID 1 镜像,然后将其安装在 /x 上。有一次,我遇到了一个看似稳定并运行了几个星期的东西,直到我尝试修改阵列,这时它失败了。每次镜像失败时,它显然都会使系统崩溃,并且 SSD 上的根文件系统会根据 /etc/fstab 中的设置以只读方式重新安装(errors=remount-ro)。当然,系统现在毫无用处,需要硬重置。系统重新启动,但镜像现在完全损坏,通常必须销毁并重建。我已经运行了硬件诊断程序,没有发现任何问题。任何日志文件(dmesg、kern.log、syslog)中都没有关于哪里出了问题的提示。以下是一些详细信息:


我创建数组如下:

# mdadm --create /dev/md2 --verbose --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdc1 appears to contain an ext2fs file system
    size=-387950592K mtime=Wed Dec 31 16:00:00 1969
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device. If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: /dev/sdd1 appears to contain an ext2fs file system
    size=-387950592K mtime=Wed Dec 31 16:00:00 1969
mdadm: size set to 3906885440K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

我检查 RAID 构建进度:

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdd1[1] sdc1[0]
    3906885440 blocks super 1.2 [2/2] [UU]
    [>....................] resync = 0.4% (17314560/3906885440) finish=415.6min speed=155968K/sec

unused devices: <none>

我继续使用上述命令定期监控重新同步操作,它运行正常。然而,在某个时候(我曾让重新同步达到 4% 到 60% 的同步程度),系统出现混乱,根目录重新挂载为 RO。当系统重新启动时,我通常会发现以下情况:

# l /dev/md*
/dev/md127 /dev/md127p1

/dev/md:
dymaxion:2@ dymaxion:2p1@

在我确实成功构建并运行 /dev/md2 的情况下,/dev/md2 和 /dev/md2p1 设备在 /dev/md 子目录中没有任何内容。此时,崩溃的系统似乎试图将阵列恢复为 md127。我不明白为什么,但这种情况反复发生。这可能是 mdadm 软件中编码的某些算法的结果。

有时 md127 阵列性能下降到无法在启动时挂载的程度(/etc/fstab 中有该阵列的条目),有时它会挂载并尝试重新同步。但是,在此操作期间,它经常会导致系统崩溃,从而导致连续不断的重新启动。

然后我销毁该阵列并尝试重新创建它。这些是我用来销毁它的命令。

# mdadm --stop /dev/md127
mdadm: stopped /dev/md127

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

未使用的设备:

# mdadm -QD /dev/md127
mdadm: cannot open /dev/md127: No such file or directory

# mdadm --zero-superblock /dev/sdc1
# mdadm --zero-superblock /dev/sdd1

我尝试在安静的系统上构建阵列,除了几个终端窗口外没有运行任何桌面进程。我运行了 checkbox-gui 硬件测试套件,一切正常。我尝试拔掉所有其他 SATA 磁盘、USB 端口、读卡器、光盘等,然后运行构建,但仍然失败。

有人能找出阵列失败的原因吗,或者建议一些方法来更好地确定发生了什么?

以下是有关我的努力的一些附加信息。

过去 10 年,我一直在 Sun 服务器 (Solaris 10) 上执行的操作是将第三个磁盘连接到阵列,使其同步,然后将其从阵列中分离,然后将其移出现场进行灾难恢复。这一直很有效,这就是我计划在这个 Ubuntu 系统上执行的操作。

使用上述步骤,我确实曾设法使用两个内部磁盘正确构建了 /dev/md2。系统运行了几个星期,没有出现问题,因此我准备使用热插拔托架连接第三个磁盘。我使用热插拔托架中的第三个磁盘重新启动。由于任意设备重新分配,新磁盘显示为 /dev/sda,镜像使用 /dev/sdd 和 /dev/sde。

# mdadm -QD /dev/md2p1 (or: # mdadm -QD /dev/md2)
/dev/md2:
        Version : 1.2
  Creation Time : Tue Sep 9 17:50:52 2014
     Raid Level : raid1
     Array Size : 3906885440 (3725.90 GiB 4000.65 GB)
  Used Dev Size : 3906885440 (3725.90 GiB 4000.65 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Sep 19 14:02:45 2014
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : dymaxion:2 (local to host dymaxion)
           UUID : 1e131e20:9c899b31:a7494bc5:1dbc253f
         Events : 129

      Number Major Minor RaidDevice State
         3 8 65 0 active sync /dev/sde1
         2 8 49 1 active sync /dev/sdd1


# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdd1[2] sde1[3]
      3906885440 blocks super 1.2 [2/2] [UU]

unused devices: <none>

一切看起来都很好。让我们将 /dev/sda1 作为备用添加到 /dev/md2p1:

# mdadm /dev/md2 --add /dev/sda1

# mdadm -QD /dev/md2
/dev/md2:
        Version : 1.2
  Creation Time : Tue Sep 9 17:50:52 2014
     Raid Level : raid1
     Array Size : 3906885440 (3725.90 GiB 4000.65 GB)
  Used Dev Size : 3906885440 (3725.90 GiB 4000.65 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Fri Oct 17 13:36:13 2014
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

           Name : dymaxion:2 (local to host dymaxion)
           UUID : 1e131e20:9c899b31:a7494bc5:1dbc253f
         Events : 130

      Number Major Minor RaidDevice State
         3 8 65 0 active sync /dev/sde1
         2 8 49 1 active sync /dev/sdd1

         4 8 1 - spare /dev/sda1

好的,让我们使用增长选项将备用磁盘附加到阵列:

# mdadm /dev/md2 --grow -n3

# mdadm -QD /dev/md2
/dev/md2:
        Version : 1.2
  Creation Time : Tue Sep 9 17:50:52 2014
     Raid Level : raid1
     Array Size : 3906885440 (3725.90 GiB 4000.65 GB)
  Used Dev Size : 3906885440 (3725.90 GiB 4000.65 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Fri Oct 17 14:43:08 2014
          State : clean, degraded, recovering
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

 Rebuild Status : 0% complete

           Name : dymaxion:2 (local to host dymaxion)
           UUID : 1e131e20:9c899b31:a7494bc5:1dbc253f
         Events : 134

      Number Major Minor RaidDevice State
         3 8 65 0 active sync /dev/sde1
         2 8 49 1 active sync /dev/sdd1
         4 8 1 2 spare rebuilding /dev/sda1

看起来不错!允许第三个磁盘同步:

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda1[4] sdd1[2] sde1[3]
      3906885440 blocks super 1.2 [3/2] [UU_]
      [>....................] recovery = 0.7% (27891328/3906885440) finish=376.2min speed=171823K/sec

unused devices: <none>

在镜像同步超过 10% 后,系统出现故障。这次,当系统重新启动时,启动过程无法将镜像重新连接到 /x,并提示重试或跳过挂载。我跳过了它,当系统启动时,无法重新激活 /dev/md2。最终我不得不销毁它并重新开始。我再也没有这么接近了。如果这个方法有效,计划是将第三个磁盘标记为故障,将其移除并将阵列恢复为两个设备(或两个设备和一个丢失的备用设备)。

您觉得这个构建过程有啥问题吗?

很抱歉发了这么长的帖子。我想提供尽可能多的信息,以防万一出现任何问题。

非常感谢任何建议。我特别关心是什么导致系统崩溃。


以下所有内容均于 2014 年 11 月 15 日星期六添加


首先,让我澄清一个明显的误解。@psusi 写道:

由于您没有提到在 raid 阵列上创建文件系统并在创建阵列后挂载它,并且 mdadm 警告您 /dev/sdc1 中已经有一个 ext2 文件系统,所以我猜您的意思是您在 /dev/sdc1 中已经有一个文件系统,而这就是以只读方式重新挂载的。

否。当我尝试使用另外两个 4TB 磁盘(sdc 和 sdd)构建 md2 镜像时,根文件系统位于其自己的固态 SATA-III 驱动器(sda1)上。正是在此镜像同步时出现问题,整个系统崩溃,并且是根文件系统(而不是镜像)以只读方式重新挂载,导致整个操作系统无法运行并需要硬重置。重新启动后,镜像显然会尝试重建,但现在通常命名为 /dev/md127。

是的,我尝试使用两个之前使用 GPT 分区表进行分区,然后使用一个大型 ext4 文件系统进行格式化的磁盘来创建镜像。从我读到的所有内容来看,这应该是可以接受的。

[注意:当 mdadm 说“/dev/sdd1 似乎包含 ext2fs 文件系统”时,它错误地识别了 ext4fs —— 可能是由于从未正确更新的硬编码错误消息。至于分区类型,GParted 不允许直接将它们格式化为 fd 类型,但我相信 mdadm 在将它们组装到阵列中时会将它们标记为此类。]

根据以下评论,我尝试了以下方法:

1:我对所有四个 4TB 驱动器(2 个用于镜像,2 个作为未来备用)运行了扩展 SMART 表面测试。每次测试都花费了 8.5 个小时以上,所有磁盘均未报告错误。单独测试这些磁盘从未导致系统崩溃。

2:使用 GParted,我从 sdc 和 sdd 磁盘中删除了 ext4 分区。

3:为了确保原始 GPT 分区表已被消除,我运行了:

# sgdisk -Z /dev/sdc
# sgdisk -Z /dev/sdd

4:我使用两个未格式化的磁盘重新创建了阵列。

# mdadm --create /dev/md2 --verbose --level=1 --metadata 1.2 --raid-devices=2 /dev/sdc /dev/sdd
mdadm: size set to 3906887360K
mdadm: array /dev/md2 started

5:我开始使用“cat /proc/mdstat”监控同步并看到它进展顺利。

几分钟后,系统像往常一样崩溃,根文件系统 (sda1) 重新挂载为 RO,需要硬重置。重新启动后,阵列重命名为 /dev/md127,在这种情况下,它处于“resync=PENDING”状态,不会自动尝试同步。目的是在完成同步后在镜像上创建 GPT 分区表和 ext4 分区。(我知道我可能在同步期间就完成了这个操作,但我试图隔离此过程中的步骤以查看问题所在。)

以下是我在 syslog 和 kern.log 文件中发现的一些重复的新信息。这些消息是在 remount-ro 操作之前记录的。

Nov 15 14:31:15 dymaxion kernel: [58171.002154] ata8.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
Nov 15 14:31:15 dymaxion kernel: [58171.002163] ata8.00: failed command: IDENTIFY DEVICE
Nov 15 14:31:15 dymaxion kernel: [58171.002167] ata8.00: cmd ec/00:01:00:00:00/00:00:00:00:00/00 tag 16 pio 512 in
Nov 15 14:31:15 dymaxion kernel: [58171.002167]          res 40/00:ff:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
Nov 15 14:31:15 dymaxion kernel: [58171.002169] ata8.00: status: { DRDY }
Nov 15 14:31:15 dymaxion kernel: [58171.002175] ata8: hard resetting link
Nov 15 14:31:15 dymaxion kernel: [58171.329795] ata8: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
Nov 15 14:31:15 dymaxion kernel: [58171.330336] ata8.00: supports DRM functions and may not be fully accessible
Nov 15 14:31:15 dymaxion kernel: [58171.334346] ata8.00: disabling queued TRIM support
Nov 15 14:31:15 dymaxion kernel: [58171.339116] ata8.00: supports DRM functions and may not be fully accessible
Nov 15 14:31:15 dymaxion kernel: [58171.343149] ata8.00: disabling queued TRIM support
Nov 15 14:31:15 dymaxion kernel: [58171.347557] ata8.00: configured for UDMA/133
Nov 15 14:31:15 dymaxion kernel: [58171.347625] ata8: EH complete

这似乎表明存在某种 SATA 错误,但目前我无法解释它。

那么,这是否提供了任何可能出错的额外线索?我非常感谢迄今为止的帮助。它让我从几个新的方向思考。我希望有人能提供进一步的见解或建议。谢谢。


以下所有内容均于 2014 年 12 月 20 日星期六添加


作为这个传奇故事的最后一个记录,我提供以下信息,希望它能够在将来对其他人有所帮助。

我确实设法就此问题联系了美国华硕支持。我收到了替换的 Z9PE-D8 WS 主板,并对其进行了安装和配置。当我运行 RAID 测试时,我最终观察到的结果与原始主板完全相同。将根文件系统驱动器连接到 Marvel 控制器后:

  • 如果额外的 RAID 1 磁盘位于 Marvel 控制器上,则任何尝试在阵列上执行重要 mdadm(8) 操作都会生成内核异常和上述错误,并且整个操作系统都会崩溃。

  • 如果将 RAID 磁盘从 Marvel 控制器上移开,那么 mdadm(8) 操作就可以顺利执行,系统也可以顺利运行。

由于我打算镜像根分区,因此我急切地想知道如果从 Marvel 控制器中删除根文件系统并将 RAID 移回该控制器,会发生什么情况。不幸的是,如果将根文件系统移至板载 Intel C602 芯片组,我找不到任何方法可以启动操作系统。两块主板都是这种情况。

[注意:如果有人知道为什么不能这样做,我将非常高兴听到原因。例如,GRUB2 是否在安装时存储了某些特定于控制器的特定信息?]

因此,我下定决心,完全重新安装最新的 Ubuntu Server 版本 14.10,并在安装过程中镜像根文件系统。我将 SSD 移至英特尔控制器控制的一对 SATA-III 端口,并执行全新安装。一切正常。

现在,在具有镜像根的运行系统中,我将两个 4TB 驱动器连接到 Marvel 控制器并尝试构建新的 RAID 1 阵列。该阵列很快就失败了。因此,我们可以得出结论,Marvel 控制器正在执行与软件 RAID 管理不兼容的操作。

我将 4TB 硬盘移至 Intel C602 控制的 SATA-II 端口,一切正常,并继续顺利运行。华硕工程师正在调查问题,而我的机器原来的六个 SATA-III 端口中有四个无法使用。

教训是,任何考虑使用 Marvel PCIe 9230 控制器的 Linux 机器的人都应该关注 RAID 兼容性。

希望这些信息对您有用。如果其他人也发现 Marvel 控制器存在类似问题,并能进一步阐明这个问题,请联系我。谢谢。~

答案1

我看到的最大问题是

mdadm: /dev/sdd1 appears to contain an ext2fs file system

此外,这些分区应标记为RAID 成员(类型 fd),而不是 Linux 文件系统。

这意味着 extfs 工具(如 fsck)可以锁定超级块,并严重破坏您的世界。我强烈建议您在使用 dd 将驱动器添加到阵列之前彻底擦除驱动器,如下所示。

dd if=/dev/zero of=/dev/bye-bye-entire-sd-device

确保您使用文件系统而不是成员来格式化 MD 设备。

如果所有方法都成功并且您仍然看到随机损坏,那么您可能有一些边缘内存会不时地写回垃圾并破坏您的磁盘。

进一步参考:https://raid.wiki.kernel.org/index.php/RAID_setup

答案2

由于您没有提到在 RAID 阵列上创建文件系统并在创建阵列后挂载它,并mdadm警告您 /dev/sdc1 中已经有一个 ext2 文件系统,我猜您的意思是您在 /dev/sdc1 中已经有一个文件系统,而这就是正在以只读方式重新挂载的文件系统。这是因为从磁盘或分区创建 RAID 阵列通常是一种破坏性操作,因此为什么要mdadm警告您。通过将 RAID 元数据写入分区,您已经损坏了那里的现有文件系统。

此时,如果您想恢复 /dev/sdc1 中的现有数据,则需要尝试撤消已造成的损坏。首先卸载旧文件系统,然后删除您创建的 raid 超级块,然后 fsck 旧文件系统并希望它可以修复:

umount /dev/sdc1
mdadm --zero-superblocks /dev/sdc1 /dev/sdd1
e2fsck -fy /dev/sdc1

要将现有文件系统升级为 raid1,首先需要使用以下命令创建 raid 阵列仅有的新磁盘,然后手动将所有文件从旧 FS 复制到新磁盘:

mdadm --create --level 1 -n 2 /dev/sdd1 missing
mkfs.ext4 /dev/md0
mkdir /mnt/new
mkdir /mnt/old
mount /dev/md0 /mnt/new
mount /dev/sdc1 /mnt/old
cp -ax /mnt/old/* /mnt/new/
umount /mnt/old
umount /mnt/new
rmdir /mnt/old
rmdir /mnt/new

现在编辑 /etc/fstab 以将新卷挂载在 /dev/md0 中,而不是将旧卷挂载在 /dev/sdc1 中,最后您可以将 /dev/sdc1 交给 md,以将 /dev/sdd1 中的所有内容镜像到:

mdadm /dev/md0 --add /dev/sdc1

您可以使用blkid它在 raid 阵列中查找新文件系统的 UUID,并使用它来替换 /etc/fstab 中的旧 UUID。此外,所有这些命令都必须以 root 身份运行,因此您需要sudo -s先成为 root。

最后,仅供参考,您可能希望使用 raid10 而不是 raid1。使用偏移布局(-p o2to mdadm)和较大的块大小( -c 1024 to 4096 ),您可以获得 raid1 的冗余度以及 raid0 的连续读取吞吐量。

答案3

在所有错误的地方寻找爱情......

感谢 psusi 和 ppetraki 的帮助性回复。你们每个人都让我对 Linux 下 RAID 的运作方式有了更多的了解。

事实证明磁盘或管理我用来创建和操作 RAID 阵列的命令。一旦我发现ATA8内核消息,我使用它们作为密钥在互联网上搜索,发现其他人报告了与 Marvel SATA 控制器相关的类似消息。我有一块华硕 Z9PE-D8 WS 主板,主板上有一个 Marvel PCIe 9230 控制器,可驱动四个用于这些磁盘的 SATA-III 端口。我从这些端口拔下驱动器,将它们连接到主板上由 Intel C602 芯片组驱动的其他 SATA 端口,然后重新启动。此时,我可以构建多个阵列、重新配置它们等,没有任何问题!

带有根文件系统的单个 SSD 仍连接到 Marvel 控制器,并且运行正常。不过,我现在不打算尝试镜像此驱动器,直到它也从 Marvel 控制器中移除。

我正在尝试从华硕那里获取有关此问题的一些信息。我不知道这是否表明存在硬件或 BIOS 问题。到目前为止,华硕技术支持对我的请求的响应很慢。我对他们的服务印象不深。

如果有人有与 Marvel 控制器问题相关的更多信息,我将非常高兴听到。

所以,我暂时又恢复了工作,但系统还差四个 SATA-III 端口才能正常工作。再次感谢您的帮助。

相关内容