我最近遇到了一个相对常见的问题,即 16.04 安装程序错误配置了 GRUB 文件夹的位置。在这种情况下,系统会启动到救援 shell,并显示以下消息:
error: file '/grub/i386-pc/normal.mod' not found.
Entering rescue mode...
grub rescue>
这意味着 GRUB 能够启动,但它在错误的地方寻找模块。众所周知的解决方案是指示 GRUB 动态定位其模块的位置。在我的例子中,这是:
grub rescue> set prefix=(hd1,msdos2)/boot/grub
grub rescue> insmod normal
grub rescue> normal
这样可以成功恢复启动过程。但是,下次启动系统时,GRUB 会再次返回救援控制台,并且必须再次指示其模块的位置。我重新安装了 GRUB,但问题仍未解决。
如何才能永久地告知 GRUB 其模块的正确位置?
更新: 我跟着WinEunuuchs2Unix 的建议并尝试了启动修复工具。我首先验证了 GRUB 的位置,它显然是正确的:/boot/grub
在 上sdg2
。
然后我运行了推荐修复诊断,结果显示此输出。这里再次报告了正确的 GRUB 位置:
sdg2: __________________________________________________________________________
File system: ext4
Boot sector type: -
Boot sector info:
Operating System: Ubuntu 16.04.3 LTS
Boot files: /boot/grub/grub.cfg /etc/fstab
/boot/grub/i386-pc/core.img
但是,报告的最后有一个错误,指出了一个问题device.map
:
grub-probe: error: cannot find a GRUB drive for /dev/sdi1. Check your device.map.
Unhide GRUB boot menu in sdg2/boot/grub/grub.cfg
An error occurred during the repair.
对此您能提出什么建议吗?
答案1
理解错误的关键是需要指示 GRUB hd1
。BIOS 默认启动至hd0
,并且在该工作站中,存在 MBR 的残余,该残余试图在磁盘上安装 GRUB 后加载该 MBR(因此引用了/grub
而不是/boot/grub
)。
解决方案是在 BIOS 中更改内部磁盘的启动顺序。hd1
首先,启动过程无需人工干预即可成功完成。在某些 BIOS 中,可能无法修改内部磁盘的启动顺序;在这种情况下,必须将磁盘重新连接到主板。