grub2-install 拋出各種錯誤而不是安裝,如何繼續?
系統是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/
作者認為核心中有一些關於數組的結構,這些結構在重新啟動後會被重建。究竟是什麼時候?可能在發現和組裝期間。確實,引導陣列的重新組裝有所幫助。這就是我解決這個問題的方法。
首先,我們解除安裝並拆卸陣列:
[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.
無需重啟!