Raid

GRUB 在菜單之前掛起,在 HDD 升級之後。如何調試?

  • May 21, 2019

我在執行 Debian wheezy 和 GRUB 1.99-27+deb7u3 的 4 x 1 TB 驅動器的伺服器上遇到問題。

sda 和 sdb 具有使用(Linux 軟體)RAID1 鏡像的分區,包括/boot. sdc 和 sdd 各有一個分區,為數據鏡像一個 LVM 物理卷。GRUB 安裝到 sda 和 sdb。我曾經使用mdadm1 TB sdc,--fail--remove用新的 2 TB ST2000NX0243 替換了舊驅動器(ST91000640NS)。

有了新的驅動器,GRUB 就更遠了

GRUB loading.
Welcome to GRUB!

但無法顯示菜單。sdc 上的驅動器指示燈持續亮起,因此推測 GRUB 核心正在嘗試讀取該驅動器,即使它不需要訪問 /boot/grub。我已經嘗試了兩個相同型號的驅動器,兩者都用 測試良好smartctl,結果相同。在 sdc 驅動器托架為空的情況下,一切正常啟動。系統從 live USB 啟動並且可以訪問新驅動器,因此這不是硬體不兼容 (*)。我確定是 sdc 被刪除了,並且沒有跡象表明 BIOS 重新排序了驅動器。

(*)這可能不是一個安全的假設。查看答案。

所以我有以下相關問題:

  1. 更改的邏輯扇區大小(4096 而不是 512 字節)是否會導致問題,也許是在 GRUB 核心中內置的 RAID 支持中?為什麼我至少沒有得到grub rescue>提示?4K 問題也會阻止將驅動器用於 Linux RAID 嗎?
  2. 解決這個問題的最快方法是什麼? $$ Previous suggestions included: Do I need to reinstall GRUB with the new drive in place, and in that case how? Would a GRUB rescue USB (made from the same system) have the same problem? Is it a known bug in GRUB, and should I upgrade? Answers to these appear to be: no, yes and no. $$我可以永久配置 Debian 使用的 GRUB 映像前綴嗎?
  3. 如何調試這個階段的 GRUB?它可能對內置的模組很敏感,但是您如何找到它呢?

我正在考慮一個 debug.cfgdebug=all和類似的東西:

grub-mkimage -c debug.cfg -o dcore.img configfile normal raid fs multiboot
grub-setup -c dcore.img /dev/sda

那行得通嗎?(我在自己的回答中提到了第 3 點,但在我的情況下,掛起似乎發生在嵌入式配置被執行之前。)

更多系統細節

如果它有助於視覺化,這是lsblk輸出的一部分:

NAME                             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb                                8:16   0 931.5G  0 disk  
├─sdb1                             8:17   0   957M  0 part  
│ └─md0                            9:0    0 956.9M  0 raid1 /boot
├─sdb2                             8:18   0   9.3G  0 part  
│ └─md1                            9:1    0   9.3G  0 raid1 /
├─sdb3                             8:19   0 279.4G  0 part  
│ └─md2                            9:2    0 279.4G  0 raid1 /var
└─sdb4                             8:20   0 641.9G  0 part  
 └─md3                            9:3    0 641.9G  0 raid1 
   ├─vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
   └─vg0-swap (dm-2)            253:2    0    32G  0 lvm   [SWAP]
sdc                                8:32   0 931.5G  0 disk  
└─sdc1                             8:33   0 931.5G  0 part  
 └─md4                            9:4    0 931.5G  0 raid1 
   └─vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
sdd                                8:48   0 931.5G  0 disk  
└─sdd1                             8:49   0 931.5G  0 part  
 └─md4                            9:4    0 931.5G  0 raid1 
   └─vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
sda                                8:0    0 931.5G  0 disk  
├─sda1                             8:1    0   957M  0 part  
│ └─md0                            9:0    0 956.9M  0 raid1 /boot
├─sda2                             8:2    0   9.3G  0 part  
│ └─md1                            9:1    0   9.3G  0 raid1 /
├─sda3                             8:3    0 279.4G  0 part  
│ └─md2                            9:2    0 279.4G  0 raid1 /var
└─sda4                             8:4    0 641.9G  0 part  
 └─md3                            9:3    0 641.9G  0 raid1 
   ├─vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
   └─vg0-swap (dm-2)            253:2    0    32G  0 lvm   [SWAP]

這是 2010 年之前的 BIOS,沒有 EFI 功能。

無關:在正在執行的系統上,以下給出了與 grub-install 相同的 grub-probe 1.99 的 LVM 錯誤,儘管一切似乎都可以正常工作(這在 GRUB 2.02 中似乎已修復)。

# grub-fstest /dev/sda cp '(loop0,msdos1)/grub/grub.cfg' grub.cfg
error: unknown LVM metadata header.

下面答案中的調試方法顯示了正在安裝到 sd 的圖像的前綴

$$ ab $$是:

grub-mkimage -d /usr/lib/grub/i386-pc -O i386-pc --output=/boot/grub/core.img '--prefix=(mduuid/<UUID of sdN1>)/grub' biosdisk ext2 part_msdos part_msdos raid mdraid09

我不知道為什麼重複“part_msdos”。沒有 gpt 表。md0(引導)使用 RAID 超級塊版本 0.9,md1、md2 和 md4(這些是舊陣列)也是如此。md3 是超級 1.2,但不應該參與引導。


更新

感謝您迄今為止的建議。進一步測試後:

  • BIOS 已設置為使用 sda (ata1.00) 啟動。將 GRUB 重新安裝到所有帶有 的驅動器後dpkg-reconfigure grub-pc,沒有任何變化,當新驅動器通過 SATA 連接時,GRUB 仍然掛在菜單之前。無論如何,這不能由 /boot/grub 內容與核心映像不匹配來解釋。同樣,物理上重新排列驅動器也沒有區別。
  • 在 Debian Jessie 中將 GRUB 升級到 2.02 只會產生Welcome to GRUB!不列印消息的效果 - 相反,它會更改圖形模式。它仍然在相同的條件下掛起。
  • 掛起似乎發生在嵌入式配置設置debug變數之前。不會發出有用的調試資訊。
  • 當從前綴不使用 UUID 的可移動介質引導時,GRUB 會顯示一個菜單,這樣就可以在驅動器物理存在的情況下引導系統。但是,驅動器的 TAB 列舉會凍結。正如預期的那樣,從硬碟驅動器鍊式載入 GRUB 像以前一樣掛起。grub-mkrescue從同一系統製作的 USB 驅動器啟動也會掛起。
  • 作為一個單獨的故障,在實時系統(Linux 3.2.0-4-amd64)上,嘗試通過內部 SATA 或 USB 將新的 4Kn 驅動器添加到 RAID1 陣列會導致Bad block number requested設備出現故障,然後是 md 系統失敗驅動器BUG: unable to handle kernel paging request和核心哎呀。(mdadm --remove說失敗的元素很忙,並且 md-resync 程序沒有響應 SIGKILL。我沒有嘗試echo frozen > /sys/block/mdX/md/sync_action。使用 SATA 測試驅動器dd一切正常。)。Linux MD 驅動程序肯定能夠將 4Kn 驅動器與舊驅動器同步並且不使用 BIOS 嗎?

因此解決方法可能包括將非 RAID 分區掛載為/boot/; 安裝帶有設備相關前綴的 GRUB;或刷新 BIOS。最明智的做法可能是聯繫供應商更換驅動器。

換句話說,問題 3 有一個解決方案,其無效性可能是 GRUB 功能請求的主題;問題 2 說錯了樹,所以我修改了它;問題 1,如果不是太離題的話,現在也是關於為什麼驅動器顯然不能用於 Linux RAID。

我很樂意將賞金獎勵給任何一個體面的解釋,關於 RAID 重新同步錯誤,或使用flashrom4Kn 支持的軼事,如何告訴 grub-install 不要使用 UUID 或任何相關的系統管理員提示。

我現在正在回答我自己的問題 1。這是 4Kn(“高級格式”)問題嗎?

是的。

4Kn 驅動器並沒有您想像的那麼廣泛支持;例如,它們與 Windows 7 或 GRUB 1 或許多英特爾晶片組不兼容。就我而言,問題似乎是主機板上的 Intel 82801I Enterprise Southbridge 控制器晶片(ICH9 系列)。我認為這也是驅動器即使通過 USB 也無法進行 md_resync 部分故障的原因。上述連結中的分析似乎發現 Linux ata_piix 驅動程序在英特爾 ICH10 上執行良好,儘管缺乏英特爾的官方支持。對於 ICH9,我可能發現不同。我還沒有測試驅動器是否可以在 AHCI 或 SAS 模式下工作。

只有主機板製造商或進行過徹底測試的其他人可能知道驅動器兼容性資訊。我過早地得出結論,“這不是硬體不兼容”,只是因為簡單的讀寫工作。此主機板的更新 BIOS 不支持 4Kn 是有原因的:因為主機板不能可靠地支持。

在這些情況下,等效的 512e 驅動器沒有理由不工作。

我將回答我的問題的第三部分,關於在啟用調試的情況下安裝 GRUB 的過程。我仍然很感激有關問題可能出在哪裡的明智建議,或者以最少的停機時間和最多的關於原因的資訊來解決的策略。


一些一般要點: GRUB 提供其他調試方法 -grub-mkrescue將生成一個 .iso,其中包含您可能需要內置的所有模組,因此可以使用實時 USB 來嘗試導航 RAID 陣列並嘗試載入 .cfg文件甚至核心。模擬器在大多數發行版中grub-emu都可用,但更側重於菜單的外觀。更高級的是標準 GRUB 模組,用於通過串列電纜進行調試gdb

在啟用調試的情況下安裝 GRUB 的過程

因此,獲取調試消息的過程在GRUB 手冊第 6 節中有提及,但沒有詳細說明。您可能要考慮的第一件事是通過串列控制台進行調試並在script之前執行screen以記錄調試消息。顯然你需要root權限。請注意,此答案中的驅動器佈局不一定與問題匹配,只是一個範例。假設正常(非調試)GRUB 已安裝到其他適當的驅動器:這只是將調試 GRUB 安裝到您希望引導的驅動器的過程。(這意味著調試消息可以清楚地顯示哪個驅動器正在引導。對於安裝到 RAID 分區,兩種情況下的前綴很可能是相同的,因此您只需為/dev/sdaas執行相同的命令/dev/sdb。)

首先,檢查現有的 grub 文件在哪裡,/boot/grub或者更有可能是/boot/grub/<platform>. 在這種情況下,假設他們在/boot/grub/i386-pc/. 我們不會修改已經存在的文件,而是添加一個啟用調試的附加核心映像。如果.cfg文件失去或已被修改,請使用grub-mkconfig -o /boot/grub/grub.cfg.

檢查已安裝的模組和前綴

顯示哪些模組已編譯到您的核心映像中的快速而骯髒的方法是grub-install再次執行。這適用於 GRUB 2.02:

grub-install -v /dev/sda 2>&1 | grep '\(mkimage\|setup\)'

在沒有 RAID 或 lvm 的簡單情況下,這可能會顯示類似ext2 part_gpt biosdisk. 但是 GRUB 1.99 不-v用於詳細說明,因此請--debug改用。我們將把它與不實際安裝映像的技巧結合起來,以節省一點時間:

grub-install --debug --grub-setup=/bin/true /dev/sda 2>&1 | grep '\(-mkimage\|-setup\|true\)'

請注意,它grub-install可以執行 shell 腳本來代替它呼叫的程序,因此我們可以這樣做:

# create grub-mkimage wrapper
cat > /usr/local/bin/grub-mkimage.sh <<"EOF"
echo Arguments to grub-mkimage: $*
/usr/bin/grub-mkimage $*
EOF
# create a dummy grub-setup
cat > /usr/local/bin/grub-setup.sh <<"EOF"
#!/bin/bash
echo Arguments are: $*
EOF
# run grub-install using the above
chmod u+x /usr/local/bin/grub-*.sh
grub-install --grub-mkimage=/usr/local/bin/grub-mkimage.sh \
 --grub-setup=/usr/local/bin/grub-setup.sh /dev/sda 2>&1 \
 | grep 'Arguments' | tee grub-args.txt

當然,路徑可能會根據您的發行版和選擇的外殼而有所不同。

設置調試變數

我們現在創建一個可以debug.cfg使用調試設置呼叫的文件。(如果核心在這個階段遇到註釋,就會產生非致命錯誤,所以我們不會使用任何。)

set pager=1
set debug='init modules disk ata,scsi,linuxefi,efi,badram,drivemap linux,fs,elf,dl,chain serial,usb,usb_keyboard,video'
set

空格、 或 的任意組合,;用於|分隔字元串中的模組名稱。

我從 GRUB 2.02 原始碼中提取了調試工具列表,並對它們進行了語義排序。從解釋器中'all'產生過多的記憶體資訊。scripting還有一些針對特定文件系統的附加工具,例如“xfs”和“reiserfs”,以及“net”、“partition”和“loader”(“loader”對於我們在菜單之前感興趣的內容來說太遲了。如果我們可以得到一個菜單,我們可以在那裡設置調試變數。)不幸的是,‘mdraid_linux’源中沒有調試消息,但disk顯示了最重要的操作。

pager如果您沒有通過控制台擷取調試消息(例如使用script) ,則需要該變數來讀取調試消息。我發現如果pager不包含像sleepor之類的附加模組,它將無法工作configfile,它會使圖像的大小增加一倍以上。無論如何,調試環境變數都會生效。

安裝

現在製作您要調試的圖像的變體圖像:

grub-mkimage -p '(,msdos3)/boot/grub' -c debug.cfg \
  -O i386-pc -o dcore.img -C auto ext2 part_msdos biosdisk

其中模組列表是 grub-install 中您要調試的模組列表,包括sleep您需要的任何其他內容。前綴-p應該從grub-installtoo 的輸出中複製,因為顯然它對 GRUB 橫幅之後發生的事情有巨大的影響。但是,您可能希望嘗試使用 GRUB 設備程式碼(如本例所示)而不是標準 UUID。您可以在 RAID 驅動器上使用lsblk -o NAME,TYPE,FSTYPE,LABEL,SIZE,STATE,UUID或和顯示 UUID 。ls -l /dev/disk/by-id/``mdadm --detail /dev/sda

現在將剛剛創建的核心安裝到正常啟動的磁碟:

cp dcore.img /boot/grub/i386-pc
grub-bios-setup -d /boot/grub/i386-pc -c dcore.img /dev/sda

對於 2.0 之前的 GRUB 版本,該grub-bios-setup命令仍可以grub-setup像手冊中那樣呼叫。

重啟。Welcome to GRUB!在顯示菜單之前,您應該會看到幾頁調試消息(或視情況而定)。

引用自:https://serverfault.com/questions/869559