当前位置: 首页>>技术问答>>正文


错误:找不到文件’/grub/i386-pc/normal.mod’

, ,

问题描述

error: file '/grub/i386-pc/normal.mod' not found.
grub rescue>

我能做什么?我只是坐着盯着它看。

我发现了我的旧上网本(戴尔Inspiron 1010),我已经用了大约四年了。我用Ubuntu 12.10替换了Windows XP。我使用了我的可启动USB驱动器。我安装并重新启动。我收到的消息是找不到normal.mod

我该怎么办?键入exitrebootquit?我应该re-install吗?

最佳解决方案

Grub有一个小的核心映像,在启动时加载。核心映像动态加载提供进一步功能的模块。 i386-pc/normal.mod not found表示grub无法加载normal.mod,这是一个提供normal command的grub模块。要加载normal.mod,你需要告诉grub它在哪里。为此,您可以使用grub 命令行(又名Rescue Console)。如果启动有问题,Grub将启动命令行,或者您可以在grub启动时按住shift键手动启动(强制显示grub菜单),然后按’c’键。

使用grub,您可以浏览驱动器,分区和文件系统。你需要:

  • 使用ls或search.file找到grub安装

  • 设置grub变量$ prefix和$ root

  • 加载并运行正常模块

例子

以下只是一个例子。您需要将其调整为本地驱动器和分区设置。

normal.mod在哪里?看看一些可能的位置

grub> search.file /i386-pc/normal.mod
error: no such device: /i386-pc/normal.mod

grub> search.file /grub/i386-pc/normal.mod
error: no such device: /grub/i386-pc/normal.mod

grub> search.file /boot/grub/i386-pc/normal.mod
hd0,msdos1

如果获得"Unknown command 'search.file'",则表示search.file命令不可用。这可能是因为您处于grub rescue>提示符而不是grub>提示符。在这种情况下,您仍然可以继续使用ls命令以及您的分区布局知识来查找normal.mod

发现它在(hd0,msdos1)

grub> ls (hd0,msdos1)/boot/grub/i386-pc/normal.mod
normal.mod

格鲁布为什么找不到它? check $ prefix – grub目录的绝对位置(这是在grub-install安装grub时设置的)

grub> echo $prefix
(hd0,msdos2)/boot/grub

check $ root – 不包含设备grub的路径的默认设备最初从$ prefix设置到设备

grub> echo $root
hd0,msdos2

root和prefix指向错误的分区(hd0,msdos2),将$ root和$前缀设置为我们发现normal.mod(hd0,msdos1)的分区

grub> set root=(hd0,msdos1)
grub> set prefix=(hd0,msdos1)/boot/grub

加载并运行正常模块

grub> insmod normal
grub> normal

其他一些可能有用的命令

ls列出所有设备和分区

grub> ls
(hd0) (hd0,msdos5) (hd0,msdos1)

分区

grub> ls (hd0,msdos1)
        Partition hd0,msdos1: Filesystem type ext* - Last modification time
2014-05-08 15:56:38 Thursday, UUID c864cbdd-a2ba-43a4-83a3-66e305adb1b6 -
Partition start at 1024KiB - Total size 6290432Kib

ls文件系统(注意/结尾)

grub> ls (hd0,msdos1)/
lost+found/ etc/ media/ bin/ boot/ dev/ home/ lib/ lib64/ mnt/ opt/ proc/
root/ run/ sbin/ srv/ sys/ tmp/ usr/ var/ vmlinuz initrd.img cdrom/

查看内部/boot /grub i386-pc目录的存在意味着这是一个BIOS安装x86_64-efi目录的存在表明EFI安装

grub> ls (hd0,msdos1)/boot/grub
i386-pc/ locale/ fonts/ grubenv grub.cfg

次佳解决方案

今天下午在机器上解决了这个问题。似乎这个问题的一个原因是安装程序认为您有EFI安全启动,而不是因为加载了错误的GRUB文件。

您需要做的是安装GRUB 2.为此,您需要启动到实例,挂载根分区并安装。

从实时实例中,找到加载根分区的分区。 GParted会告诉你这个,或者你可以使用

sudo fdisk -l

转到安装ubuntu的分区。

一旦有了分区,就需要安装它。假设根分区在/dev /sda5上,那就是:

sudo mount /dev/sda5 /mnt

然后安装GRUB 2

sudo grub-install /dev/sda --root-directory=/mnt [使用复制和粘贴这个,因为你需要一些空间才能正确。]

假设这是你的问题,那么你应该只能重新启动,一切都会正常工作。

对此的原始解决方案来自:http://ubuntujournal.blogspot.com/2012/11/fix-new-install-of-ubuntu-1210-wont-boot.html

第三种解决方案

我没有在论坛上找到这些信息,所以我想分享一些信息,尽管很久以前就问过这个问题了:

如果您有一个安装了Ubuntu的大型(例如1TB)分区,并且没有为/boot /分配额外的分区,则可能是出现此类错误的原因。当GRUB启动时,它使用biosdisk驱动程序从/boot /grub /目录中读取普通驱动程序。有时,在biosdisk扇区支持的最大值之后,此目录可能位于硬盘驱动器上的某个位置。例如,系统升级后可能会出现此问题。此外,我在新安装Ubuntu 13.10后总是面临这个问题,但它可能会有所不同,因为它取决于主板/BIOS。

您可以使用grub恢复检查 – 在设置正确的PREFIX和ROOT后,尝试ls /boot – 如果您没有看到任何内容,但可以在从live cd /flash驱动器启动时看到文件 – 而不是您遇到上述问题。

您可以执行不同的操作以使系统可引导,但是将来(在dist-upgrades期间)避免该问题的唯一方法是将/boot目录放在单独的小分区上。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/3006.html,未经允许,请勿转载。