系统是CentOS 7。它安装在两块MD RAID的硬盘上,一个驱动器死了。我们决定改用两个尺寸稍大的 SSD。当它们连接并启动系统时,sda
看起来像是一个有两个分区的旧硬盘,sda1
参与md126
其中的 500M 是/boot
,sda2
参与md127
其中的是 LVM PV,其中包含其他所有内容。sdb
并且sdc
是新的 SSD。
我开始将阵列从硬盘移动到 SSD。我像旧设备一样对新设备进行分区,并将它们添加到数组中,然后将数组扩展为包含 3 个设备:
mdadm --add /dev/md126 /dev/sd[bc]1
mdadm --add /dev/md127 /dev/sd[bc]2
mdadm --grow -n 3 /dev/md126
mdadm --grow -n 3 /dev/md127
一段时间后,我确认所有 RAID 已完全同步,然后我从阵列中移除硬盘并将它们重新设置为每个包含 2 个设备:
mdadm -f /dev/md126 /dev/sda1
mdadm -r /dev/md126 /dev/sda1
mdadm -f /dev/md127 /dev/sda2
mdadm -r /dev/md127 /dev/sda2
mdadm --grow -n 2 /dev/md126
mdadm --grow -n 2 /dev/md127
两个阵列都是干净的。我将引导加载程序安装到新安装的设备中:
[root@master ~]# grub2-install /dev/sdc
Installing for i386-pc platform.
grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
Installation finished. No error reported.
看到这些警告我不是很高兴,我仍然不确定它是否安装到正确的设备上。我检查了/boot/grub2/device.map
,它指的是旧驱动器,所以我修复了它,现在它是:
# this device map was generated by anaconda
(hd0) /dev/sdb
(hd1) /dev/sdc
(hd2) /dev/sda
剩余的驱动器最终将被移除并希望重新使用,所以我要从任何数据中清除它(不要泄漏它):
dd if=/dev/zero of=/dev/sda bs=8k
它完成了,然后我再次尝试将 grub 重新安装到 SSD 上,以确保:
[root@master ~]# grub2-install /dev/sdb
Installing for i386-pc platform.
grub2-install: error: disk `mduuid/85faee0a366da795c6ac33a7c4a48ae8' not found.
第一行立即出现,错误信息延迟了 10 秒。第二个 SSD 也是如此。
如果我/dev/sda1
再次将其添加到阵列中,将其正确增长到 3 个设备,则会显示:
[root@master /]# grub2-install /dev/sdb
Installing for i386-pc platform.
grub2-install: error: unknown filesystem.
我确信它包含一个有效的引导文件系统。我将它与 RAID 分开并检查,它在那里:
[root@master /]# blkid -p /dev/sda1
/dev/sda1: UUID="85faee0a-366d-a795-c6ac-33a7c4a48ae8" UUID_SUB="bc7af7ca-09f2-f533-3a79-53d98f5dd09a" LABEL="master.service.intrid.ru:boot" VERSION="1.0" TYPE="linux_raid_member" USAGE="raid" PART_ENTRY_SCHEME="dos" PART_ENTRY_TYPE="0xfd" PART_ENTRY_FLAGS="0x80" PART_ENTRY_NUMBER="1" PART_ENTRY_OFFSET="2048" PART_ENTRY_SIZE="1046528" PART_ENTRY_DISK="8:0"
[root@master /]# tune2fs -l /dev/md126 | grep feat
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
[root@master /]# mdadm -f /dev/md126 /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md126
[root@master /]# mdadm -r /dev/md126 /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md126
[root@master /]# tune2fs -l /dev/sda1 | grep feat
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
很奇怪。
现在我被困住了。该系统工作正常,所有文件系统都很好,它为客户服务。例如,/boot
已安装并且可用,我卸载并检查了它,然后重新安装回来。
互联网上充满了从救援现场媒体重新启动系统的建议,甚至在 grub 在重新启动时被放入救援 shell 后如何解决这个问题。我检查的一些资源:
- https://ahelpme.com/linux/grub2-grub-install-error-disk-mduuid-not-found-even-after-the-partition-has-bios_grub-on/
- grub2-install 错误 - 找不到磁盘(顺便说一句,没有回答)
- https://linoxide.com/fix-grub-filesystem-type-unknown-error-on-centosredhat/
- https://www.linuxquestions.org/questions/linux-newbie-8/centos-7-error-unknown-filesystem-grub-rescue-4175687414/
但是,我还没有重新启动它,我也不想重新启动,直到我确定它会启动,因为它是远程的,周围的人将无法修复引导加载程序。我以前多次更换过这样的设备,我不记得有这样的问题,但是这总是用 Gentoo 或 Debian 完成的,它们通常拥有比 CentOS 更新的软件。
那么,是否可以在不启动应急媒体的情况下从系统远程修复引导加载程序?可能是通过告诉 grub 不要检查任何东西而只是将所需的东西写到媒体上的适当位置?
如果我转储/boot
文件系统,从头开始重新创建包含它的数组并将图像写回,它会有所帮助吗?之后如何重新创建 initramfs?
经过一段时间的尝试和思考,我回到了我在问题中提到的第一篇文章:https ://ahelpme.com/linux/grub2-grub-install-error-disk-mduuid-not-found-even-after-the -partition-has-bios_grub-on/
作者认为内核中有一些关于数组的结构,这些结构在重新启动后会被重建。究竟是什么时候?可能在发现和组装期间。确实,引导阵列的重新组装有所帮助。这就是我解决这个问题的方法。
首先,我们卸载并拆卸阵列:
mdstat
显示没有引导阵列,我也确实dmesg
在这一点上阅读以确保一切正常:然后重新组装回来:
请注意,它会自动安装,
dmesg
是:现在它安装得很好:
无需重启!