error: file '/grub/i386-pc/normal.mod' not found.
grub rescue>
我能做什么?我只能坐在那里盯着它。
我找到了我的旧上网本(Dell Inspiron 1010),我已经大约四年没用过了。我用 Ubuntu 12.10 替换了 Windows XP。我使用了可启动的 USB 驱动器。我安装并重新启动。我收到了normal.mod
未找到的消息。
我该怎么办?输入exit
、reboot
或quit
?我应该重新安装吗?
答案1
Grub 有一个小型核心映像,在启动时加载。核心映像动态加载模块,以提供进一步的功能。错误normal.mod not found
表明 grub 无法加载正常模式,这是一个 grub 模块,它提供正常命令。 加载正常模式您需要告诉 grub 它在哪里。为此,您可以使用 grub 命令行(又名救援控制台)。如果启动时出现问题,Grub 将启动命令行,或者您可以在 grub 启动时按住 Shift 键(强制显示 grub 菜单),然后按“c”键手动启动它。
使用grub
和grub rescue
shell,您可以探索驱动器、分区和文件系统。您需要:
- 使用以下方式找到 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
- Grub 手册:故障排除:GRUB 仅提供救援 shell涵盖上述基本恢复方法
- 有关可用的命令和变量,请参阅Grub 手册:命令行和菜单项命令列表和特殊环境变量。
- 可能需要加载其他缺失的模块,例如,如果
search
或search.file
命令无法$prefix
正确识别,则设置然后执行insmod search
,ls
执行insmod ls
等。在正常运行的 Linux 安装上运行find /boot/grub -name *.mod
以查看所有动态加载的 Grub 模块。 - 你可以随时从外部媒体启动并重新安装 Grub。
答案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)启动并安装了启动修复工具这为我解决了这个问题