当 GRUB 花费 9 分钟来启动内核时它在做什么?

当 GRUB 花费 9 分钟来启动内核时它在做什么?

最近(至少最近两次我打开 PC 时)我注意到 grub 启动需要很长时间。我计算了一下,从 BIOS 消息消失到内核日志出现在屏幕上,中间大约花了 9 分钟。

问题是,我如何知道 grub 正在做什么或等待什么?我如何检查 grub 是否正常?

几天前我移除了启动画面,所以每次启动时我都能看到文本日志。大多数时候它运行速度很快且正常。在这 9 分钟内,显示器接收到信号,但只是黑屏。NumLock 没有响应,整个东西似乎冻结了,但事实并非如此。

我至少从 2009 年起就拥有软件 raid1。

报告称该 raid 运行正常。在这几分钟内,第一分钟有一些小的硬盘活动。硬盘 SMART 数据正常。前一天关机正常。

自 8.04 以来,我已在这台电脑上安装了所有版本的 Ubuntu。自 10 月以来,我安装了 12.10。这台电脑上没有任何新东西,没有新硬盘,BIOS 设置也没有任何变化。

据我所知没有 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

试图弄清楚到底发生了什么。

这根本不是一个解决方案,但我希望它可以有所帮助。

相关内容