Note: this was more or less state of the art around October 2014, and a lot of it is still relevant. Please see the update for March 2021 for more up-to-date information.
Of course, there are cons:
This procedure uses the
GNU GRUB version 2
bootloader. On Debian-based distros, it comes in the
grub-pc package. On Red Hat-based distros, it seems to
be the grub2 package. Installing it from sources should
work too.
Let us assume that the USB stick you want to make bootable is
/dev/sdc and mounted in /media/sdc1.
boot directory on the root of your
stick, remove it or clean it up, especially
boot/grub.
/usr/sbin/grub-install --root-directory=/media/sdc1 /dev/sdcIf all goes well, it will print something like "Installation finished. No error reported.".
/boot/grub/grub2-installed: ignore it.
/media/sdc1/boot/grub/grub.cfg; do not put anything
in it yet.
If you followed this procedure, your USB stick is now bootable: you can test it.
Once the stick is supposed to be bootable, it may be a good idea to test it. The simple way is to simply stick it in a computer and boot it.
There is a less tiring way using QEMU. On a reasonably recent box, QEMU is fast enough to test GRUB comfortably. To start QEMU on your USB stick, unmount it and type:
qemu -hda /dev/sdc
Once the computer (emulation) is started, you should see a prompt similar to this one:
GNU GRUB version 1.98+20100804-14
Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists possible
device or file completions.
grub>
If you know GRUB, you can try a few commands.
To install a live ISO image, just copy the ISO file on your stick
in the boot/ directory (or anywhere you want, in
fact). The next step is to figure out the GRUB commands to boot
it.
Put the GRUB commands in the boot/grub/grub.cfg file.
The stance to boot an ISO image looks like that:
menuentry "name of the entry" {
loopback loop /boot/filename.iso
linux (loop)/path/vmlinuz boot options
initrd (loop)/path/initrd.gz
boot
}
With GRUB, a device or partition holding a filesystem is
designated using parentheses; for example
(hd0,msdos1) is the first MSDOS-style partition on
the first hard drive. A file in this device can be accessed by
prefixing its name with the name of the device.
The loopback command defines a new virtual device,
called here loop with the contents of a file. The
next commands access the files in the ISO-9660 filesystem stored
in the ISO file.
The hard part with this method is to figure out the path to the kernel and especially the boot options. Remember that once you have started the kernel, it has no way of knowing that you are expecting it to dig in an ISO file, let alone which one if there are several.
To help you figure out the path of the kernel and the command line
options, examining the contents of the ISO file can be helpful.
This can be done without privileges using the isoinfo
tool that comes with the
genisoimage/mkisofs suite:
isoinfo -R -i /media/sdc1/boot/file.iso -f
isoinfo -R -i /media/sdc1/boot/file.iso -x /isolinux/isolinux.cfg
The first command lists the contents of the ISO image; the second command dumps the contents of the requested file.
Live ISO images usually use the ISOLINUX bootloader: to find out the kernel options, reading its configuration is probably the first step.
Some live distros include a GRUB configuration specifically made
foor loopback boot. This is true, for example, for
GRML. You recognize this when you
see a /boot/grub/loopback.cfg file in the ISO image.
The GRUB stance will then look like that:
menuentry "GRML 2010.12 i386" {
iso_path=/boot/grml_2010.12.iso
export iso_path
loopback loop $iso_path
set root=(loop)
configfile /boot/grub/loopback.cfg
}
A lot of live distros use the Casper boot system. This apply especially to the Ubuntu live systems.
Casper includes support for loopback boot, it only requires the name of the ISO image. The GRUB stance will look like that:
menuentry "Ubuntu 10.04 Netbook i386" {
loopback loop /boot/ubuntu-10.04-netbook-i386.iso
set root=(loop)
echo "Loading kernel..."
linux /casper/vmlinuz boot=casper iso-scan/filename=/boot/ubuntu-10.04-netbook-i386.iso
echo "Loading initrd..."
initrd /casper/initrd.lz
echo "Booting..."
boot
}
I have a vague project of a tool to convert the ISOLINUX configuration in an ISO file into a GRUB configuration, but nothing is written yet.
All this was more or less the state of the art around October 2014. As of March 2021, a few things have evolved.
UEFI has become the norm. I have written a page on installing GRUB on a hybrid UEFI/MBR bootable stick. It is better than this one.
Most live distributions, including Debian, Ubuntu, GRML, Kali, seem
to be providing a /boot/grub/loopback.cfg file with
good submenus. It makes configuring them much
easier.
I have tried to configure Debian Live directly and enable persistence.