LILO: The Linux Loader

In addition to booting Linux, LILO can boot other operating systems, such as MS-DOS, Windows 95/98/ME, or any of the BSD systems. During installation, the major Linux distributions provide the opportunity to install LILO; it can also be installed later if necessary. LILO can be installed on the MBR of your hard drive or as a secondary boot loader on the Linux partition. LILO consists of several pieces, including the boot loader itself, a configuration file (/etc/lilo.conf), a map file (/boot/map) containing the location of the kernel, and the lilo command (/sbin/lilo), which reads the configuration file and uses the information to create or update the map file and to install the files LILO needs.

One thing to remember about LILO is that it has two aspects: the boot loader and the lilo command. The lilo command configures and installs the boot loader and updates it as necessary. The boot loader is the code that executes at system boot time and boots Linux or another operating system.

The LILO Configuration File

The lilo command reads the LILO configuration file, /etc/lilo.conf , to get the information it needs to install LILO. Among other things, it builds a map file containing the locations of all disk sectors needed for booting.

Note that any time you change /etc/lilo.conf or rebuild or move a kernel image, you need to rerun lilo to rebuild the map file and update LILO.

The configuration file starts with a section of global options, described in the next section. Global options are those that apply to every system boot, regardless of what operating system you are booting. Here is an example of a global section (a hash sign, #, begins a comment):

boot=/dev/hda           # The boot device is /dev/hda 
map=/boot/map           # Save the map file as /boot/map
install=/boot/boot.b    # The file to install as the new boot sector
prompt                  # Always display the boot prompt
timeout=30              # Set a 3-second (30 tenths of a second) timeout

Following the global section, there is one section of options for each Linux kernel and for each non-Linux operating system that you want LILO to be able to boot. Each of these sections is referred to as an image section because each boots a different kernel image (shorthand for a binary file containing a kernel) or another operating system. Each Linux image section begins with an image= line.

image=/boot/vmlinuz     # Linux image file
   label=linux          # Label that appears at the boot prompt
   root=/dev/hda2       # Location of the root filesystem
   vga=ask              # Always prompt the user for VGA mode
   read-only            # Mount read-only to run fsck for a filesystem check

The equivalent section for a non-Linux operating system begins with other= instead of image=. For example:

other=/dev/hda1         # Location of the partition
   label=win98
   table=/dev/hda       # Location of the partition table

Put LILO configuration options that apply to all images into the global section of /etc/lilo.conf, and options that apply to a particular image into the section for that image. If an option is specified in both the global section and an image section, the setting in the image section overrides the global setting for that image.

Here is an example of a complete /etc/lilo.conf file for a system that has the Linux partition on /dev/hda2:

## Global section
boot=/dev/hda2
map=/boot/map    
delay=30
timeout=50
prompt
vga=ask

## Image section: For regular Linux
image=/boot/vmlinuz
  label=linux
  root=/dev/hda2
  install=/boot/boot.b  
  map=/boot/map
  read-only             

## Image section: For testing a new Linux kernel
image=/testvmlinuz
  label=testlinux
  root=/dev/hda2
  install=/boot/boot.b
  map=/boot/map
  read-only 
  optional               # Omit image if not available when map is built

## Image section: For booting DOS
other=/dev/hda1
  label=dos
  loader=/boot/chain.b
  table=/dev/hda         # The current partition table

## Image section: For booting Windows 98
other=/dev/hda1
  label=win98
  loader=/boot/chain.b
  table=/dev/hda

Global options

In addition to the options listed here, the kernel options append, read-only, read-write, root, and vga (described later in Section 4.2.1.3) also can be set as global options.

backup= backup-file

Copy the original boot sector to backup-file instead of to /boot/boot.nnnn, where nnnn is a number that depends on the disk device type.

boot= boot-device

Set the name of the device that contains the boot sector. boot defaults to the device currently mounted as root, such as /dev/hda2. Specifying a device such as /dev/hda (without a number) indicates that LILO should be installed in the master boot record; the alternative is to set it up on a particular partition such as /dev/hda2.

change-rules

Begin a section that redefines partition types at boot time for hiding and unhiding partitions. See the LILO User’s Guide, which comes with the LILO distribution, for detailed information on using this option and creating a new rule set.

compact

Merge read requests for adjacent disk sectors to speed up booting. Use of compact is particularly recommended when booting from a floppy disk. Use of compact may conflict with linear.

default= name

Use the image name as the default boot image. If default is omitted, the first image specified in the configuration file is used.

delay= tsecs

Specify, in tenths of a second, how long the boot loader should wait before booting the default image. If serial is set, delay is set to a minimum of 20. The default is not to wait. See Section 4.7 at the end of this chapter for ways to get the boot prompt if no delay is set.

disk= device-name

Define parameters for the disk specified by device-name if LILO can’t figure them out. Normally, LILO can determine the disk parameters itself and this option isn’t needed. When disk is specified, it is followed by one or more parameter lines, such as:

disk=/dev/sda
  bios=0x80      # First disk is usually 0x80, second is usually 0x81
  sectors=...
  heads=...

Note that this option is not the same as the disk geometry parameters you can specify with the hd boot command-line option. With disk, the information is given to LILO; with hd, it is passed to the kernel. Note also that if either heads or sectors is specified, they must both be specified. The parameters that can be specified with disk are listed briefly here; they are described in detail in the LILO User’s Guide.

bios= bios-device-code

The number the BIOS uses to refer to the device. See the previous example.

cylinders= cylinders

The number of cylinders on the disk.

heads= heads

The number of heads on the disk.

inaccessible

Tell LILO that the BIOS can’t read the disk; used to prevent the system from becoming unbootable if LILO thinks the BIOS can read it. If this parameter is specified, it must be the only parameter.

partition= partition-device

Start a new section for a partition. The section contains one variable, start= partition-offset, which specifies the zero-based number of the first sector of the partition:

partition=/dev/sda1
  start=2048
sectors= sectors

The number of sectors per track.

disktab= disktab-file

This option has been superseded by the disk= option.

fix-table

If set, allow lilo to adjust 3D addresses (addresses specified as sector/head/cylinder) in partition tables. This is sometimes necessary if a partition isn’t track-aligned and another operating system such as MS-DOS is on the same disk. See the lilo.conf manpage for details.

force-backup= backup-file

Like backup, but overwrite an old backup copy if one exists.

ignore-table

Tell lilo to ignore corrupt partition tables.

install= boot-sector

Install the specified file as the new boot sector. If install is omitted, the boot sector defaults to /boot/boot.b.

lba32

Generate 32-bit Logical Block Addresses instead of sector/head/cylinder addresses, allowing booting from any partition on hard disks greater than 8.4 GB (i.e., remove the 1024-cylinder limit). Requires BIOS support for the EDD packet call interface[4] and at least LILO Version 21-4.

linear

Generate linear sector addresses, which do not depend on disk geometry, instead of 3D (sector/head/cylinder) addresses. If LILO can’t determine your disk’s geometry itself, you can try using linear; if that doesn’t work, then you need to specify the geometry with disk=. Note, however, that linear sometimes doesn’t work with floppy disks, and it may conflict with compact.

lock

Tell LILO to record the boot command line and use it as the default for future boots until it is overridden by a new boot command line. lock is useful if there are kernel options that you need to enter on the boot command line every time you boot the system.

map= map-file

Specify the location of the map file. Defaults to /boot/map.

message= message-file

Specify a file containing a message to be displayed before the boot prompt. The message can include a formfeed character (Ctrl-L) to clear the screen. The map file must be rebuilt by rerunning the lilo command if the message file is changed or moved. The maximum length of the file is 65,535 bytes.

nowarn

Disable warning messages.

optional

Specify that any image that is not available when the map is created should be omitted and not offered as an option at the boot prompt. Like the per-image option optional but applies to all images.

password= password

Specify a password that the user is prompted to enter when trying to load an image. The password is not encrypted in the configuration file, so if passwords are used, permissions should be set so that only the superuser is able to read the file. This option is like the per-image version, except that all images are password-protected and they all have the same password.

prompt

Automatically display the boot prompt without waiting for the user to press the Shift, Alt, or Scroll Lock key. Note that setting prompt without also setting timeout prevents unattended reboots.

restricted

Can be used with password to indicate that a password needs to be entered only if the user specifies parameters on the command line. Like the per-image restricted option but applies to all images.

serial= parameters

Allow the boot loader to accept input from a serial line as well as from the keyboard. Sending a break on the serial line corresponds to pressing a Shift key on the console to get the boot loader’s attention. All boot images should be password-protected if serial access is insecure (e.g., if the line is connected to a modem). Setting serial automatically raises the value of delay to 20 (i.e., 2 seconds) if it is less than that. The parameter string parameters has the following syntax:

                           port[,bps[parity[bits]]]

For example, to initialize COM1 with the default parameters:

serial=0,2400n8

The parameters are:

port

The port number of the serial port. The default is 0, which corresponds to COM1 (/dev/ttys0). The value can be one of 0 through 3, for the four possible COM ports.

bps

The baud rate of the serial port. Possible values of bps are 110, 300, 1200, 2400, 4800, 9600, 19200, and 38400. The default is 2400 bps.

parity

The parity used on the serial line. Parity is specified as n or N for no parity, e or E for even parity, and o or O for odd parity. However, the boot loader ignores input parity and strips the 8th bit.

bits

Specify whether a character contains 7 or 8 bits. Default is 8 with no parity and 7 otherwise.

timeout= tsecs

Set a timeout (specified in tenths of a second) for keyboard input. If no key has been pressed after the specified time, the default image is booted automatically. timeout is also used to determine when to stop waiting for password input. The default timeout is infinite.

verbose= level

Turn on verbose output, where higher values of level produce more output. If -v is also specified on the lilo command line, the level is incremented by 1 for each occurrence of -v. The maximum verbosity level is 5.

Image options

The following options are specified in the image section for a particular boot image. The image can be a Linux kernel or a non-Linux operating system.

alias= name

Provide an alternate name for the image that can be used instead of the name specified with the label option.

image= pathname

Specify the file or device containing the boot image of a bootable Linux kernel. Each per-image section that specifies a bootable Linux kernel starts with an image option. See also the range option.

label= name

Specify the name that is used for the image at the boot prompt. Defaults to the filename of the image file (without the path).

loader= chainloader

For a non-Linux operating system, specify the chain loader to which LILO should pass control for booting that operating system. The default is /boot/chain.b. If the system will be booted from a drive that is neither the first hard disk or a floppy, the chainloader must be specified.

lock

Like lock as described in the previous global options section; it can also be specified in an image section.

optional

Specify that the image should be omitted if it is not available when the map is created by the lilo command. Useful for specifying test kernels that are not always present.

other= pathname

Specify the path to a file that boots a non-Linux system. Each per-image section that specifies a bootable non-Linux system starts with an other option.

password= password

Specify that the image is password-protected and provide the password that the user is prompted for when booting. The password is not encrypted in the configuration file, so if passwords are used, only the superuser should be able to read the file.

range= sectors

Used with the image option, when the image is specified as a device (e.g., image= /dev/fd0), to indicate the range of sectors to be mapped into the map file. sectors can be given as the range start-end or as start+number, where start and end are zero-based sector numbers and number is the increment beyond start to include. If only start is specified, only that one sector is mapped. For example:

image=/dev/fd0
range=1+512   # take 512 sectors, starting with sector 1
restricted

Specify that a password is required for booting the image only if boot parameters are specified on the command line.

table= device

Specify, for a non-Linux operating system, the device that contains the partition table. If table is omitted, the boot loader does not pass partition information to the operating system being booted. Note that /sbin/lilo must be rerun if the partition table is modified. This option cannot be used with unsafe.

unsafe

Can be used in the per-image section for a non-Linux operating system to indicate that the boot sector should not be accessed when the map is created. If unsafe is specified, then some checking isn’t done, but the option can be useful for running the lilo command without having to insert a floppy disk when the boot sector is on a fixed-format floppy disk device. This option cannot be used with table.

Kernel options

The following kernel options can be specified in /etc/lilo.conf as well as on the boot command line:

append= string

Append the options specified in string to the parameter line passed to the kernel. This typically is used to specify certain hardware parameters. For example, while BIOSes on newer systems can recognize more than 64 MB of memory, BIOSes on older systems are limited to 64 MB. If you are running Linux on such a system, you can use append:

append="mem=128M"
initrd= filename

Specify the file to load into /dev/initrd when booting with a RAM disk. See also the options load_ramdisk (in Section 4.7), and prompt_ramdisk, ramdisk_size, and ramdisk_start in this section.

literal= string

Like append, but replace all other kernel boot options.

noinitrd

Preserve the contents of /dev/initrd so they can be read once after the kernel is booted.

prompt_ramdisk= n

Specify whether the kernel should prompt you to insert the floppy disk that contains the RAM disk image, for use during Linux installation. Values of n are:

0

Don’t prompt. Usually used for an installation in which the kernel and the RAM disk image both fit on one floppy.

1

Prompt. This is the default.

ramdisk= size

Obsolete; use only with kernels older than Version 1.3.48. For newer kernels, see the option load_ramdisk in Section 4.7, as well as prompt_ramdisk, ramdisk_size, and ramdisk_start in this section.

ramdisk_size= n

Specify the amount of memory, in kilobytes, to be allocated for the RAM disk. The default is 4096, which allocates 4 megabytes.

ramdisk_start= offset

Used for a Linux installation in which both the kernel and the RAM disk image are on the same floppy. offset indicates the offset on the floppy where the RAM disk image begins; it is specified in kilobytes.

read-only

Specify that the root filesystem should be mounted read-only for filesystem checking (fsck), after which it is typically remounted read/write.

read-write

Specify that the root filesystem should be mounted read/write.

root= root-device

Specify the device that should be mounted as root. If the special name current is used as the value, the root device is set to the device on which the root filesystem currently is mounted. Defaults to the root-device setting contained in the kernel image.

vga= mode

Specify the VGA text mode that should be selected when booting. The mode defaults to the VGA mode setting in the kernel image. The values are case-insensitive. They are:

ask

Prompt the user for the text mode. Pressing Enter in response to the prompt displays a list of the available modes.

extended (or ext)

Select 80x50 text mode.

normal

Select normal 80x25 text mode.

number

Use the text mode that corresponds to number. A list of available modes for your video card can be obtained by booting with vga=ask and pressing Enter.

The lilo Command

You need to run the lilo command to install the LILO boot loader and to update it whenever the kernel changes or to reflect changes to /etc/lilo.conf.

The path to the lilo command is usually /sbin/lilo. The syntax of the command is:

lilo [options]

Some of the options correspond to /etc/lilo.conf keywords:

Configuration keyword

Command option

boot= bootdev

-b bootdev

compact

-c

delay= tsecs

-d tsecs

default= label

-D label

disktab= file

-f file

install= bootsector

-i bootsector

lba32

-L

linear

-l

map= mapfile

-m mapfile

fix-table

-P fix

ignore-table

-P ignore

backup= file

-s file

force-backup= file

-S file

verbose= level

-v

These options should be put in the configuration file whenever possible; putting them on the lilo command line instead of in /etc/lilo.conf is now deprecated. The next section describes those options that can be given only on the lilo command line; the others were described earlier.

lilo Command Options

The following list describes lilo command options that are available only on the command line. Multiple options are given separately; for example:

% lilo -q -v
-C config-file

Specify an alternative to the default configuration file (/etc/lilo.conf). lilo uses the configuration file to determine what files to map when it installs LILO.

-I label

Print the path to the kernel specified by label to standard output, or an error message if no matching label is found. For example:

% lilo -I linux
/boot/vmlinuz-2.0.34-0.6
-q

List the currently mapped files. lilo maintains a file (/boot/map by default) containing the name and location of the kernel(s) to boot. Running lilo with this option prints the names of the files in the map file to standard output, as in this example (the asterisk indicates that linux is the default):

% lilo -q
linux     *
test
-r root-directory

Specify that before doing anything else, lilo should chroot to the indicated directory. Used for repairing a setup from a boot floppy—you can boot from a floppy but have lilo use the boot files from the hard drive. For example, if you issue the following commands, lilo will get the files it needs from the hard drive:

% mount /dev/hda2 /mnt
% lilo -r /mnt
-R command-line

Set the default command for the boot loader the next time it executes. The command executes once and then is removed by the boot loader. This option typically is used in reboot scripts, just before calling shutdown -r.

-t

Indicate that this is a test—do not really write a new boot sector or map file. Can be used with -v to find out what lilo would do during a normal run.

-u device-name

Uninstall lilo by restoring the saved boot sector from /boot/boot.nnnn, after validating it against a timestamp. device-name is the name of the device on which LILO is installed, such as /dev/hda2.

-U device-name

Like -u, but do not check the timestamp.

-V

Print the lilo version number.



[4] If your BIOS is dated after 1998, it should include EDD packet call interface support.

Get Linux in a Nutshell, Fourth Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.