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

Don*_*lay 52 boot grub2

error: file '/grub/i386-pc/normal.mod' not found.
grub rescue>
Run Code Online (Sandbox Code Playgroud)

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

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

我该怎么办?键入exit, reboot, 或quit? 我应该重新安装吗?

bai*_*ain 46

Grub 有一个在启动时加载的小型核心映像。核心映像动态加载提供更多功能的模块。i386-pc/normal.mod not found表示grub无法加载normal.mod,这是一个提供普通命令的grub模块。要加载normal.mod,您需要告诉 grub 它在哪里。为此,您可以使用 grub 命令行(又名救援控制台)。如果引导出现问题,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
Run Code Online (Sandbox Code Playgroud)

如果你得到"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
Run Code Online (Sandbox Code Playgroud)

为什么grub没有找到?
检查 $prefix - grub 目录的绝对位置
(这是在 grub-install 安装 grub 时设置的)

grub> echo $prefix
(hd0,msdos2)/boot/grub
Run Code Online (Sandbox Code Playgroud)

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

grub> echo $root
hd0,msdos2
Run Code Online (Sandbox Code Playgroud)

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

grub> set root=(hd0,msdos1)
grub> set prefix=(hd0,msdos1)/boot/grub
Run Code Online (Sandbox Code Playgroud)

加载并运行正常模块

grub> insmod normal
grub> normal
Run Code Online (Sandbox Code Playgroud)

其他一些可能有用的命令

ls 列出所有设备和分区

grub> ls
(hd0) (hd0,msdos5) (hd0,msdos1)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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/
Run Code Online (Sandbox Code Playgroud)

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

grub> ls (hd0,msdos1)/boot/grub
i386-pc/ locale/ fonts/ grubenv grub.cfg
Run Code Online (Sandbox Code Playgroud)


小智 32

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

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

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

sudo fdisk -l
Run Code Online (Sandbox Code Playgroud)

转到安装 ubuntu 的分区。

一旦你有了你的分区,你就需要挂载它。假设根分区在 /dev/sda5 上,那就是:

sudo mount /dev/sda5 /mnt
Run Code Online (Sandbox Code Playgroud)

然后安装 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

  • *--root-directory* 现在是 grub2 中的 *--boot-directory* (3认同)