Centos

grub2-install 拋出各種錯誤而不是安裝,如何繼續?

  • December 4, 2021

系統是CentOS 7。它安裝在兩塊MD RAID的硬碟上,一個驅動器死了。我們決定改用兩個尺寸稍大的 SSD。當它們連接並啟動系統時,sda看起來像是一個有兩個分區的舊硬碟,sda1參與md126其中的 500M 是/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?

經過一段時間的嘗試和思考,我回到了我在問題中提到的第一篇文章: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.

無需重啟!

引用自:https://unix.stackexchange.com/questions/679870