问题描述
error: file '/grub/i386-pc/normal.mod' not found.
grub rescue>
我能做什么?我只是坐着盯着它看。
我发现了我的旧上网本(戴尔Inspiron 1010),我已经用了大约四年了。我用Ubuntu 12.10替换了Windows XP。我使用了我的可启动USB驱动器。我安装并重新启动。我收到的消息是找不到normal.mod
。
我该怎么办?键入exit
,reboot
或quit
?我应该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
-
Grub Manual: Troubleshooting: GRUB only offers a rescue shell涵盖了上述基本恢复方法
-
有关可用的命令和变量,请参阅Grub Manual: The list of 命令行 and menu entry commands和Special environment variables。
-
可以加载其他丢失的模块,例如如果无法识别
search
或search.file
命令,则正确设置$prefix
然后执行insmod search
,对于ls
执行insmod ls
等。在正常运行的Linux安装上运行find /boot/grub -name *.mod
以查看所有动态加载的Grub模块。
次佳解决方案
今天下午在机器上解决了这个问题。似乎这个问题的一个原因是安装程序认为您有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目录放在单独的小分区上。