I bought my (Dell) notebook with Windows Vista preinstalled. Because some of my customers stay loyal to Windows XP and I prefer Linux for flexibility, I wanted to also install both of these OSes on the same disk, so as to have a choice of each operating system through the GRUB boot menu (Linux being the dominant OS and the other two secondary choices). This article contains a record of my installation with some warnings and explanations mixed in, unlike those "easy" HOWTOs that omit the gory details and leave you wanting if anything goes wrong in the process or your preconditions differ slightly.
First of all, it is important to note that the final configuration which I settled upon does not include all three OSes within a single GRUB boot menu. Instead, the menu contains two categories of items: Linux (one item per kernel configuration) and Windows (just one item for booting either Windows XP or Vista). The Windows menu item instructs GRUB to delegate control to Vista's own boot loader, which then offers a second choice between Vista and XP.
The entry for the Windows menu item in /boot/grub/menu.lst is trivial:
title Windows Vista/XP root (hd0,2) savedefault makeactive chainloader +1
The partition table in the final configuration looks as follows - (hd0,2) in GRUB-speak refers to /dev/sda3:
Device Boot Start End Blocks Id System /dev/sda1 1 23 184716 de Dell Utility /dev/sda2 24 1069 8401995 7 HPFS/NTFS /dev/sda3 * 1070 7494 51602432 7 HPFS/NTFS /dev/sda4 7495 29863 179678992+ 5 Extended /dev/sda5 * 7495 9925 19526976 83 Linux /dev/sda6 9926 10411 3903763+ 82 Linux swap / Solaris /dev/sda7 10412 29863 156248158+ 83 Linux
|/dev/sda1||"Diagnostics" partition; this is a small FAT16 partition preinstalled by Dell. It contains programs for testing memory etc.|
|/dev/sda2||The Windows XP partition; originally the same block range used to hold a ~10 GB "recovery" partition, which was apparently too small for Vista for its intended purpose.|
|/dev/sda3||The Windows Vista partition; originally it occupied the rest of disk and had to be shrunk to make room for Linux.|
|/dev/sda4||The extended partition which holds /dev/sda5, /dev/sda6, /dev/sda7. It is very important to create this partition because any disk can only hold 4 primary partitions. If you forget this little quirk, you will likely end up with large amounts of unpartitioned (that is, unusable) disk space.|
|/dev/sda5||The Linux boot/root partition.|
|/dev/sda6||The Linux swap partition.|
|/dev/sda7||The Linux "data" partition, which in my case holds an encrypted file system for /home and /usr/local (not quite relevant)|
The non-trivial part of the setup concerns the order of installation and the steps required to make both boot managers work correctly. The same approach might be used to install in a different order. The key piece of information to keep in mind is which step overwrites which boot records.
- Before installing anything, I made snapshots of the Master Boot Record (/dev/sda) as well as of each partition's initial sectors using a Knoppix CD. After booting from the CD, I issued commands like
dd if=/dev/sda1 of=/path/to/sda1/backup/file bs=512 count=32for each partition and the main MBR. To store the backup files, I used the /dev/sda1 "diagnostics" partition. A USB stick could be used just as well. I heuristically chose to back up the first 32 sectors of each partition, not being sure how many of them really need to be protected. This number has later turned out sufficient.
- I began by resizing Vista's own partition using Vista's disk management tool. It didn't allow me to go below 50 GB. I used the same tool to delete the /dev/sda2 "recovery" partition in order to create a gap for installing Windows XP. (By the way, an attempt to use the Partition Magic tool to scale down Windows XP below 40 GB and move it to the beginning of disk resulted in an unbootable system; now I believe PM can't deal at all with Vista.)
- I installed Windows XP, creating a new partition for it during the installation process. Actually, I had to first create a custom Windows XP installation CD based on the original one, in order to include some missing SATA disk drivers. The Windows XP installer did not just alter the MBR, but it also overwrote the beginning of the Vista's /dev/sda3 partition. Accordingly, I was unable to boot Vista after this step (instead Windows XP booted itself).
- Using the Knoppix CD, I created another set of boot sector backup files (just in case; those were not used later on).
- I proceeded to install Linux (Debian), taking care to use the "expert mode" to create an extended partition. (It later turned out that fdisk is too dumb to expand this partition in order to accommodate new logical partitions; I recommend cfdisk instead.)
- At this point, I had a configuration which booted Linux, and (if I recall correctly) Windows XP, based on an entry in GRUB's menu.lst created by the installer - the same entry I pasted in the beginning of this post.
- Having booted into Linux, I created another set of boot sector backup files (again, just in case).
- The really interesting part begins now. To "revive" Vista's boot loader, I restored with dd the 16KB backup of Vista's partition I made in Step 1. This left me being able to boot Linux and Vista, but not Windows XP. (It is noteworthy that partition numbering changes when you delete a partition. For example, /dev/sda1, /dev/sda2, /dev/sda3 became /dev/sda1, /dev/sda2 after deleting the "recovery" /dev/sda2 partition. The original ordering was restored after installing Windows XP into /dev/sda2, though.)
- In Vista, I installed the free EasyBCD tool, which lets you edit Vista's own boot loader entries. Here I added a "Windows XP" menu entry and pointed it to the partition with Windows XP (which is called D: from Vista's own perspective).
- At this stage, my attempts to boot into Windows XP using Vista's boot loader failed with an error message about missing NTLDR. To fix this, following advice from the EasyBCD forum, I booted into Vista and copied c:\ntldr.dll to Windows XP's d:\ntldr.dll (where it was, in fact, missing). In order to see the file c:\ntldr.dll in Vista, I had to tweak some settings regarding displaying hidden and system files.
Having completed all of the above steps, I was able to boot all three OSes - Linux directly using GRUB, and the two versions of Windows by redirecting GRUB into Vista's boot loader. It might not be the nicest possible configuration (requires a few extra key strokes during the boot process), but it works.