Wednesday, January 24, 2007

Dual boot Linux-Windows (Leaving MBR untouched)

Disclaimer: This document is provided "as is" without warranty. Use at your own risk. In no event shall I be liable for any damage resulting from the use of this work.

This HOWTO applies if:

  • Your machine already has Windows installed, and you are installing Linux as a second operating system, and
  • You want to leave the Windows boot loader (NTLDR) on the MBR (Master Boot Record). This allows you to continue to boot Windows with no issues. I've heard that Windows 2000/Windows XP or anti-virus software may complain if the MBR does not contain the Windows boot loader

You can use either GRUB or LILO to dual-boot Windows 2000/Windows XP and Linux. Both functionally work fine, but from what I've read, GRUB requires less maintenance, as LILO requires you to reinstall the boot loader (by running /sbin/lilo) every time you rebuild the kernel or make changes to /etc/lilo.conf.

Requirements for /boot Partition

The location of the /boot partition on the hard drive is critical so that you don't get screwed by the infamous BIOS 1024 cylinder limit. The BIOS of older systems can't access data beyond cylinder 1024, which is ~8.5 GB. A simple way to avoid the BIOS 1024 limit is to create /boot within the first 1024 cylinders (~8.5 GB) of the hard drive. If you have multiple hard drives (disks), /boot must be on the same hard drive (probably the first hard drive) that has the Windows boot loader (NTLDR) on the MBR.

Here are some options for where to create /boot partition.

  1. (What I did) Shrink the Windows partition such that there is 50 MB of unused disk space at the beginning of the drive and lots of space after the Windows partition. You can install the /boot Linux partition in this first 50 MB and avoid any potential issues with the 1024-cylinder limit entirely.
  2. Shrink the Windows partition such that it does not cross the 1024 cylinder (~8.5 GB), and install the /boot partition right after the Windows partition.
  3. Use LBA (Logical Block Addressing). LBA allows you to boot beyond the 1024 cylinder. In order to use LBA, your BIOS must support it. In addition, for LILO, you must also add a flag to enable LBA support. GRUB supports LBA "out-of-the-box"

To non-destructively shrink the Windows partition, you can use the free software program fips (please note that fips does not currently support NTFS partitions). Another option is the excellent commercial product Partition Magic. It has an easy-to-use GUI. Unfortunately, the tool that comes with Red Hat 7.2, Disk Druid, does not have the ability to shrink existing partitions. Once you've shrunk the Windows partition, you can use Disk Druid during the Red Hat Installation to create all the partitions you need for Linux.

Dual-Boot Setup

Following are the steps to get dual-boot working with GRUB; I figured out how to do this by looking at a similar procedure for LILO. I've verified that this works for Windows 2000 and Windows XP, and this should work on Windows NT (all 3 OSs use the same booting architecture).

  1. Install GRUB on the first sector of the /boot partition. DO NOT INSTALL IT ON THE MBR!.
    If you are performing the Red Hat installation, for the "Boot Loader Installation" screen:
    • Select "Use GRUB as the boot loader"
    • Select Install Boot Loader record on "...First sector of boot partition".
    • After finishing the Red Hat installation, reboot into Linux. If you don't have a boot disk, try booting in linux rescue mode
    If you already have Linux installed:
    • Run the following command (e.g. assuming /boot is /dev/hda2): grub-install /dev/hda2.
      If you don't know which partition contains /boot, run the df command and check the output.
    • Edit /etc/grub.conf and make sure there is an entry for your version of Windows. For reference, here is a copy of my /etc/grub.conf file.
  2. Determine which partition contains the /boot partition by running the df command. You'll see output like this:
    Filesystem           1k-blocks      Used Available Use% Mounted on
    /dev/hda3 8665372 1639580 6585612 20% /
    /dev/hda2 46636 5959 38269 14% /boot
    /dev/hda6 513776 189504 324272 37% /osshare
    none 256624 0 256624 0% /dev/shm
    From this output, we see that /boot is on /dev/hda2.
  3. Make a copy of the Linux boot sector onto a floppy or onto a FAT32 partition. We'll name this copy linux.bin.
    To make a copy onto a floppy:
    • Mount the floppy drive if it's not mounted (assumes /mnt/floppy exists): mount -t msdos /dev/fd0 /mnt/floppy
    • Run the following command: dd if=/dev/hda2 of=/mnt/floppy/linux.bin bs=512 count=1
      Substitute the path for the if= parameter (the input file) with the appropriate partition from the previous step. E.g., set if= to /dev/hda2.
    To make a copy onto a FAT32 (vfat) partition:
    • Mount the FAT32 partition if it's not mounted yet. If it isn't listed in the df output, it hasn't been mounted yet. Check out steps 3a-3c for mounting a FAT32 partition on the "Share Partitions HOWTO".
    • Run the following command: dd if=/dev/hda2 of=/osshare/linux.bin bs=512 count=1
      Substitute the path for the if= parameter (the input file) with the appropriate partition from the previous step. E.g., set if= to /dev/hda2. Substitute the path for the of= parameter (the output file) with whatever is appropriate for your system. The example here (of=/osshare/linux.bin) is for copying onto a FAT32 partition called osshare.
  4. Reboot into Windows
  5. Copy the linux.bin file to C:\
  6. Run notepad and edit C:\boot.ini. Note that C:\boot.ini is a hidden system file, so it probably won't show up in Windows Explorer. To edit the file, try: Start->Run and enter: notepad C:\boot.ini. Add the following line at the end: c:\linux.bin="Linux"
    If your C: filesystem is NTFS (not FAT32), you must edit C:\boot.ini as a user with administrator-level privileges.
    To make C:\boot.ini writable, you can either :
    • Use Explorer:
      • Go to Tools->Folder Options->View and select Show hidden files and folders and deselect Hide protected operating system files (Recommended).
      • Right-click on the file, view the Properties and uncheck Read-only. You can now edit the file.
      • After editing the file, restore the settings to their original state.
    • Use the command-line:
      • Make the file writable: attrib -R -S -H C:\boot.ini.
      • After you've finished editing the file, put the settings back: attrib +R +S +H C:\boot.ini
    For reference, here is a copy of my boot.ini file.
  7. Reboot again. You should be able to pick either Windows or Linux. Selecting Linux will start GRUB

Troubleshooting

  • When I select Linux from the boot menu, I get a frozen "GRUB" (or an "L" in the case of LILO)
  • Make sure you created the linux.bin file correctly with the dd command. If you think you ran the command correctly, the problem may be that your /boot partition is beyond cylinder 1024 and your BIOS can't reach it. At system startup, the Windows boot loader lists the choices from boot.ini. When you select Linux, the boot loader then loads the 512-byte linux.bin file, and then BIOS tries to access the /boot partition to run GRUB. Some BIOS implementations can only address the first 1024 cylinders of a hard drive, which corresponds to ~8.5 GB. How do you fix this? Create your /boot partition before cylinder 1024; i.e. before ~8.5 GB.
  • If I select Linux from the boot menu, I get an error message that says "Windows XP could not load: The file hal.dll (windows/system32/) is missing or corrupt. Please reinstall.
  • This is usually caused by an error in the boot.ini file. If you are unable to find and fix the error, check out Kelly Theriot's page that provides various methods for addressing the problem.

Acknowledgments

  • Jimmy Andriambao: for recommending the link regarding hal.dll problems
  • Leif Roger Kolberg: for creating a Norwegian translation of this page
  • Dirk Goepfert: for creating a German translation of this page
  • Fred van Lieshout: for creating a Dutch translation of this page
  • Rostislav "Udo" Galicek: for creating a Czech translation of this page
  • Arun Swami: for validating the dual-boot setup with multiple hard drives. Thanks Arun!
  • Adrián I. Correa: for enthusiastically providing a Spanish translation of this page. Adrián said it best: "I love this wonder called The Internet!"
  • Devesh Mistry: for pointing out the use of chroot /mnt/sys/mnt/syimage when in linux rescue mode
  • Emmanuel Brun: for graciously providing a French translation of this page
  • Jason Noll: for reporting the hal.dll problem resulting from error(s) in boot.ini
  • Garth Patil: for helping to troubleshoot why GRUB was freezing and having a great sense of humor
  • Piete Brooks: for pointing out that editing C:\boot.ini requires administrator-level privileges and providing the content for making the file editable using Explorer
  • Paul Feehan: for providing the commands to make C:\boot.ini editable for Windows XP
  • Jan Holm Jensen: for reporting that C:\boot.ini is a hidden system file
  • Hampus Hedberg Hankell: for the following suggestion:
    I think you should add help for users in despair that already have installed grub on mbr ,thus loosing the their ability to boot into windows xp. Procedure for this is ,boot from a windows start disc and do a fdisk /mbr At least then they can reach their windows and this time doing it right
  • Mark Jordan: for verifying that this works on Windows XP and suggesting the content for copy to floppy
  • Darryl Eaton: for introducting me to Red Hat Linux

If you are interested in creating a translation of this page, please read the translation policy.