Hacking /boot/grub/grub.cfg is not usually the first thing that comes to mind. But, I ran into a problem when installing Kali Linux on a plug in USB Hard Drive. I wanted to try to put it on a USB hard drive by using the USB boot stick. All went well with the install. On reboot, guess what, the USB stick and it’s multiple partitions was no longer “parked” on /dev/sdc-sdg and when Kali had installed it thought it was going to be at /dev/sdh. Pulling the USB stick put the USB Hard Drive at /dev/sdc on the next boot! So naturally when grub wanted to boot the machine it drops to a command prompt after it times out trying to find where root is on /dev/sdh which has disappeared. When this happened, I puzzled on it for a few minutes before digging into grub.cfg, it was not my first thought, but it was the only thing that I could think of that could doing this.
When the machine can boot and drops to the basic command line find out what drives it thinks it has by running…
…this will show all the sda2,sdb3 and etc. Usually but not always the 2nd partition is the Linux File System, this is where the /boot directory lives with all of the GRUB files. Using a USB Stick with a live install or the DVD and booting is helpful at this point as you can use sudo fdisk -l to list what drives are available and you will need to use and editor to modify the grub.cfg file.
The hack is to reboot the machine either with the USB stick/Live DVD or off of the hard drive resident in the machine and then….
chmod 644 /boot/grub/grub.cfg
…as it is read only…
-r--r--r-- 1 root root 14791 Jan 7 16:29 /boot/grub/grub.cfg
…remember to chmod it back to read only after editing using….
chmod 444 /boot/grub/grub.cfg
Make a backup copy of it first before editing!
Once you have it in read/write state open it in an editor, emacs or something, even nano would work.
Yes it complains not to edit it, but when you can’t boot at all, because it can’t find where the root is, it’s worth a try!
# # DO NOT EDIT THIS FILE # # It is automatically generated by grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub #
In a terminal window find out where the drive is really mapped using…
sudo fdisk -l
Example of second bootable disk at /dev/sdb…
Disk /dev/sdb: 149 GiB, 160000000000 bytes, 312500000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0007e21b Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 279187455 279185408 133.1G 83 Linux /dev/sdb2 279189502 312498175 33308674 15.9G 5 Extended /dev/sdb5 279189504 312498175 33308672 15.9G 82 Linux swap / Solaris
The trick is to make the lines for the drive the OS is on that you are trying to boot and that is failing line up in grub.cfg. In grub.cfg search for lines like this…
If it says hd0 it better be the sda drive for instance. In my case it showed hd7=sdh and I needed to edit hd7 to hd2. This was done via a search and replace.
Also for good measure and to keep all the commenting straight correct anything by searching around for /dev/sd and make sure all the menuentrys line up with the hd* values in set root. This is just so that you don’t get confused later if set root is changed and the menus don’t line up with reality.
menuentry 'Linux Mint 17.3 Xfce 64-bit, with Linux 3.19.0-32-generic (on /dev/sdb1)
After this correction, it booted fine. Now I will just have to pay attention to what happens with drive mapping in case I plug it into another machine. But, it is just an experiment for now, nothing critical on the drive so no worries!
Another note on Boot Repair
If grub gets totally screwed somehow, boot-repair will fix it.
For instance I once had grub lose it’s brains on an EFI boot drive. The symptom was the error about not finding a bootable medium from the BIOS. Use boot-repair. Boot using a live CD or usb stick with exact same version as you are trying to fix! Run the repair and let it automatically fix it.
sudo add-apt-repository ppa:yannubuntu/boot-repair sudo apt-get update sudo apt-get install -y boot-repair && boot-repair
Fix for Linux boot failure and grub rescue prompt following a normal system update
Introduction to fstab