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

错误:未找到文件‘/grub/i386-pc/normal.mod’
error: file '/grub/i386-pc/normal.mod' not found.
grub rescue>

我能做什么?我只能坐在那里盯着它。

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

我该怎么办?输入exitrebootquit?我应该重新安装吗?

答案1

Grub 有一个小型核心映像,在启动时加载。核心映像动态加载模块,以提供进一步的功能。错误normal.mod not found表明 grub 无法加载正常模式,这是一个 grub 模块,它提供正常命令。 加载正常模式您需要告诉 grub 它在哪里。为此,您可以使用 grub 命令行(又名救援控制台)。如果启动时出现问题,Grub 将启动命令行,或者您可以在 grub 启动时按住 Shift 键(强制显示 grub 菜单),然后按“c”键手动启动它。

使用grubgrub rescueshell,您可以探索驱动器、分区和文件系统。您需要:

  • 使用以下方式找到 grub 安装ls或者搜索文件
  • 设置 grub 变量$prefix$root
  • 加载并运行普通模块

例子

以下只是示例。您需要根据本地驱动器和分区设置进行调整。

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

grub rescue> ls
(hd0) (hd0,msdos1) (hd0,msdos2)
grub rescue> ls (hd0)
error: unknown filesystem.
grub rescue> ls (hd0,msdos1)/i386-pc/normal.mod
error: file '/boot/grub/x86_64-efi/normal.mod' not found.
grub rescue> ls (hd0,msdos1)/grub/i386-pc/normal.mod
error: file '/boot/grub/x86_64-efi/normal.mod' not found.

在 (hd0,msdos1) 找到它

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

为什么 GRUB 没有找到它?
检查 $prefix(GRUB 目录的绝对位置)和 $root(不包含设备的路径的默认设备)。

$prefix 是在 grub-install 安装 grub 时设置的,$root 最初设置为来自 $prefix 的设备

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

Root 和 prefix 指向错误的分区 (hd0,msdos2),因此我们必须将它们设置为指向 (hd0,msdos1),即 normal.mod 实际所在的分区

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

加载并运行正常模块

grub rescue> insmod normal
grub rescue> normal

其他一些可能有用的命令

ls:列出所有设备和分区

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

ls 分区

grub rescue> 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 rescue> 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 rescue> ls (hd0,msdos1)/boot/grub
i386-pc/ locale/ fonts/ grubenv grub.cfg

答案2

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

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

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

sudo fdisk -l

找到安装 ubuntu 的分区。

有了分区后,您需要挂载它。假设根分区位于 /dev/sda5,则为:

sudo mount /dev/sda5 /mnt

然后安装 GRUB 2

sudo grub-install /dev/sda --boot-directory=/mnt

最初的解决方案来自这里:http://ubuntujournal.blogspot.com/2012/11/fix-new-install-of-ubuntu-1210-wont-boot.html

答案3

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

在救援磁盘上启动(提示:我在备份 USB 磁盘的专用分区上保留了一个小的分布)。

如果您使用 LVM,请使用 或其他与 LVM 相关的命令查找卷组的名称。激活它(否则尝试挂载时lvdisplay会出错):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

重新启动,你就完成了。

答案4

我遇到了同样的问题,但无法使用 Grub-Rescue 解决。我尝试了这里提供的大部分解决方案。

然后我从 Ubuntu Live 媒体(DVD 或 USB)启动并安装了启动修复工具这为我解决了这个问题

如何在 Ubuntu 实时光盘中安装 Boot-Repair 工具?

相关内容