Grub has a small core image that is loaded at boot time. The core image dynamically loads modules which provide further functionality. A normal.mod not found
error indicates that grub can not load normal.mod, which is a grub module that provides the normal command. To load normal.mod you need to tell grub where it is. To do this you can use the grub command-line (aka Rescue Console). Grub will start the command-line if there is a problem booting, or you can start it manually by holding the shift key as grub starts (to force show the grub menu), and then pressing the 'c' key.
Using the grub
and grub rescue
shells you can explore the drives, partitions, and filesystems. You need to:
- Locate the grub install using ls or search.file
- Set grub variables
$prefix
and $root
- Load and run the normal module
Example
The following is just an example. You will need to adapt it to your local drive and partition setup.
Where is normal.mod? Look in some likely locations
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.
Found it at (hd0,msdos1)
grub> ls (hd0,msdos1)/boot/grub/i386-pc/normal.mod
normal.mod
Why did GRUB not find it?
Check $prefix (the GRUB directory's absolute location), and $root (the default device for paths that do not include a device).
$prefix is set when grub is installed by grub-install, and $root is initially set to the device from $prefix
grub rescue> echo $root
hd0,msdos2
grub rescue> echo $prefix
(hd0,msdos2)/boot/grub
Root and prefix are pointing to the wrong partition (hd0,msdos2), so we must set them to point to (hd0,msdos1), the partition where normal.mod is actually located
grub rescue> set root=(hd0,msdos1)
grub rescue> set prefix=(hd0,msdos1)/boot/grub
Load and run normal module
grub rescue> insmod normal
grub rescue> normal
Some other commands that may be helpful
ls: List all devices and partitions
grub> ls
(hd0) (hd0,msdos5) (hd0,msdos1)
ls Partition
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 Filesystem (note / at end)
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/
Look inside /boot/grub
presence of i386-pc directory means this is a BIOS install
presence of x86_64-efi directory would indicate an EFI install
grub rescue> ls (hd0,msdos1)/boot/grub
i386-pc/ locale/ fonts/ grubenv grub.cfg
use your windows partition as your primary boot device
. That last step is essential. DO NOT USE /boot. There might be another solution: try manually changing your boot device during startup; however, I don't think that will work. This is a long-standing problem that has persisted in Ubuntu up-to and including 17.10. Thank you.