
Dual-Boot Linux and
Windows 2000/Windows XP with GRUB
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.
- (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.
- 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.
- 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).
- 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:
- 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.
- 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:
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.
- 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.
- Reboot into Windows
- Copy the
linux.bin file to
C:\
- 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
- 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.