What is the lilo?

A boot loader is a program that loads and starts the operating system on a computer. The most popular boot loader for Linux is lilo.

When you turn on a computer, the bios goes though some diagnostic and configuration tests (called posting). The next thing it does is look at the master boot record (MBR) and runs whatever program is loaded there. In our case, it will find and run lilo.

lilo is highly configurable and can load any operating system. Many people have a `dual boot' system, which is a system that can boot more than one operating system, like Linux and Windows. Some operating systems like Windows NT, 2000 and XP have "issues" if their own boot loader isn't located in the MBR, but lilo can circumvent that too.

When lilo first runs

lilo has a few interfaces, which I discuss further down this document. I discuss the "text interface" here. When you switch on the computer and wait for a moment, you'll see:

   LILO:

that's lilo's prompt. It's waiting for you to enter something. You have a number of options:

Configuring lilo

Most of lilo's functionality can be set by editing its default configuration file, which is /etc/lilo.conf. After editing the configuration file, you'll need to run lilo to actually make the changes. Simply type lilo (lilo is located in /sbin). If your changes all make sense and there's nothing obviously wrong, you'll see a message that looks something like:

	Added vmlinux-2.2.14 *
	Added vmlinuz-2.2.14-alt
	Added vmlinux-2.2.13

The star means that vmlinux-2.2.14 is the default kernel. For security, you might want to make sure that /etc/lilo.conf has permissions of 600 and is owned by root with group of root. That is,

	# ll /etc/lilo.conf
	-rw-------   1 root     root          500 Jan 21 00:03 /etc/lilo.conf

If you make backups of important administrative files on your computer, /etc/lilo.conf is a good one to backup.

The basic /etc/lilo.conf file

There are two sections to the lilo.conf file, the global and local sections. The local section is further broken down into subsections, one for each kernel residing on your hard drive.

Here's a sample of what a simple lilo.conf might look like:

   # Start lilo global Section
   #
   boot=/dev/hda
   linear
   compact
   read-only
   prompt
   timeout=100
   vga = normal    # force sane state
   
   # Start lilo local Section
   #
   image = /boot/vmlinuz-2.2.14
     root = /dev/hda1
     label = vmlinuz-2.2.14
   image = /boot/vmlinuz-2.2.13
     root = /dev/hda1
     label = vmlinuz-2.2.13

The first line specifies where lilo will be installed. In this case, LILO will be installed in the master boot record on the first IDE hard drive, also known as /dev/hda.

The second line of the global section (linear) means that lilo should switch the method by which it access the hard drive from sector/head/cylinder notation to linear sector number. This is necessary when your kernel resides outside the first 1024 cylinders of your hard drive. It's also necessary for for some PCI SCSI controllers. It is incompatible with floppy disks.

The 3rd line in the global section (compact) tells lilo to attempt read requests for adjacent sectors while loading. This can make booting off a floppy much faster, but won't really speed up booting off a hard drive.

The 4th line (read-only) tells lilo that the root file system should be mounted read-only. The system startup scripts will re-mount the root file system as read-write after fsck'ing it.

The 5th line tells lilo to prompt the user before loading any kernel or operating system. If it's not set, lilo will automatically load the default kernel. If prompt is set but timeout is not set, then unattended reboots will be impossible because lilo will wait forever for the user to enter something.

The last command of the global section (timeout=100) tells lilo how long to wait (in miliseconds) for the user to enter something before lilo loads the default kernel.

Now we begin talking about the local section of lilo.conf. There can be multiple subsections, and each subsection starts with either the image or other keywords. The first subsection will the default kernel. The image keyword tells lilo the full path and name of the kernel to be booted by that subsection.

lilo can handle multiple OS's, and different OS's will have different partitions on your hard drive. Even if we know the full pathname of the kernel to load, lilo needs to know which partition on the hard drive /boot/vmlinuz-2.2.14 lives in. That's what the root keyword tells lilo. For each subsection, root tells lilo which partition to mount as the root partition. So:

   image = /boot/vmlinuz-2.2.14
     root = /dev/hdb1
     label = vmlinuz-2.2.14

will look for /boot/vmlinuz-2.2.14 on the first partition of the 1st (slave) IDE hard drive and

   image = /boot/vmlinuz-2.2.13
     root = /dev/hdb2
     label = vmlinuz-2.2.13

will look for /boot/vmlinuz-2.2.13 on the second partition of the 1st (slave) IDE hard drive.

Lastly, the label keyword tells lilo what to name that subsection. This is the name listed by pressing <TAB> at the lilo prompt. This is the name you type at the lilo prompt to load that particular kernel. lilo will balk at you trying to name two different subsections with the same label.

lilo Interfaces

When you boot linux, there are a number of interfaces you can use. There's a menu interface, text interface and custom interface.

Menu InterfaceText interface Text interface after pressing <TAB>

I don't have an image for the custom interface, but a good example is Corel's wierd ultra-graphics type interface.

You can choose interface from the boot-* files in /boot.

   % ls /boot/boot-*
   /boot/boot-bmp.b  /boot/boot-compat.b  /boot/boot-menu.b  /boot/boot-text.b

These are boot sector images which lilo will write to your hard drive's master boot record (MBR), or the partition if you're installing lilo on a partition. They are all created by lilo, and contain the basic same information. The only difference is how lilo presents the information.

I've never tried the bmp or compat, but boot-menu.b is the menu interface and the boot-text.b is the text interface that you see in the pictures above. Which one you use is determined by the install directive in lilo.conf:

   install=/boot/boot.b

You can, for instance, put install=/boot/boot-menu.b in lilo.con if you want the menu interface. The usual way of doing things is to keep install=/boot/boot.b and simply make a symlink in /boot like:

   satan# ll /boot/boot.b 
   lrwxrwxrwx   1 root    root   11 Nov 30 09:17 /boot/boot.b -> boot-text.b

If you want a painless life, use the text interface. The menu interface looks nice, but it clears the screen. Unfortunately, as you can see from the pictures, this clears the screen which has important BIOS information like IRQ allotment and device listings. And NEVER use a graphics interface for lilo. It may look wonderful, but if you ever have problems with lilo, you're going to be one sorry person.


Operating Systems Other Than Linux

Here's what the a local subsection looks like for a machine with Windows on it:
   other = /dev/hda4
     label = win95
     table = /dev/hda

OS's other than Linux always begin with the other keyword, and this kind of serves the same purpose as the root keyword. In this example, Windows 95 is located on the fourth partition of the primary hard drive on IDE0. Label serves the same purpose as it did before. Table indicates where the partition table for the corresponding hard disk is located. This will always be Linux's name for the hard drive that holds the foreign OS, (ie- /dev/hda, /dev/hdb, /dev/hdc, /dev/sda, etc).


Password Protection

If you add a password to a subsection, a password will have to entered before the kernel boots. Using restricted will make lilo prompt for a password only if parameters are specified, like `single' to throw Linux into single user mode. Here's an example of a password protected subsection:

   image = /boot/vmlinuz-secret
     label = secret_kernel
     root = /dev/hda3
     password = mypassword
     restricted

Don't be fooled by the word "password". It's really not secure. A person with physical access to the computer can boot off a rescue disk and install their own lilo, without a password. Physical access to a computer is synonymous with being able to get root.


Error Messages

After editing /etc/lilo.conf and running lilo, there's a few error messages that you may see. These are not boot time errors; these are errors that occur when you run lilo.

Strategies For A Painless Life

  1. lilo must be run every time you recompile the kernel. If you can't remember whether you ran lilo, run it again. Running it twice can do no harm.
  2. The permissions for lilo.conf should be rw------- (600).
  3. Don't use a GUI frontend for lilo. Don't even use the menu interface. It can hide BIOS problems by clearing the screen before you get a chance to see them. Use the plain, ordinary text interface.
  4. Make sure lilo runs correctly before rebooting. And if there is a problem, always have a boot/rescue disk handy. Keep a backup of lilo.conf.