我整个周末都在尝试让 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 的所有重要信息!