grub2-install 抛出各种错误而不是安装,如何继续?

grub2-install 抛出各种错误而不是安装,如何继续?

系统是CentOS 7。它安装在两个带有MD RAID的硬盘上,其中一个驱动器坏了。我们决定改用两个尺寸稍大的 SSD。当它们连接起来并且系统启动时,sda似乎是一个有两个分区的旧硬盘,sda1参与的md126500M 是/bootsda2参与的是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 后修复此问题。我检查过的一些资源:

然而,我还没有重新启动它,而且我不想重新启动它,直到我确定它会启动,因为它是远程的,周围的人无法修复引导加载程序。我以前多次更换过这样的设备,我不记得有这样的问题,但是这总是用 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.

无需重启!

相关内容