当我移除硬盘时,Debian 软件 RAID1 无法工作

当我移除硬盘时,Debian 软件 RAID1 无法工作

我整个周末都在尝试让 RAID 在一台装有 Intel ICH7 / ICH7-R SATA-II 控制器的旧服务器计算机上运行,​​该控制器运行带有 RAID 1 的双硬盘。

放弃硬件突袭后,我转向了软件。

目前,系统可以从两个驱动器正常启动,也可以从 sdb 正常启动,但是当我尝试启动 sda 时,黑屏上出现了闪烁的光标。

我指的是物理移除驱动器。我移除一个驱动器,启动后它就可以正常工作。更换该驱动器,移除另一个驱动器,启动后它就无法正常工作了。

我猜测是我没有在 sda 上正确安装 GRUB。

我移除了 sdb 硬盘,并将安装盘启动到恢复模式。然后我挂载 RAID 卷,并进入 shell。

首先,我会尝试本教程我遵循的软件 RAID 要求我这样做:

# grub
grub> device (hd0) /dev/sda

grub> root (hd0,0)
 Filesytem type is ext2fs, partition type 0xfd

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists ... no
 Checking if "/grub/stage1" exists ... no

Error 2: Bad file or directory type

所以我尝试了一些不同的东西:

打字时:

grub-install /dev/sda

我明白了

Searching for the GRUB installation directory ... found: /boot/grub
The file /boot/grub/stage1 not read correctly.

我正在使用 ext4 分区。

我下一步该尝试什么?

编辑:

输出如下fdisk -l

root@debian:~# fdisk -l

    Disk /dev/sda: 153.4 GiB, 164696555520 bytes, 321672960 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x8225e6c2

    Device     Boot   Start       End   Sectors   Size Id Type
    /dev/sda1  *       2048    194559    192512    94M fd Linux raid autodetect
    /dev/sda2        194560   4194303   3999744   1.9G fd Linux raid autodetect
    /dev/sda3       4194304 321671167 317476864 151.4G fd Linux raid autodetect

    Disk /dev/sdb: 153.4 GiB, 164696555520 bytes, 321672960 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x3cfa42ad

    Device     Boot   Start       End   Sectors   Size Id Type
    /dev/sdb1  *       2048    194559    192512    94M fd Linux raid autodetect
    /dev/sdb2        194560   4194303   3999744   1.9G fd Linux raid autodetect
    /dev/sdb3       4194304 321671167 317476864 151.4G fd Linux raid autodetect

    Disk /dev/md2: 151.3 GiB, 162413936640 bytes, 317214720 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk /dev/md0: 93.9 MiB, 98435072 bytes, 192256 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk /dev/md1: 1.9 GiB, 2046820352 bytes, 3997696 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

以下是输出 mdadm --detail --scan

ARRAY /dev/md/2 metadata=1.2 name=repeater:2 UUID=cd8443a8:ca0b3a29:05496e49:b063704f
ARRAY /dev/md/0 metadata=1.2 name=repeater:0 UUID=c8a204e2:3e5a5e2c:50a136c7:d43777a7
ARRAY /dev/md/1 metadata=1.2 name=repeater:1 UUID=25bebb1e:c7f3245d:128bee5d:d58d9100

输出如下lsblk

NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
fd0       2:0    1     4K  0 disk  
sda       8:0    0 153.4G  0 disk  
├─sda1    8:1    0    94M  0 part  
├─sda2    8:2    0   1.9G  0 part  
└─sda3    8:3    0 151.4G  0 part  
  └─md2   9:2    0 151.3G  0 raid1 /
sdb       8:16   0 153.4G  0 disk  
├─sdb1    8:17   0    94M  0 part  
│ └─md0   9:0    0  93.9M  0 raid1 /boot
├─sdb2    8:18   0   1.9G  0 part  
│ └─md1   9:1    0   1.9G  0 raid1 [SWAP]
└─sdb3    8:19   0 151.4G  0 part  
sr0      11:0    1  1024M  0 rom 

编辑2:这是输出 cat /proc/mdstat

root@debian:~# cat /proc/mdstat
Personalities : [raid1] 
md1 : active (auto-read-only) raid1 sdb2[1]
      1998848 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sdb1[1]
      96128 blocks super 1.2 [2/1] [_U]

md2 : active raid1 sda3[0]
      158607360 blocks super 1.2 [2/1] [U_]
      bitmap: 2/2 pages [8KB], 65536KB chunk

unused devices: <none>

答案1

从您的 lsblk 输出和 /proc/mdstat 中,我看到所有 RAID 都已降级。看到[_U]或 了吗[U_]?在每个 RAID 中,只有一行被填充(标记为U),另一行没有被填充(标记为_)。

所以,看来我的猜测是正确的:您只有一个驱动器上有正常的 /boot 文件系统,现在称为 sdb。您的 sda 有一个用于相同目的的分区,但该分区似乎不包含有效且正确填充的启动文件系统。

如果您确定两个驱动器都正常,则可以将它们重新添加到 RAID。您需要从未使用的分区中擦除 md RAID 超级块。如果您尝试从活动驱动器中擦除标签,mdadm 工具会发出警告,但仍然值得仔细检查您的命令。从您的 /proc/mdstat 和 fdisk 输出中,我们推断出:

  • md0(启动)应该在 sda1 和 sdb1 上,但只有 sdb1 在工作。
  • md1(交换)应该位于 sda2 和 sdb2 上,但只有 sdb2 在工作。
  • md2(根)应该在 sda3 和 sdb3 上,但只有 sda3 在工作 - 这很奇怪,这是在另一个磁盘上。

要从 sda1、sda2、sdb3(当前均未使用)擦除标签,您可以使用:

mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sda2
mdadm --zero-superblock /dev/sdb3

它可能会抱怨一些事情,您可能需要在命令中添加 --force,但我认为这没有必要。我再说一遍,仔细检查所有内容,只在未使用的设备上擦除突袭标记!

然后,将这些未使用的设备添加到其阵列中:

mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda2
mdadm --add /dev/md2 /dev/sdb3

它将在后台启动重新同步。另请注意,它将检测所有阵列是否使用相同的设备,因此它将延迟 md2 重新同步,直到 md1 完成。您将在 /proc/mdstat 中看到重新同步进度。

当重新同步完成时,/proc/mdstat 中的所有设备都会在[UU]其后,表明这些阵列处于最佳状态。

您的 /boot 可以正常工作,因此 sdb1 包含正确填充的文件系统。当您的 /boot md0 处于最佳状态时,我们可以说,sda1 现在具有相同的数据(只有超级块略有不同,因为同一阵列中的不同后备设备具有不同的行号)。您可以手动重新安装 grub:

device (hd0) /dev/sda
root (hd0,0)
setup (hd0)

我强烈建议您设置 mdadm 定期(例如,每周一次或每月一次)进行阵列检查,以便尽早发现驱动器读取错误。我曾经解决过一个问题,当时两个 raid 驱动器上都有坏块(在不同的位置),定期检查可以通过尽早弹出故障驱动器来避免此问题,即使坏块位于文件系统中很少使用的部分。这很棘手。要启动检查,请执行

echo "check" >> /sys/block/md127/md/sync_action

并在 dmesg 和 mdmon 日志中查找错误。

不要只需将启动文件系统 dd 到其他设备即可。两个具有相同标签和相同 UUID 的文件系统不是正常状态。在恢复或其他取证过程中,这种情况是允许的,但对于正常运行的 /boot 则不行。Ubuntu 通过 UUID 挂载分区(检查 /etc/fstab),您怎么猜,下次会挂载哪一个?没办法说,这是随机的,但这个东西不应该是随机的。

内核中的 md 代码在某种程度上阻止了对 raid 支持设备的访问,因此当它们在 raid 中时,系统只能看到 md0,这是一个单独的设备,您不会遇到问题。

为了在两个磁盘上保留非 RAID /boot,基本上每次更新启动时都需要克隆文件系统,然后始终更改 UUID 和标签。这很容易出错,而且不方便。将 /boot 作为 RAID1 是正常的。

我更喜欢将元数据 1.0 用于 /boot,因为在这种情况下元数据位于设备末尾,因此即使我没有 raid 支持,我也可以简单地从分区安装文件系统,就像根本没有 raid 一样。但如果它现在对你有用,最好保持现状。

答案2

您需要在两个都磁盘。您必须手动执行此操作,因为引导加载程序位于任何分区之外,因此也位于任何 MDRAID 阵列之外。

请发出以下命令:grub-install /dev/sda并重新尝试启动sda

答案3

这里有解决方案!: https://std.rocks/gnulinux_mdadm_uefi.html 有关如何在 Linux 上制作工作软件 RAID1 的所有重要信息!

相关内容