當 GRUB 需要 9 分鐘才能開始引導核心時,GRUB 在做什麼?

當 GRUB 需要 9 分鐘才能開始引導核心時,GRUB 在做什麼?

最近(至少是我最近兩次打開電腦時)我注意到 grub 需要很長時間才能啟動。我在 BIOS 訊息消失和內核日誌出現在螢幕上之間花了近 9 分鐘的時間。

問題是我如何知道 grub 正在做什麼或正在等待什麼?如何檢查grub是否正常?

幾天前,我刪除了啟動畫面,這樣我每次啟動時都會看到文字日誌。大多數時候它是快速且正常的。在這 9 分鐘內,顯示器收到訊號,但只是黑屏。 NumLock 沒有反應,整個事情似乎被凍結了,但事實並非如此。

至少從 2009 年起我就開始使用軟體 raid1。

據報道,這次突襲行動順利。在這幾分鐘內,第一分鐘會有一些輕微的硬碟活動。硬碟 SMART 數據健康。前一天關機正常。

自 8.04 以來,我已經在這台電腦上安裝了所有 Ubuntu 版本。我從 10 月開始就安裝了 12.10。這台計算機沒有任何新內容,沒有新硬碟,BIOS 設定也沒有更改。

AFAIK 沒有 grub 日誌,而且核心日誌並不有趣,因為它說核心在 28 秒內啟動 [PhenomX4 核心:[ 28.825313] vboxpci:IOMMU 未找到(未註冊)],因此 9 分鐘是在核心啟動之前。

*更新:3 月 27 日*

我發現了問題,但仍然不知道原因。問題是 /boot/grub/grub.cfg 大小為 11.6 MB,其中有類似這樣的條目,重複了很多次,但略有不同。 Grub 因創建菜單而被這麼大的文件噎住了。

menuentry 'Ubuntu 12.10 (12.10) (en /dev/sda1) (en /dev/sda1) (en /dev/sdb1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1) (en /dev/sda1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/vmlinuz--73e06880-5f46-4493-aaef-23fa4ad138f6' {
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  73e06880-5f46-4493-aaef-23fa4ad138f6
    else
      search --no-floppy --fs-uuid --set=root 73e06880-5f46-4493-aaef-23fa4ad138f6
    fi
    linux /vmlinuz root=/dev/sda1
    initrd /initrd.img
}

仍然不知道為什麼該文件增長如此之大?

3月28日更新

大部分的選單項目是由 /etc/grub.d/30_os-prober 產生。

Line 223: ### BEGIN /etc/grub.d/30_os-prober ###
...
Line 175174: ### END /etc/grub.d/30_os-prober ###

grub.cfg 有 175191 行,因此腳本佔檔案中 11.6 MB 的 99%。

答案1

儲存庫中包含一個名為 BootChart 的好工具。它還提供了 GRUB 調試組件。這些可以讓你分析你的靴子,並希望找出是什麼消耗了大部分時間。

在此輸入影像描述

答案2

如果您獲得所有這些條目,則可能是 Grub 上出現了循環。當我在單獨的分割區上安裝 Raring 時,也發生了類似的事情(不良轉義創建的條目,如menuentry "Ubuntu"...)。正如您所說,您沒有進行任何更改,也許這源自於 Grub 的某些更新?

該檔案是由 中存在的腳本自動產生的(例如,當您安裝新核心時)/etc/grub.d。如果您檢查,grub.cfg您將看到條目之間有分隔符,指定哪個腳本產生它。例子:

### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Ubuntu Raring (on /dev/sda2)" --class gnu-linux --class gnu --class os {
    (...)
}

menuentry 'Steam' --class ubuntu --class gnu-linux {
        (...)
}
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

因此,請嘗試確定哪個腳本正在建立這些條目(並使用腳本名稱更新您的答案)。當您到達那裡時,您可以使用sudo grub-mkconfig或執行該腳本,例如:

sh -v /etc/grub.d/file

嘗試確定發生了什麼。

這根本不是一個解決方案,但我希望它能有所幫助。

相關內容