9.3 Using LILO with Disk and CompactFlash Devices
Because there is already ample
documentation on the installation, configuration, and use of LILO, I
will cover only its specific use in embedded PC-like systems.
Specifically, I will provide the instructions to use on the host to
install LILO on a storage device meant to be used in the target.
The
installation of LILO on a target's storage device
requires the use of the removable storage setup as explained in Chapter 2. In this scenario, the
target's storage device is removed from the target
and connected to the host's own hardware to be
programmed. Hence, the target's storage device is
controlled by the host's operating system like any
other host device. The target's storage device is
therefore seen as an extra storage device for the host. It can be
seen, for example, as a secondary IDE disk
(/dev/hdb) or as a primary SCSI disk
(/dev/sda). Regardless of the way it is seen by
the host's kernel, LILO needs to be used in a
specific way to install itself on this secondary storage and not on
the host's boot media, as is the default.
As
we discussed in Chapter 8, CF devices are quite
peculiar in this regard, because they can be seen on the host as a
SCSI disk (/dev/sdX)
when accessed through a USB CF reader, while being seen on the target
as an IDE disk
(/dev/hdX) when
accessed through a CF-to-IDE or CF-to-PCMCIA adapter. The
configuration file example I provide below takes care of this issue
by using the appropriate BIOS and kernel flags so that the disk seen
as a SCSI disk on the host can boot normally as an IDE disk once put
back in the target.
In
the following, I assume that the storage device where LILO will be
installed is accessible on your host, and that you are using LILO
Version 22.3 or later. If you are using an earlier version, an
important command will fail, as I will explain shortly. Follow these
steps to install LILO on a secondary IDE or SCSI storage device on
your host:
Create
appropriate /dev entries in your
target's root filesystem for the storage device
where LILO is to be installed. This is not the storage device as it
will be accessed once in your target. Rather, this is the storage
device entry used by the host to access the designated storage
device. If, for example, you want to install LILO on
/dev/sda (usually the first SCSI hard disk in
your system), there must be a /dev/sda entry on
your target's root filesystem. It is very likely
that this entry does not correspond to a valid device on your target.
Indeed, it is possible that the disk accessed as
/dev/sda on the host may be accessed as
/dev/hda once on the target. Nevertheless, you
must create the /dev/sda entry in your
target's root filesystem for LILO to use when
running on the host. The reasons for this will soon become evident.
For more information on the relationship between
/dev entries and the actual physical storage
devices, see Chapter 3 of Running Linux.
Create a LILO configuration
file on your target root filesystem. To avoid damaging your
host's configuration when installing LILO on the
target's storage device, put your LILO configuration
in /etc/target.lilo.conf on your
target's root filesystem instead of the usual
/etc/lilo.conf. Hence, if you accidentally issue
a LILO command that modifies your host, the tool will complain about
a missing file and no damage will be done to your host. Here is a sample
/etc/target.lilo.conf to boot my DAQ module from
a CF card:
boot = /dev/sda
disk = /dev/sda
bios = 0x80
image = /boot/bzImage-2.4.18
root = /dev/sda1
append = "root=/dev/hda1"
label = Linux
read-only In this case, the CF card is accessed
through a USB CF reader and is visible on my host as a SCSI disk
through /dev/sda. On the target, however, it
will be accessed through a CF-to-IDE adapter and will be visible as
an IDE drive through /dev/hda. If you use a
normal LILO configuration file to configure LILO, it would guess the
BIOS ID of the disk it is operating on, and would use that ID at
startup to make access requests to the BIOS. Since, in this case, it
is operating on a SCSI disk, it would assume a SCSI BIOS ID and would
make access requests for such a disk. Since no such disk exists on
the target, the BIOS would return an error and LILO would fail to
boot. The trick in the configuration file above lies in the
bios = 0x80 line. This informs LILO that it is
booting from the disk with BIOS ID 0x80, which is the first IDE drive
in the system. Because of the confusion between SCSI and IDE, I must
also append a root=/dev/hda1 option to the
kernel's boot parameters. Otherwise, the kernel
would fail to find its root filesystem and crash while trying to
mount it. Alternatively, if you want to install LILO on
/dev/hdb, replace the
/dev/sda entries above with
/dev/hdb. In this case, you
won't need to append the
root=/dev/hda1 option to the
kernel's boot instructions, because the disk appears
as IDE both on the host and the target.
When LILO is run with the configuration file above, it opens the
host's /dev/sda device and
installs itself there. Because this configuration file is located in
${PRJROOT}/rootfs/etc/target.lilo.conf instead
of /etc/lilo.conf, special options must be used
with LILO to provide it with the location of this alternative
configuration file. I will present the complete LILO command line to
use in this configuration shortly.
For a complete discussion of how LILO is installed on an alternative
storage device, see the Installing hdc to Boot as
hda and Using bios= section in
the LILO mini-HOWTO provided by the LDP.
If necessary, partition the storage device using
fdisk.
Create filesystems on the storage device for the filesystem types you
selected using the appropriate filesystem creation tools. For an ext2
filesystem, for example, use mke2fs.
Mount the root filesystem partition on an appropriate directory in
/mnt.
Copy the root filesystem to its designated partition using
cp -a. The root filesystem must contain the
kernel image referenced by the
/etc/target.lilo.conf file created earlier,
/boot/bzImage-2.4.18 in this case.
Install LILO on the storage device. For my DAQ
module's storage device, for example, which is
mounted as /mnt/cf on my host, I use the
following command: # lilo -r /mnt/cf -C etc/target.lilo.conf
Warning: etc/target.lilo.conf should be owned by root
Warning: LBA32 addressing assumed
Added Linux * This
command instructs lilo to use the
chroot( ) system call to change its root
directory to /mnt/cf directory and to use the
etc/target.lilo.conf configuration file found in
that directory. The command programs the devices specified in the
target.lilo.conf configuration file. The
/dev entries specified in the configuration file
are located starting from the root directory entry,
/mnt/cf. If /dev/sda must
be programmed, for example, LILO attempts to open and program
/mnt/cf/dev/sda.
If you had
forgotten to create the /dev entries specified
in target.lilo.conf on your
target's root filesystem, this command will fail. It
will also fail if there is no /tmp directory on
your target's root filesystem. Furthermore, if you
are using a LILO version earlier than 22.3, the command will report
the following error and fail:
Fatal: open /boot/boot.b: No such file or directory This error message is due to the fact that, prior to Version 22.3,
LILO's components were separated across different
files, some of which were .b files. Since 22.3,
all .b files are part of the
lilo binary.
Unmount the root filesystem partition.
You can now remove the storage device from your host, either by
shutting down the host and removing the hard disk or by removing the
CF card from the CF reader, instaling it in your target, and booting
it.
To boot from a DOC device, LILO must be patched, since it
doesn't support the DOC by default. Both the Linux
tools package provided by M-Systems and the MTD package provide a
patch for LILO. In light of the common experience of many individuals
on the MTD mailing list and the fact that GRUB is the bootloader
receiving most of the MTD development team's
attention, however, I strongly recommend that you use GRUB instead of
LILO for booting from a DOC device. If you still would like to use
LILO, look at the relevant entries in the MTD mailing list archive
or, if you fail to find what you need in the archive, ask the mailing
list for guidance.
|
|