For various reasons, I have the kernel and the initrd that my notebook needs to boot Linux on an USB stick. I recently added the Debian Installer and grml to the stick to allow additional uses of the stick.
Usually, USB sticks are formated with FAT32 and when they're used to boot Linux, Syslinux or some derivative is used.
I do it differently on my boot stick, most prominently because I'd like to have Unixoid privileges on the stick, and because I'd like to continue using grub. So, my stick is formatted as ext3, and feels like an additional hard disk.
Booting from an USB stick is sometimes tricky. I have made the best experiences with formatting the USB stick as an USB ZIP, which basically means having 64 heads, 32 sectors and a single partition in the fourth primary partition slot. This can be done using mkdiskimage and is documented on Debian in /usr/share/doc/syslinux/usbkey.doc. Partitioning and generation of the file system is as straightforward as is installing grub using the standard, documented methods for hard disks.
I tried using grub 2, but have found it not sufficiently well-documented and stable to be used in this kind of critical environment. I am therefore still using grub-legacy despite the fact that the grub maintainers have ceased fixing grub-legacy bugs some months ago, refering to the pending release of grub 2.
I use unison to keep /boot on the stick in sync with /boot of the Linux system, which is on a crypted filesystem on the hard disk and thus unuseable until the system has booted. The hard disk /boot thus serves only as installation target and sync source so that the stick does not need to be plugged in during upgrades. update-grub is configured so that running it creates a menu.lst which can be used from the stick. This concludes booting the production system from the stick.
For the other systems, I have decided not to put them in the "default" boot menu from menu.lst, but instead include foo.lst files to the root of the stick, and when I need them, shell out from the grub menu to a command line by pressing "c" and then pulling in the new grub config file with the "configfile /foo.lst" command.
grml is my favorite rescue system. I use it all the time once a system starts acting up. One of its biggest advantages is its extremely flexible bootup process. That made it predestined to be the rescue system on my USB boot stick. grml is currently making a transition to a new build environment, which has had the side effect that the boot process has changed in some details. grml-small, the 60 MB variant that I had been using before, has been discontinued and replaced by grml-medium, a 170 MB variant which does definetely not fit any more on a business card CD, but 128 MB USB sticks have become relatively seldom.
For both grml flavours, all one needs to do is mount the .iso file loopback, copy the file's contents to a subdirectory of the boot stick, and to drop this menu file to the stick:
Since grml-medium works reasonably well, I do not expect to need grml-small very often any more.
title grml-small root (hd0,3) kernel /grml-small/boot/isolinux/linux26 toram grml_dir=/grml-small/GRML/ grml_name=GRML ramdisk_size=100000 init=/etc/init lang=us BOOT_IMAGE=grml initrd /grml-small/boot/isolinux/minirt26.gz title grml-medium root (hd0,3) kernel /grml-medium/boot/grmlmedium/linux26 live-media-path=/grml-medium/live/ toram=grml-medium.squashfs lang=us boot=live noeject noprompt keyboard=de initrd /grml-medium/boot/grmlmedium/initrd.gz
The Debian Installer guys have published an initrd which can browse nearly arbitrary media for an debian-installer .iso file, mount it and install from that image. I have made use of that feature to allow Debian to be installed from my boot stick. /d-i holds a current debian-testing-i386-netinst.iso, and vmlinux and initrd.gz from http://ftp.nl.debian.org/debian/dists/testing/main/installer-i386/current/images/hd-media/. With that, this d-i.lst:
does the trick and boots up the Installer, ready to start.
title debian installer root (hd0,3) kernel /d-i/vmlinuz initrd /d-i/initrd.gz
I guess that it would be easily possible to include these grub config stanzas to the default menu.lst, including grml and the Installer into the main grub menu, but I deliberately decided not to have these options directly in the menu for the time being.
It is always amazing how flexible today's systems have become when it comes to boot Linux. For both rescue and installation, this is needed, and the respective authors have done a remarkable job.