Grub: Difference between revisions

From miki
Jump to navigation Jump to search
Line 105: Line 105:
<source lang="bash">
<source lang="bash">
sudo mount /dev/sd6 /mnt/myroot
sudo mount /dev/sd6 /mnt/myroot
sudo grub-install --root-directory=/media/myroot /dev/sda
sudo grub-install --root-directory=/mnt/myroot /dev/sda
#reboot
#reboot
sudo update-grub2 # Optional - in case entry are missing from the grub2 menu
sudo update-grub2 # Optional - in case entry are missing from the grub2 menu
Line 113: Line 113:
<source lang="bash">
<source lang="bash">
sudo mount /dev/sd6 /mnt/myroot
sudo mount /dev/sd6 /mnt/myroot
sudo mount --bind /dev/ /media/myroot/dev
sudo mount --bind /dev/ /mnt/myroot/dev
sudo chroot /media/myroot
sudo chroot /mnt/myroot
sudo grub-install /dev/sda
sudo grub-install /dev/sda
sudo grub-install --recheck /dev/sda
sudo grub-install --recheck /dev/sda

Revision as of 21:59, 15 January 2011

Documentation

  • Official manual here.

Grub Command-Line

Boot a LINUX partition

Use the following procedures to boot manually from the command-line:

root (hd0,6)                         # Select partition where /boot is. Type "root (hd0," and then TAB to get a list of partitions
linux /boot/linux                    # ... or kernel /boot/linux for GRUB 1
initrd /boot/initrd.gz
boot

Boot a CDROM / Windows

When booting on HDD, it is possible to tell Grub to boot from CDROM instead. The same command-set can be used to boot the Windows partition (in case it has been removed from Grub menu)

  • Press esc to quit Grub GUI menu.
  • Press c to go to command-line mode.
  • Enter the following commands (assuming CDROM is on hd2 / Windows is on hd0). Note that Grub uses hd0,hd1... not /dev/sda...):
grub>rootnoverify (hd2)             #or (hd0,0) for Windows partition
grub>chainloader +1
grub>boot

Note that this might be actually a hack that only works on my machine. More information:

Grubonce

grubonce is an handy tool to force the system to immediately boot a given grub entry at the next reboot.

By default, grubonce can only be run by root, but we can use sudo to allow any user to use grubonce. Make the following change to the /etc/sudoers file (use command visudo to edit this file):

Defaults        env_keep = "DISPLAY ..."             # add DISPLAY env var to the list of kept var
ALL     ALL = (ALL) NOPASSWD: /usr/sbin/grubonce

Now, you can reboot immediately a grub entry with:

$ sudo grubonce
# 0: openSUSE 11.0 - 2.6.25.20-0.1
# 1: Failsafe -- openSUSE 11.0 - 2.6.25.20-0.1
# 2: windows
# 3: Floppy
$ sudo grubonce 2

Rescue

Some tips on how to restore / troubleshoot a GRUB installation or on how to use GRUB to fix a broken Linux installation.

Using GRUB to boot minimal Bash shell

  1. Press ESC when GRUB menu appears. If menu does not appear, press SHIFT while booting to force GRUB showing the menu.
  2. Select any line and press e for Edit.
  3. Edit the second line (the one that has 'kernel' at the beginning):
    • replace ro with rw so you can read and write in the file-system
    • add init=/bin/bash at the end of the line
  4. Press Enter to save the line
  5. Press b to boot.
  6. Now, you can edit any file with
nano <filename>

Using the GRUB Rescue shell

See the manual at [1].

Grub only offers a rescue shell if for some reason it failed to load the normal module (error: no such partition / grub rescue>). The reason could be for instance that the /boot partition moved. From the manual:

# Inspect the current prefix (and other preset variables):
set
# Set to the correct value, which might be something like this:
set prefix=(hd0,1)/grub
set root=(hd0,1)
insmod normal
normal

Reinstalling GRUB 1

To repair a broken / lost GRUB, do from any grub prompt (live CD...) [2]:

grub> find /boot/grub/stage1
# find /boot/grub/stage1
#  (hd0,4)
grub> root (hd0,4)
# root (hd0,4)
#  Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
# setup (hd0)
#  Checking if "/boot/grub/stage1" exists... yes
#  Checking if "/boot/grub/stage2" exists... yes
#  Checking if "/boot/grub/e2fs_stage1_5" exists... yes
#  Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  23 sectors are embedded.
# succeeded
#  Running "install /boot/grub/stage1 (hd0) (hd0)1+23 p (hd0,4)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
  • try find /grub/stage1 if the first find command doesn't work
  • In my example I set root to (hd0,4) make sure you set it to whatever the find command returns
  • Always run 'setup (hd0)' to install grub on the MBR of the first drive. For second drive use (hd1) etc

Reinstalling GRUB 2

Here the procedure in the case of GRUB 2. Let's assume the boot partition is on dev/sda6 (use sfdisk to know) (see [3]).

sudo mount /dev/sd6 /mnt/myroot
sudo grub-install --root-directory=/mnt/myroot /dev/sda
#reboot
sudo update-grub2                       # Optional - in case entry are missing from the grub2 menu

Another solution involve chrooting to the mounted media ([4]). But this method does not work if the current linux architecture (32-bit/64-bit) does not match the architecture of the target (because chroot will re-run the current shell from target and the architecture must match):

sudo mount /dev/sd6 /mnt/myroot
sudo mount --bind /dev/ /mnt/myroot/dev
sudo chroot /mnt/myroot
sudo grub-install /dev/sda
sudo grub-install --recheck /dev/sda
sudo exit