Building a Busybox Boot Floppy
==============================

This document describes how to buid a boot floppy using the following
components:

 - Linux Kernel (http://www.kernel.org)
 - uClibc: C library (http://cvs.uclinux.org/uClibc.html)
 - Busybox: Unix utilities (http://busybox.lineo.com)
 - Syslinux: bootloader (http://syslinux.zytor.com)

It is based heavily on a paper presented by Erik Andersen at the 2001 Embedded
Systems Conference.



Building The Software Components
--------------------------------

Detailed instructions on how to build Busybox, uClibc, or a working Linux
kernel are beyond the scope of this document. The following guidelines will
help though:

	- Stock Busybox from CVS or a tarball will work with no modifications to
	  any files. Just extract and go.
	- Ditto uClibc.
	- Your Linux kernel must include support for initrd or else the floppy
	  won't be able to mount it's root file system.

If you require further information on building Busybox uClibc or Linux, please
refer to the web pages and documentation for those individual programs.



Making a Root File System
-------------------------

The following steps will create a root file system.

 - Create an empty file that you can format as a filesystem:
 
	dd if=/dev/zero of=rootfs bs=1k count=4000

 - Set up the rootfs file we just created to be used as a loop device (may not
   be necessary) 

	losetup /dev/loop0 rootfs 

 - Format the rootfs file with a filesystem:

	mkfs.ext2 -F -i 2000 rootfs

 - Mount the file on a mountpoint so we can place files in it:

	mkdir loop
	mount -o loop rootfs loop/

	(you will probably need to be root to do this)

 - Copy on the C library, the dynamic linking library, and other necessary
   libraries. For this example, we copy the following files from the uClibc
   tree:

	mkdir loop/lib
	(chdir to uClibc directory)
	cp -a libc.so* uClibc*.so \
		ld.so-1/d-link/ld-linux-uclibc.so* \
		ld.so-1/libdl/libdl.so* \
		crypt/libcrypt.so* \
		(path to)loop/lib

 - Install the Busybox binary and accompanying symlinks:

	(chdir to busybox directory)
	make PREFIX=(path to)loop/ install

 - Make device files in /dev:

 	This can be done by running the 'mkdevs.sh' script. If you want the gory
	details, you can read the script.

 - Make necessary files in /etc:

	For this, just cp -a the etc/ directory onto rootfs. Again, if you want
	all the details, you can just look at the files in the dir.

 - Run ldconfig so busybox and other binaries can have access to the libraries
   that they need:

   (path to)uClibc/ld.so-1/util/ldconfig -r loop/

 - Unmount the rootfs from the mountpoint:

	umount loop

 - Compress it:

	gzip -9 rootfs


Making a SYSLINUX boot floppy
-----------------------------

The following steps will create the boot floppy.

Note: You will need to have the mtools package installed beforehand.

 - Insert a floppy in the drive and format it with an MSDOS filesystem:
 
	mformat a:

	(if the system doesn't know what device 'a:' is, look at /etc/mtools.conf)

 - Run syslinux on the floppy:
 
	syslinux -s /dev/fd0
	
	(the -s stands for "safe, slow, and stupid" and should work better with
	buggy BIOSes; it can be omitted)

 - Put on a syslinux.cfg file:

	mcopy syslinux.cfg a:

	(more on syslinux.cfg below)

 - Copy the root file system you made onto the MSDOS formatted floppy

	mcopy rootfs.gz a:

 - Build a linux kernel and copy it onto the disk with the filename 'linux'

	mcopy bzImage a:linux


Sample syslinux.cfg
~~~~~~~~~~~~~~~~~~~

The following simple syslinux.cfg file should work. You can tweak it if you
like.

----begin-syslinux.cfg---------------
DEFAULT linux
APPEND initrd=rootfs.gz root=/dev/ram0
TIMEOUT 10
PROMPT 1
----end-syslinux.cfg---------------

Some changes you could make to syslinux.cfg:

 - This value is the number seconds it will wait before booting. You can set
   the timeout to 0 (or omit) to boot instantly, or you can set it as high as
   10 to wait awhile.

 - PROMPT can be set to 0 to disable the 'boot:' prompt.

 - you can add this line to display the contents of a file as a welcome
   message:

	DISPLAY display.txt



Additional Resources
--------------------

Other useful information on making a Linux bootfloppy is available at the
following URLs:

http://www.linuxdoc.org/HOWTO/Bootdisk-HOWTO/index.html
http://www.linux-embedded.com/howto/Embedded-Linux-Howto.html
http://linux-embedded.org/howto/LFS-HOWTO.html
http://linux-embedded.org/pmhowto.html
http://recycle.lbl.gov/~ldoolitt/embedded/ (Larry Doolittle's stuff)



Possible TODOs
--------------

The following features that we might want to add later:

 - support for additional filesystems besides ext2, i.e. minix
 - different libc, static vs dynamic loading
 - maybe using an alternate bootloader
