Wondering how to resolve Ubuntu error “/boot/grub/i386-pc/normal.mod not found”? We can help you.
As part of our Server Management Services, we assist our customers with several Ubuntu queries.
Today, let us see how our Support techs proceed to resolve it.
How to resolve Ubuntu error “/boot/grub/i386-pc/normal.mod not found”?
Typically, error looks as shown below:
error: file '/grub/i386-pc/normal.mod' not found.
Basically grub-rescue prompt is somewhat more restrict as compare to grub prompt.
This is because not all commands run in this shell.
Only few commands work at the grub-rescue prompt.
Very first command which we tried was “ls” command which worked and it will show the all the devices or partitions which were present in the system.
So, the output was somewhat like:
grub rescue> ls
(hd0) (hd0,msdos1) (hd0,msdos2) (hd0,msdos4) (hd0,msdos5) (hd0,msdos6)
These are the partitions which were present in the system.
After that we run the “ls” command on each partition, which gives us some unexpect output.
It tells if the file-system is known or not.
Grub only recognizes the “ext2” file-system.
There are three partitions to work with which were (hd0,msdos2) (hd0,msdos4) (hd0,msdos6).
Partitions names will as shown below:
(hd0,msdos1) = /dev/sda1
(hd0,msdos2) = /dev/sda2
and so on. Now, in words (hd0,msdos1) will be the 1st partition in hard-drive 0 and (hd0,msdos2) means 2nd partition in hard-drive 0.
Since the system had only single hard-drive and it’s been divided into partitions, so all partition contains (hd0).
Partitions except the known file systems showed the error of “Unknown file system“.
Now, we were left with the 3 partitions to look into for the required file which is “normal.mod“.
Before going any further, we should understand the need for this file.
Basically, normal.mod is a module which grub loads at the boot time which provides the use of normal command.
Using normal command we can display the GRUB menu.
Since, the grub couldn’t locate the file in its usual location, it means either the file has been displaced or it could have been deleted somehow.
Case 1: ‘normal.mod’ is displaced from its default location
In this case, Grub looks for this module in the /boot/grub/i386-pc/ by default(Here i386-pc is specific.
For that we have to check the contents of each of the three partitions in order to ensure if the file is present there or not.
We can do this using ls command.
grub rescue> ls (hd0,msdos1)/boot/grub/i386-pc/
Then, we need to do this for every partition.
If we get the required module in any of the partition. Let’s say we get it in the 1st partition.
So, now we need to set the prefix variable to the partition which contains the require file.
prefix variable is set to the location of grub directory at the time of grub installation.
So, it is possible that grub couldn’t locate the normal.mod because the prefix variable is pointing to the wrong partition.
Then, we can set the prefix variable using set command.
Also, we need to set the root to the same partition as that of prefix . For eg
grub rescue> set root=(hd0,msdos1)
grub rescue> set prefix=(hd0,msdos1)/boot/grub
Now, since we have set the correct path to root and prefix, we can use the normal module now.
So for that we have to import the module. To import it, we would use insmod command.
grub rescue> insmod normal
grub rescue> normal
Now, the grub menu would be shown and you can enter into the system safely.
Case 2: ‘normal.mod’ is not present
Basically, the whole procedure is for the case when the require module is misplace.
But what if it isn’t present at all in any partition and somehow got delete.
So, try to find the module in each known partition but couldn’t locate it anywhere.
Now we have to do the work which normal module would’ve done if it would be present.
Therefore we have to find the kernel files and boot the system manually.
To boot the system we would require the kernel file which would be something like “vimlinuz-linux” and the file “initramfs-linux.img“.
The vimlinuz-linux is actually the kernel image which mounts the root partition on the hard-disk. The initramfs-linux.img loads the futhur required modules needed for booting of the system.
Firstly, locate these files in any of the known partitions.
So, we looked for these files under the /boot directory using the same ls command as:
grub rescue> ls (hd0,msdos2)/boot/
# some output
grub rescue> ls (hd0,msdos4)/boot/
# some output
Once we find the above mentioned files in the (hd0, msdos4) partition.
Now, we have to set the root to the partition which contains the kernel image using the set command so that it always points to the right location.
grub rescue> set root=(hd0,msdos4)
Next thing to be done is to run the kernel image.
So for that we need to import the linux module using the insmod command and also the initramfs-linux.img file using the initrd command:
grub rescue> insmod linux
grub rescue> linux /boot/vimlinuz-linux root=/dev/sda4
grub rescue> initrd /boot/initramfs-linux.img
And finally the boot command, which would boot the system(using the above files) and allow us to get into the system
grub rescue> boot
But yet the problem existed ie the normal module isn’t present.
In case if we would reboot the system, same error would’ve been shown and we have to repeat the same procedure.
So to resolve it we need to do the same thing which we did for the 1st case. Do you remember it? Yeah, we need to re-install the grub to repair the damaged or deleted files using the system terminal.
$ sudo grub-install /dev/sda
As soon as the installation successfully completed, we reboot the system to check if it actually work.
[Stuck in between? We’d be glad to assist you]
In short, today we saw steps followed by our Support Techs to fix this ubuntu error.