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


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

我能做什么?我只是坐在那里凝视着它。

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

我该怎么办?类型exitrebootquit?我应该重新安装吗?


1
根本无法解决的问题。这样做:重新安装您的OS,转到“执行其他操作”,创建分区表,然后单击use your windows partition as your primary boot device。最后一步至关重要。不要使用/ boot。可能还有另一种解决方案:尝试在启动过程中手动更改启动设备;但是,我认为这行不通。这是一个长期存在的问题,一直存在于Ubuntu 17.10及更高版本中。谢谢。
Wolfpack'08 2008年

这些说明对我都不起作用。实际上,使用各种恢复工具会使问题更加严重。我能够重新安装grub,但是因为使用lvm2,所以内核无法启动。如果将lvm2用于任何用途,那么在发生此问题时,您将必须重新安装操作系统。据我所知,失败的内核更新+ grub + lvm2组合无法恢复。尽管曾一度支持Ubuntu Server LTS,但lvm2几乎没有官方支持。我正在备份数据并重新安装操作系统,不会再碰到lvm2了。吸取了我的教训。
CubicleSoft '18

1
我已经离开了lvm2,此后出现了零个问题。我的基础架构都不再使用它。默认的系统应急解决方案(图形和CLI)都不知道或几乎不了解LVM,这是我不使用LVM的充分原因。即使我按照您的指示恢复系统并成功运行,将来也可能再次发生此问题。重新安装操作系统并放弃LVM对我而言是最好,最快的选择。
CubicleSoft

1
在我的情况下,@ Wolfpack的问题是,没有normal.mod设置会阻止我可能重新安装ubuntu,lgoin不会nt起作用。我能做什么?
HoCo_

1
@ Wolfpack'08请重新发布您的解决方案作为答案。将解决方案作为评论发布会绕过站点原则。您还应该提及哪个 “以下答案永远行不通”,因为它们更多。
Melebius

Answers:


40

Grub有一个小的核心映像,该映像在引导时加载。核心映像会动态加载提供更多功能的模块。i386-pc/normal.mod not found表示grub无法加载normal.mod,后者是提供normal命令的grub模块。要加载normal.mod,您需要告诉grub它在哪里。为此,您可以使用grub命令行(也称为Rescue Console)。如果启动有问题,则Grub将启动命令行,或者您可以通过在grub启动时按住Shift键(强制显示grub菜单),然后按'c'键来手动启动它。

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

  • 使用lssearch.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

为什么grub找不到它?
检查$ prefix-grub目录的绝对位置
(在通过grub-install安装grub时设置)

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

检查$ root-不包含设备
grub的路径的默认设备最初将其从$ prefix设置为设备

grub> echo $root
hd0,msdos2

root和prefix指向错误的分区(hd0,msdos2)
将$ root和$ prefix设置为我们发现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)

ls分区

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


+1按照以下步骤启动进入ubuntu安装后,我跑来sudo grub-install /dev/sdX安装我的grub。我认为LVM安装以某种方式使我的grub感到困惑。
DavidG 2014年

我想如果您像我刚才那样得到“未知命令'搜索文件',该放弃了。我的建议是不要在没有Windows Recovery DVD的情况下安装Ubuntu。正如我刚发现的那样,拥有一个恢复分区是一旦Grub搞砸了,这还不够;而且,永远不要在别人的Windows计算机上安装Ubuntu,因为如果搞砸了,他们真的会很生气
Scooter 2014年

@Scooter请参阅此答案,以获取有关通过引导实时CD / USB重新安装Grub的说明。
贝恩2014年

@bain感谢您的回复。就我而言,是从Ubuntu iso磁盘重新安装的。Ubuntu认为grub搞砸了,或者它只是自动将其覆盖,但是将其重新引导到我可以再次启动Windows的位置。
踏板车2014年

Grub救援外壳似乎不支持任何这些命令。“未知命令'search.file'”
Cerin

30

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

您需要执行的是安装GRUB2。为此,您需要启动到实时实例,安装根分区并安装。

在活动实例中,找到根分区已加载到的分区。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


1
没为我工作。我有同样的问题,我仍在寻找解决方案。
ExpatEgghead 2013年

3
--root目录现在是grub2中的--boot-directory
bain

1
对我有用的另一个简单修补程序是将/etc/grub.d/backup中的grup备份复制到/ boot / grub。检查随附的自述文件以获取适当的文件夹和路径。
jhexp

在我的情况下,问题是我有2个硬盘驱动器,并且BIOS序列首先在错误的驱动器上查找。该驱动器的旧grub安装已损坏。
eusoubrasileiro

如果你不能分辨出哪是fdisk的正确的,该做可以帮助(它帮助我找到哪个设备/媒体/ Ubuntu的/部分名称为上)unix.stackexchange.com/questions/11311/...
迈克尔

2

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

如果您的大型分区(例如1TB)安装了Ubuntu,并且没有为/ boot /分配额外的分区,则可能是此类错误的原因。GRUB启动时,它将使用biosdisk驱动程序从/ boot / grub /目录中读取常规驱动程序。有时,此目录可能实际位于biosdisk扇区支持的最大值之后的硬盘驱动器上。例如,在系统升级后,该问题可能会出现。另外,在全新安装Ubuntu 13.10之后,我始终会遇到该问题,但是它可能有所不同,因为它取决于主板/ BIOS。

您可以检查是否使用grub恢复-设置正确的PREFIX和ROOT后,尝试执行ls / boot-如果看不到任何东西,但是从活动CD /闪存驱动器启动时可以在那里看到文件-比您遇到的上述问题。

您可以做一些不同的事情来使系统可启动,但是避免将来发生此问题的唯一方法(在dist升级期间)是将/ boot目录放在单独的小分区上。


1

如果您看到grub-rescue提示和/或您的配置使用LVM,则其他解决方案可能不起作用,这应该可以。

在应急磁盘上启动(提示:我在备份USB磁盘的专用分区上保留了一个小分发包)。

如果使用LVM,请使用lvdisplay或其他与LVM相关的命令查找卷组的名称。激活它(否则mount: special drive /dev/volumegroupname/partition does not exist尝试挂载时会出现错误):

vgchange -a y volumegroupname

现在挂载您常用的/分区,例如/mnt :

mount /dev/volumegroupname/partition /mnt

还要安装一些特殊设备(以及/boot安装在单独的分区上):

mount -t proc none /mnt/proc
mount -o bind /dev /mnt/dev
mount -t sysfs /sys /mnt/sys

然后chroot放入您通常的分配中:

chroot /mnt

最后,重新安装GRUB2-命令可能会因您的发行版而异,这可在Slackware上使用(如果驱动器为/dev/sda):

grub-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg

重新启动,您应该完成。


0

!选择的答案永远无效。

这样做:

  1. 重新安装操作系统,转到“执行其他操作 ”,创建分区表,
  2. 将Windows分区用作主引导设备

第二步至关重要

请勿使用/boot

可能还有另一种解决方案:尝试在启动过程中手动更改启动设备;但是,我认为这行不通,并且我尚未对其进行测试。

这是一个长期存在的问题,一直存在于Ubuntu 17.10及更高版本中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.