Centos 7.6 RAID5 物理系统在单个驱动器发生故障后无法启动

Centos 7.6 RAID5 物理系统在单个驱动器发生故障后无法启动

你好,

我最近使用本地 Centos 7.6 DVD 中的 Anaconda 安装程序构建了一台 Centos 7.6 服务器,该服务器有 4 个相同的 500GB 驱动器。BIOS 设置给我的是 EFI 而不是 bios 启动。

使用磁盘子菜单中的“手动分区”,我生成了一个小型四向 RAID1 镜像,其中包含“/boot”和“/boot/efi”挂载点。据我所知,此镜像通过“md”使用软件 RAID,而不使用“lvm”。我在最大尺寸的 RAID5 阵列中创建了“/”、“/var”、“/home”和“swap”作为 LVM 挂载点。完成安装后,我看到以下驱动器布局:


$ lsblk
NAME                       MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                          8:0    0 465.8G  0 disk  
├─sda1                       8:1    0     1G  0 part  
│ └─md127                    9:127  0  1023M  0 raid1 /boot
├─sda2                       8:2    0     1G  0 part  
│ └─md125                    9:125  0     1G  0 raid1 /boot/efi
└─sda3                       8:3    0 463.8G  0 part  
  └─md126                    9:126  0   1.4T  0 raid5 
    ├─centos_reports2-root 253:0    0   100G  0 lvm   /
    ├─centos_reports2-swap 253:1    0  19.9G  0 lvm   [SWAP]
    ├─centos_reports2-var  253:2    0 299.9G  0 lvm   /var
    └─centos_reports2-home 253:3    0  49.9G  0 lvm   /home
sdb                          8:16   0 465.8G  0 disk  
├─sdb1                       8:17   0     1G  0 part  
│ └─md127                    9:127  0  1023M  0 raid1 /boot
├─sdb2                       8:18   0     1G  0 part  
│ └─md125                    9:125  0     1G  0 raid1 /boot/efi
└─sdb3                       8:19   0 463.8G  0 part  
  └─md126                    9:126  0   1.4T  0 raid5 
    ├─centos_reports2-root 253:0    0   100G  0 lvm   /
    ├─centos_reports2-swap 253:1    0  19.9G  0 lvm   [SWAP]
    ├─centos_reports2-var  253:2    0 299.9G  0 lvm   /var
    └─centos_reports2-home 253:3    0  49.9G  0 lvm   /home
sdc                          8:32   0 465.8G  0 disk  
├─sdc1                       8:33   0     1G  0 part  
│ └─md127                    9:127  0  1023M  0 raid1 /boot
├─sdc2                       8:34   0     1G  0 part  
│ └─md125                    9:125  0     1G  0 raid1 /boot/efi
└─sdc3                       8:35   0 463.8G  0 part  
  └─md126                    9:126  0   1.4T  0 raid5 
    ├─centos_reports2-root 253:0    0   100G  0 lvm   /
    ├─centos_reports2-swap 253:1    0  19.9G  0 lvm   [SWAP]
    ├─centos_reports2-var  253:2    0 299.9G  0 lvm   /var
    └─centos_reports2-home 253:3    0  49.9G  0 lvm   /home
sdd                          8:48   0 465.8G  0 disk  
├─sdd1                       8:49   0     1G  0 part  
│ └─md127                    9:127  0  1023M  0 raid1 /boot
├─sdd2                       8:50   0     1G  0 part  
│ └─md125                    9:125  0     1G  0 raid1 /boot/efi
└─sdd3                       8:51   0 463.8G  0 part  
  └─md126                    9:126  0   1.4T  0 raid5 
    ├─centos_reports2-root 253:0    0   100G  0 lvm   /
    ├─centos_reports2-swap 253:1    0  19.9G  0 lvm   [SWAP]
    ├─centos_reports2-var  253:2    0 299.9G  0 lvm   /var
    └─centos_reports2-home 253:3    0  49.9G  0 lvm   /home
$ cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4] 
md125 : active raid1 sdb2[0] sdd2[2] sdc2[1] sda2[3]
      1049536 blocks super 1.0 [4/4] [UUUU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md126 : active raid5 sdb3[1] sdc3[2] sdd3[4] sda3[0]
      1458462720 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 2/4 pages [8KB], 65536KB chunk

md127 : active raid1 sdd1[2] sdb1[0] sdc1[1] sda1[3]
      1047552 blocks super 1.2 [4/4] [UUUU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices:
$

所有四个驱动器的分区相同,如下所示:


# fdisk /dev/sdd

Command (m for help): p

Disk /dev/sdd: 500.1 GB, 500107862016 bytes, 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x000f06c8

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1   *        2048     2101247     1049600   fd  Linux raid autodetect
/dev/sdd2         2101248     4200447     1049600   fd  Linux raid autodetect
/dev/sdd3         4200448   976773119   486286336   fd  Linux raid autodetect

Command (m for help): q

我希望能够承受单个驱动器故障,并且只要我了解 RAID1 和 RAID5,我就能做到。但是,当我关闭服务器并通过拔出驱动器来模拟驱动器故障时,服务器却无法启动。

我确实看到了 grub 菜单,也看到了启动 Centos 7 的尝试。我看到各种不同颜色的线条爬过控制台的底部。但随后该过程进入紧急启动提示,错误提示 /dev/centos_reports2-root 和 /dev/centos_reports2-swap 不存在,并建议我将“/run/initramfs/rdsosreport.txt”保存到 USB 记忆棒并提交错误报告。退出 shell 会导致相同的失败。如果我停止系统、关闭电源、重新插入驱动器并重新启动电源,则它会正常启动。

我希望有办法让它正常工作。 Centos 7 应该能够构建 RAID5 并在降级状态下运行,而更换故障驱动器则由我来负责。

现在,如果我拉出 sda 驱动器,也许我甚至不会走到这一步。我没有手动将引导加载程序写入每个驱动器;也许如果我拉出 sda,我甚至不会尝试启动 Centos。在我看来,Anaconda 安装程序应该将引导加载程序放在每个驱动器上,这些驱动器是包含“/”和/或“/boot/efi”的元设备的一部分,但我不知道它是否这样做了。(我很确定早期版本没有这样做。)无论如何,这是一个单独的问题。

在使用 RAID5 的地方,我是否应该使用 RAID-somethingelse?我遇到过一些来源推荐使用 RAID10 而不是 RAID5。如果我这样做,我的系统会启动吗?还是我做错了其他事情?

当我在紧急 shell 中运行“journalctl”时,失败的行非常接近末尾。据我所知,到目前为止一切都很正常:


. . . . . . . .
sd :1:0:0:0 [sda] Attached SCSI disk
random: fast init done
mgag200 0000 04:03:0: fb0: mgadrmfb frame buffer device
[drm] initialized mgag200 1:0:0 20110418 for 0000:04:03:0: on minor 0
Job dev-mapper-centos_myhost\x2droot.device/start timed out
[TIME] timed out waiting for device dev-mapper-centos_myhost\x2droot.device
Dependency failed ...
Dependency failed ...
. . . . . . . .

在我进行了一些更改并尝试重新安装后,这种情况仍然会发生。我将 BIOS 固件启动选项从“UEFI 和 Legacy”更改为“仅 UEFI”,并重新安装了 Centos,只在镜像中配置了两个驱动器。/boot 和 /boot/efi 分区与以前相同(保存在 2 路而不是 4 路镜像中),其他分区再次是最大尺寸 RAID 阵列上的 lvm,这次是两个驱动器的 RAID1,而不是四个驱动器的 RAID5。这些更改的效果很明显。Anaconda 在两个驱动器上写入了 GPT 而不是 DOS 标签,并且安装默认包含“efibootmgr”包。“efibootmgr -v”现在可以正常工作,而不是失败并显示有关不支持 EFI 变量的消息。

但是当我拿走其中一个驱动器时系统仍然无法启动,并且“md”驱动程序应该能够在降级状态下运行镜像配置。我是否需要为 md 软件提供配置选项?我将尝试将其作为错误报告提交,但再次欢迎任何建议。

答案1

这并不能真正解决我的问题,而更像是意识到我对“md+lvm”软件 RAID 的期望可能过于现实。我可能要求过高,希望“md+lvm”能够在硬盘突然神秘消失的情况下启动。当 RAID 配置中的驱动器(或驱动器的分区)在使用过程中出现故障时,它会随着时间的推移在日志文件等中生成各种错误,并且“md”RAID 软件在尝试使用该驱动器和/或分区时会遇到故障。

最终,“md”软件将使该组件“失效”,或将其标记为故障。您可以通过“cat /proc/mdstat”查看此信息,在本例中显示 md125 RAID1 镜像的 /dev/sdb1 组件出现故障:


[root@host ~]# cat /proc/mdstat
Personalities : [raid1] 
md125 : active raid1 sda1[0] sdb1[1](F)
      1049536 blocks super 1.0 [2/1] [U_]
      bitmap: 0/1 pages [0KB], 65536KB chunk
.  .  .  .  .
[root@host ~]#

使用“mdadm”管理实用程序,您可以通过以下方式模拟此类故障:

mdadm --manage /dev/md125 --fail /dev/sdb1

(这就是我生成上述输出的方式。)命令:

mdadm --manage /dev/md125 --remove /dev/sdb1
然后从元设备配置中删除故障组件,元设备在剩余组件上运行。当分区或驱动器确实发生故障时,在拉出驱动器之前,必须将该驱动器的每个分区从它们所属的元设备中“故障”并“删除”。在我通过执行所有这些操作模拟驱动器故障和响应后,我能够成功关闭、拉出驱动器、重新启动设备,然后它成功恢复到 Centos。所有元设备(RAID1 镜像)都在单个子镜像上运行:


[root@reports2 ~]# cat /proc/mdstat
Personalities : [raid1] 
md125 : active raid1 sda1[0]
      1049536 blocks super 1.0 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md126 : active raid1 sda2[0]
      1047552 blocks super 1.2 [2/1] [U_]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md127 : active raid1 sda3[0]
      974529536 blocks super 1.2 [2/1] [U_]
      bitmap: 3/8 pages [12KB], 65536KB chunk

unused devices: 
[root@reports2 ~]#

我的驱动器实际上并没有坏,因此我只是关闭它,重新放回驱动器,重新启动,然后通过以下命令将 /dev/sdb 组件重新添加到其各自的元设备中:


mdadm --manage /dev/md125 --add /dev/sdb1

对所有镜像执行此操作后,它们将重新同步。镜像越大,所需的时间越长:


[root@reports2 ~]# !cat
cat /proc/mdstat
Personalities : [raid1] 
md125 : active raid1 sdb1[1] sda1[0]
      1049536 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md126 : active raid1 sdb2[2] sda2[0]
      1047552 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md127 : active raid1 sdb3[2] sda3[0]
      974529536 blocks super 1.2 [2/1] [U_]
      [>....................]  recovery =  0.0% (883968/974529536) finish=91.7min speed=176793K/sec
      bitmap: 3/8 pages [12KB], 65536KB chunk

unused devices: 
[root@reports2 ~]#

如果真的出现硬盘故障,当然需要先对替换硬盘进行与剩余硬盘相同的分区。虽然我并不需要这样做,但我还是按照以下说明操作:

https://www.howtoforge.com/tutorial/linux-raid-replace-failed-harddisk/

并使用“gdisk”实用程序通过以下方式方便地将 /dev/sda GPT 分区表复制到 /dev/sdb 上:


sgdisk -R /dev/sdb /dev/sda
sgdisk -G /dev/sdb

上述链接推荐使用“gdisk”作为 GPT 磁盘标签/分区表的可靠工具。第一个命令执行实际复制(从“/dev/sda”到“/dev/sdb”,可能有点违反直觉),第二个命令为 /dev/sdb 及其分区生成唯一的 UUID。

相关内容