Here is the difference between GRUB and LILO.
GRUB performs filesystem interpretation at boot time so the information in the configuration file has to reflect the way GRUB will see things at boot time.
LILO performs filesystem interpretation at install time (when you run the lilo command). Everything that you tell LILO about file paths has to be from the perspective of the currently booted system.
To boot from a second operating system you first have to mount that operating system's filesystem. The currently booted system has to be able to understand the filesystem (have that filesystem in the kernel or a loaded module). Suppose you mounted the Fedora system on /mnt/fedora.
mount -t ext3 /dev/hdb8 /mnt/fedora
To install lilo and boot that operating system you would use this entry for "lilo.conf".
image = /mnt/fedora/boot/vmlinuz-2.6.18-1.2798.fc6xen
root = /dev/hdb8
label = FedoraCore6
Here is the confusing thing. The "root =" option is passed to Linux at boot time, and should be from the perspective of the system being booted, not the currently booted system. LILO doesn't actually use the information from "root =" to find the kernel.
LILO finds the location of the kernel by checking which filesystem contains the "image =" file and where that is mounted. LILO uses that information to find the correct BIOS drive ID for the drive to put in the boot sector information used to load the kernel. It doesn't matter if the device name is different between the two operating systems (installing LILO versus being booted). LILO uses the BIOS to load the kernel and so it uses a drive ID not a Linux device name.
So the "image =" line should always be based on the system installing lilo (where the lilo command is used). Whatever file you refer to in that line also has to be accessible (EG on a mounted filesystem).
A nicety that I've seen some people use is to put two backslashes where the "real" root will be at boot time.
image = /mnt/fedora//boot/vmlinuz-2.6.18-1.2798.fc6xen
In some cases LILO doesn't correctly determine the BIOS drive ID. In that case you have to specify the correct BIOS drive ID for the disk device used to access the image while installing lilo. The system that you are booting may use a completely different disk device name, which is not important (except in root=).
disk = /dev/hdc bios=0x80
root = /dev/hda
In the above example, the second OS to be booted is currently mounted on device "/dev/hdc" which probably has BIOS drive ID 0x82 at the moment. When the second OS is actually booted, the BIOS drive ID for that disk will be 0x80. The operating system being booted will see that disk drive as device "/dev/hda". This is a possible scenario when you swap the Primary and Secondary controller IDE controller addresses to choose which one is booted.
The "disk =" line is confusing because the device name is from the perspective of what is booted NOW. And the BIOS ID is from the perspective of what will be booted LATER. The other options either apply entirely to NOW (image=) or entirely to LATER (root=).
I prefer to use GRUB mainly because I like to create a boot sector file for Windows XP and don't want to change it every time I change my boot configuration. I also find GRUB less confusing because it reads the configuration file at boot time, not at install time.