j a e g e r . m o r p h e u s . n e t

How to dual-boot Windows NT/2000/XP and Linux using NTLDR

This tutorial is several years old. I no longer support it but I leave it here because I still get a lot of requests for it.

This tutorial is based on using LILO (linux loader) as your boot loader. It assumes you already have NT/2000/XP install and booting.

At the time of this writing, I was booting Linux, WindowsNT, and DOS 6.22 at home, and Linux, WindowsNT, and DR-OpenDOS 7.02 at work. It was pretty annoying, to me at least, to have the LILO prompt come up, type 'dos', and THEN have to select an option from the NTLDR menu which would pop up afterwards. I liked the menu presentation that NT gave at the time, so I chose to use NTLDR to boot them all from one selection. The only apparent disadvantage to this setup is that you need to update the linux boot image in the NTLDR when you install a new kernel. However, I don't imagine most average users switch kernels all that often, and those of you that do won't mind doing this, or already have a better solution in mind/in place.

That said, if you need/want this, read on. If not, skip it. :)

The first step in the process is to remove the current installation of LILO from the Master Boot Record (MBR), if you're already using it. If not, ignore this part. To accomplish this, type 'lilo -u <boot device>'. On my machine, this was /dev/hda, which corresponds to the MBR of the first detected hard drive. If all goes well, LILO will be uninstalled. DO NOT REBOOT at this point, your system will be inaccessible without a boot disk or CD.

The next step is to edit your LILO configuration file. It's usually /etc/lilo.conf. If lilo was installed in the MBR, the lilo.conf will reflect this. There are a couple changes to be made. Here is an example lilo.conf file:

This lilo.conf file is configured so that the boot device is /dev/hda. That's the MBR on the first detected hard drive. So we want to change that to be the linux root partition, which NTLDR will load up for us, instead of LILO loading the NTLDR. In my case, this is /dev/hdb1, the first partition of the second hard drive. Next, since NTLDR will be handling the booting, LILO doesn't need to know anything about the WindowsNT or DOS installs, nor how to boot them, so take out or comment out the prompt, timeout and other sections. It should now look like this:

By commenting out prompt, we tell LILO not to ask which selection to boot, it just picks the first one it sees, which is our linux kernel. The timeout option is only needed in conjunction with prompt, so that goes, too. The other section is what LILO normally would use to pass us off to the NTLDR, and now it won't bother.

The next thing to do is install LILO. This time, we want it on our linux root partition, instead of in the MBR. Since we've edited lilo.conf to specify the correct location already, all that's necessary is to run lilo. It may complain that lilo isn't being installed on the first drive, but since there will be a boot loader there (NTLDR), that's ok, and we can safely ignore the warning. Once this is done, keep reading, linux isn't quite bootable yet.

LILO is now installed on our linux root partition, but there's still nothing pointing it to linux. To get around this, we create a boot sector image file or sorts for the NTLDR to look at to boot linux. The way we do this is to use the dd program (copy/convert utility). The syntax we're looking for is: 'dd if=<root partition> of=<boot pointer file> bs=512 count=1'. This is a little more complicated than the bootdisk dd usage. <root partition> is of course your linux root partition, /dev/hdb1 in this case. <boot pointer file> is a file that will contain the boot sector image that NTLDR uses to boot linux. It's a physical copy of the first 512 bytes of the linux root partition, where LILO is now installed. Making sense now? :) bs=512 sets the block size to 512 bytes, and count=1 ensures that we only get one block in the image. I used: 'dd if=/dev/hdb1 of=bootsect.lnx bs=512 count=1'. You should now have a file called bootsect.lnx (which, if you're using WindowsNT and DOS, needs to be in DOS 8.3 filename format, which bootsect.lnx fits in.

The bootsect.lnx file is basically your linux boot sector. It will go on the NT/2000/XP partition, and be loaded by NTLDR. To add this to your NTLDR menu, you only need to edit the boot.ini file located in your Windows root directory (usually c:\.) Here's a sample boot.ini:

To add the bootsect.lnx file we created to the NTLDR configuration file, simply add a line that looks like this, reflecting your own decription:

Once you've edited the boot.ini and saved it, you should be good to go. When you reboot the machine, the NTLDR menu has a new option at the bottom, "Red Hat Linux Release 4.2 (Biltmore)" in this case. Select it, hit enter, and linux boots.

If you want linux to be your default choice, just change the default line to: default=C:\bootsect.lnx.

jaeger (jaeger.morpheus.net)

Valid XHTML 1.0! Valid CSS!