EXTLINUX is a new Syslinux derivative, which boots from a Linux
ext2/ext3 filesystem.

It works the same way as SYSLINUX (see doc/syslinux.txt), with a few
slight modifications.

1. The installer is run on a *mounted* filesystem.  Run the extlinux
   installer on the directory in which you want extlinux installed:

	extlinux --install /boot

   Specify --install (-i) to install for the first time, or
   --update (-U) to upgrade a previous installation.

   NOTE: this doesn't have to be the root directory of a filesystem.
   If /boot is a filesystem, you can do:

	mkdir -p /boot/extlinux
	extlinux --install /boot/extlinux

   ... to create a subdirectory and install extlinux in it.
   /boot/extlinux is the recommended location for extlinux.


2. The configuration file is called "extlinux.conf", and is expected
   to be found in the same directory as extlinux is installed in.
   Since 4.00 "syslinux.cfg" is also tried if "extlinux.conf" is not
   found.


3. Pathnames can be absolute or relative; if absolute (with a leading
   slash), they are relative to the root of the filesystem on which
   extlinux is installed (/boot in the example above), if relative,
   they are relative to the extlinux directory.

   extlinux supports subdirectories, but the total path length is
   limited to 511 characters.


4. EXTLINUX now supports symbolic links.  However, extremely long
   symbolic links might hit the pathname limit.  Also, please note
   that absolute symbolic links are interpreted from the root *of the
   filesystem*, which might be different from how the running system
   would interpret it (e.g. in the case of a separate /boot
   partition.)  Therefore, use relative symbolic links if at all
   possible.


5. EXTLINUX now has "boot-once" support.  The boot-once information is
   stored in an on-disk datastructure, part of extlinux.sys, called
   the "Auxillary Data Vector".  The Auxilliary Data Vector is also
   available to COM32 modules that want to store small amounts of
   information.

   To set the boot-once information, do:

	extlinux --once 'command' /boot/extlinux

   where 'command' is any command you could enter at the Syslinux
   command line.  It will be executed on the next boot and then
   erased.

   To clear the boot-once information, do:

	extlinux --clear-once /boot/extlinux

   If EXTLINUX is used on a RAID-1, this is recommended, since under
   certain circumstances a RAID-1 rebuild can "resurrect" the
   boot-once information otherwise.

   To clear the entire Auxillary Data Vector, do:

	extlinux --reset-adv /boot/extlinux

   This will erase all data stored in the ADV, including boot-once.

   The --once, --clear-once, and --reset-adv commands can be combined
   with --install or --update, if desired.  The ADV is preserved
   across updates, unless --reset-adv is specified.


Note that EXTLINUX installs in the filesystem partition like a
well-behaved bootloader :)  Thus, it needs a master boot record in the
partition table; the mbr.bin shipped with Syslinux should work well.
To install it just do:

	cat mbr.bin > /dev/XXX

... where /dev/XXX is the appropriate master device, e.g. /dev/hda,
and make sure the correct partition in set active.


If you have multiple disks in a software RAID configuration, the
preferred way to boot is:

- Create a separate RAID-1 partition for /boot.  Note that the Linux
  RAID-1 driver can span as many disks as you wish.

- Install the MBR on *each disk*, and mark the RAID-1 partition
  active.

- Run "extlinux --raid --install /boot" to install extlinux.  This
  will install it on all the drives in the RAID-1 set, which means
  you can boot any combination of drives in any order.



It is not required to re-run the extlinux installer after installing
new kernels.  If you are using ext3 journalling, however, it might be
desirable to do so, since running the extlinux installer will flush
the log.  Otherwise a dirty shutdown could cause some of the new
kernel image to still be in the log.  This is a general problem for
boot loaders on journalling filesystems; it is not specific to
extlinux.  The "sync" command does not flush the log on the ext3
filesystem.


The Syslinux Project boot loaders support chain loading other
operating systems via a separate module, chain.c32 (located in
com32/modules/chain.c32).  To use it, specify a LABEL in the
configuration file with KERNEL chain.c32 and APPEND [hd|fd]<number>
[<partition>]

For example:

# Windows CE/ME/NT, a very dense operating system.
# Second partition (2) on the first hard disk (hd0);
# Linux would *typically* call this /dev/hda2 or /dev/sda2.
LABEL cement
	KERNEL chain.c32
	APPEND hd0 2

See also doc/menu.txt.

