Multiple Ubuntu Installations with Grub

I recently needed to configure a machine with multiple installations of Ubuntu Server 12.10. One way to go about doing this is to create a separate, small boot partition to store the configuration for an initial Grub boot menu. Each installed OS gets its own partition with its own bootloader configuration. The initial menu stored on the boot partition is used to chainload the bootloader files for whichever OS is selected.

This technique involves using Grub Legacy on the small boot partition to chainload to the Grub2 configuration on each of the OS partitions. I chose to go the route of installing Ubuntu (12.10 in my case) like normal, then removing Grub2, installing Grub Legacy temporarily, and finally reinstalling Grub2 again once the boot partition had been configured.

I ran into a couple of snags after getting to the Remove Grub 2 and install Grub Legacy part of the instructions, so I am going to duplicate the steps here and insert the couple of additional steps I ended up needing.

I used a different partition table, so the partitions in this version of the instructions will differ from the original. For reference:

Partition     Size    Type      File system     Flags
 /dev/sda1    100 MB  primary   ext3            boot
 /dev/sda2    4 GB    primary   ext4
 /dev/sda3    4 GB    primary   ext4

1. Install Ubuntu on the First Application Partition

I used an Ubuntu Server 12.10 32-bit installer USB drive to boot the machine and followed the installation instructions to install Ubuntu Server on the /dev/sda2 partition.

2. Backup the Grub2 Files, Uninstall Grub2, and Install Grub Legacy

  sudo mv /boot/grub /boot/grub2backup
  sudo mkdir /boot/grub
  sudo apt-get remove --purge grub-pc grub-common
  sudo apt-get install grub
  sudo update-grub

When asked if you would like /boot/grub/menu.lst generated for you, answer “y”.

The next step is something that I ended up needing to do, but it wasn’t in the documented steps.

  sudo grub-install /dev/sda

Without this step there are no stage files for the grub utility to find (needed in an upcoming step).

3. Copy Boot Files to the Small Grub Partition

  sudo mkdir /media/GRUBpartition
  sudo mount /dev/sda1 -t ext3 /media/GRUBpartition
  sudo mkdir /media/GRUBpartition/boot
  sudo mkdir /media/GRUBpartition/boot/grub
  sudo chmod 777 /media/GRUBpartition/boot/grub
  sudo cp -r /boot/grub/* /media/GRUBpartition/boot/grub

Next edit the menu.lst and add an entry for each partition that holds (or will hold) an OS.

  sudo vim /media/GRUBpartition/boot/grub/menu.lst
  ## ## End Default Options ##
  title  First Ubuntu OS (chainloader)
  rootnoverify   (hd0,1)
  chainloader	+1
  
  title  Second Ubuntu OS (chainloader)
  rootnoverify   (hd0,2)
  chainloader	+1

Be sure to note (as explained in the referenced instructions) that (hd0,1) maps to /dev/sda2 and (hd0,2) maps to /dev/sda3.

Finally fix the permissions on the Grub partition.

  sudo chmod 744 /media/GRUBpartition/boot/grub
  sudo chmod 744 /media/GRUBpartition/boot/grub/*

4. Reinstall Grub to MBR

Now that the Grub configuration files have been copied to the boot partition, you need to tell the Master Boot Record to look for the files there.

  sudo grub
  grub> find /boot/grub/stage1
   (hd0,0)
   (hd0,1)
  grub> root (hd0,0)
  grub> setup (hd0)
  grub> quit

Reinstall Grub2 in the OS Partition.

  sudo mv /boot/grub /boot/grublegacybackup
  sudo apt-get remove --purge grub grub-common
  sudo apt-get install grub-pc

Be sure to check the box for the specific partition only, not for the entire drive. In my case this was /dev/sda2.

5. Display Grub2 Menu

At this point, you can reboot the machine, and you should see the Grub Legacy menu with the two options put in the menu.lst file above. If you select the first option, the OS will boot straight away.

I had expected to see the Grub2 menu after making the selection on the Grub Legacy menu. Some searching showed that my expectation was not unwarranted (see the Chainloading GRUB2 from GRUB Legacy to test the setup section of this GRUB2 migration from GRUB Legacy page).

I eventually realized that the default Grub2 menu was configured to be hidden by default, and this applied even when the menu was chainloaded from a Grub Legacy menu. To change this, edit the /etc/default/grub file and comment out the following line:

  GRUB_HIDDEN_TIMEOUT=0

After saving the file, update the configuration:

  sudo update-grub