系统是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 安装错误 - 未找到磁盘(顺便说一句,这没有得到回答)
- https://linoxy.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?
答案1
经过一段时间的尝试和思考,我回到了问题中提到的第一篇文章:https://ahelpme.com/linux/grub2-grub-install-error-disk-mduuid-not-found-even-after-the-partition-has-bios_grub-on/
作者认为内核中有一些关于数组的结构在重启后会被重建。到底是在哪一刻?可能是在发现和组装过程中。真实的是,引导阵列的重组帮助了。这就是我解决这个问题的方法。
首先我们卸载并反汇编数组:
[root@master ~]# umount /boot
[root@master ~]# mdadm --stop /dev/md126
mdadm: stopped /dev/md126
[root@master ~]# cat /proc/mdstat
Personalities : [raid1]
md127 : active raid1 sdc2[4] sdb2[3]
487731200 blocks super 1.2 [2/2] [UU]
bitmap: 2/4 pages [8KB], 65536KB chunk
unused devices: <none>
mdstat
显示没有启动阵列,我也阅读了dmesg
这一点以确保一切正常:
[243050.619210] md126: detected capacity change from 535756800 to 0
[243050.619260] md: md126 stopped.
[243050.619271] md: unbind<sdb1>
[243050.629871] md: export_rdev(sdb1)
[243050.630093] md: unbind<sdc1>
[243050.635890] md: export_rdev(sdc1)
然后重新组装回去:
[root@master ~]# mdadm --assemble --run /dev/md126 /dev/sdb1 /dev/sdc1
mdadm: /dev/md126 has been started with 2 drives.
请注意,它是自动安装的dmesg
:
[243124.197117] md: bind<sdc1>
[243124.197468] md: bind<sdb1>
[243124.200993] md/raid1:md126: active with 2 out of 2 mirrors
[243124.201010] md126: detected capacity change from 0 to 535756800
[243124.201461] md126: unknown partition table
[243124.238232] md126: unknown partition table
[243124.246330] EXT4-fs (md126): mounted filesystem with ordered data mode. Opts: (null)
现在已经安装好了:
[root@master ~]# LANG=C grub2-install /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.
[root@master ~]# LANG=C grub2-install /dev/sdc
Installing for i386-pc platform.
Installation finished. No error reported.
无需重启!