GRUB2 Migration

From Gentoo Wiki
Revision as of 10:52, 8 March 2014 by Fturco (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Other languages:česky 100% • ‎English 100% • ‎français 98% • ‎日本語 100% • ‎한국어 100% • ‎русский 100%

The goal of this guide is to provide you with a smooth migration from GRUB Legacy to GRUB2.

Background

What's Grub?

Grub is one of the most commonly found boot loaders in use on non-embedded Linux machines. The role of GRUB is to facilitate the Linux kernel being loaded from your disk into memory and start executing the Linux kernel.

So Why Migrate?

Firstly, GRUB Legacy is no longer maintained and as such no longer receives updates. GRUB Legacy was created at a time when the developers felt safe in making several assumptions which no longer hold true today. For example, GRUB Legacy is unable to boot from disks larger than 2 TB and assumes that newer filesystems wouldn't come to replace /boot.

GRUB2 aims to be more robust, more portable, more powerful and is maintained with a cleaner code base. GRUB2 supports more hardware configurations, more filesystems and more drive layouts than its predecessor.

Migration to GRUB2

Migration to GRUB2 is fairly straightforward: it will be pulled in as part of your regular upgrade process by your package manager. If it is not pulled in automatically, you can always install sys-boot/grub:2.

Boot Drive

The first important part is to understand what your bootable drive is. For many people it will be /dev/sda. The easiest way to find this is to look at how your existing GRUB Legacy is setup by viewing /boot/grub/grub.conf. An example one is provided below.

Note
You must have your /boot mounted to be able to view these files. It should be as simple as mount /boot to mount /boot.
File/boot/grub/grub.conf

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  
title Gentoo Linux 3.2.12
root (hd0,0)
kernel /boot/kernel-3.2.12-gentoo root=/dev/sda3 quiet dolvm
initrd /boot/initramfs-genkernel-x86_64-3.2.12-gentoo

Based on the above file we know that (hd0) is the boot drive but we must map this to a real device. To know this you must view /boot/grub/device.map. An example one is provided below.

File/boot/grub/device.map

(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
Note
If you suspect that /boot/grub/device.map is not accurate, you can run grub-install --recheck /dev/sda to recreate the file.

Based on the above file we know that /dev/sda is the boot drive.

Installing and Configuring GRUB2

The next step is to install and configure GRUB2 on your /boot partition without removing GRUB Legacy from your MBR. The example below uses /dev/sda but you must replace it with your boot drive path. The first step installs the necessary GRUB2 files to /boot/grub, while the second step scans your available kernels and generates a suitable config file to /boot/grub/grub.cfg. Skip the second step when using a Manual Configuration.

Warning
GRUB 2 uses the configuration file /boot/grub/grub.cfg whereas GRUB Legacy used /boot/grub/grub.conf so please make sure you don't use the old file by mistake, e.g. by using tab-completion if the old file is still there.
root # grub2-install --grub-setup=/bin/true /dev/sda
Installation finished. No error reported.
root # grub2-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done
Note
grub2-mkconfig has strict naming requirements for kernels and initramfs images. A kernel must be named kernel-${version} or vmlinuz-${version} while an initramfs must be named initramfs-${version}.img, initramfs-genkernel-${version}, initramfs-genkernel-${arch}-${version}, initrd-${version}.img, initrd.img-${version}, initrd-${version}.gz, or initrd-${version}. Together with ${version}, the filename must match a corresponding kernel that is available in /boot.

Chainloading GRUB2 from GRUB Legacy to test the setup

Because a broken GRUB configuration could mean an unbootable system, we want to test our GRUB2 configuration before making it permanent. To do this we will chainload GRUB2 from GRUB Legacy. This is done by adding a new section into /boot/grub/grub.conf. An example is shown below.

Note
Be aware that your root may be different from (hd0,0) used in the example, and make sure you reuse the same root value from your /boot/grub/grub.conf.
File/boot/grub/grub.conf

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  
title GRUB2 Chainload
root (hd0,0)
kernel /boot/grub/i386-pc/core.img
boot
  
title Gentoo Linux 3.2.12
root (hd0,0)
kernel /boot/kernel-3.2.12-gentoo root=/dev/sda3 quiet dolvm
initrd /boot/initramfs-genkernel-x86_64-3.2.12-gentoo

At this point you should reboot your machine and select GRUB2 Chainload from the GRUB menu when your machine begins to boot. You will be presented with another GRUB menu which should advertise itself as GRUB 2.0.0 or higher at the top and show your available kernel(s) to boot. Should this not work, simply reboot your system and pick your normal boot option instead of GRUB2 Chainload.

Replacing and removing GRUB Legacy

At this point, if everything worked successfully, you can replace GRUB Legacy and remove it from your system.

Note
Since you've rebooted your system, you may need to mount /boot again. Make sure to use your own boot drive path instead of /dev/sda.
root # grub2-install /dev/sda
Installation finished. No error reported.

At this point you can use your package manager to remove sys-boot/grub:0.

root # emerge -avC "=sys-boot/grub-0.97*"

The migration is complete.

Maintaining GRUB2

Whenever you install a new kernel, you must perform the next step so that your GRUB2 configuration recognizes the new kernel (unless you are using a manual configuration).

Note
You must have your /boot partition mounted for this step.
root # grub2-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/kernel-3.3.8-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.3.8-gentoo
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done

Acknowledgements

We would like to thank the following authors and editors for their contributions to this guide:


  • cardoe