Dear lazyweb, I would like to download an arbitrary ISO image (say, a Ubuntu 10.04 Desktop CD) into a directory of a USB flash drive, and then make that USB flash drive boot that ISO image. I do not want to

  • re-partition or re-format the flash drive (this eliminates usb-creator, AFAIU)
  • extract the contents of the ISO image into the root of the USB drive (this eliminates unetbootin)
  • skip the ISO's bootloader and directly boot the kernel+initramfs from the ISO (eliminates this recipe, and this recipe)

I just want a bootloader on the USB to read the VFAT filesystem, mount the ISO image as a loop device, then chain-load the bootloader from that ISO. Bonus points for having a menu letting me choose one of several ISO images. Running a script to edit a text file (say, grub's config) to get that menu is fine.

Is this even possible? If not, can I at least have two out of three (no partition/extraction, but skipping intrinsic bootloader is fine)?

Solution that I finally chose (from Ubuntu forums):

Plug in USB key. Find out the mount point (/media/disk) and the device name (/dev/sdx) of the USB key with

$ mount|grep /media

Install GRUB 2 into the USB key with

$ sudo grub-install --root-directory=/media/usbdisk /dev/sdx

If it says something about embedding being impossible and falling back to UNRELIABLE blocklist-based setup, run

$ sudo grub-install --root-directory=/media/usbdisk /dev/sdx --force

Download a CD image, let's say ubuntu-10.10-desktop-i386.iso. Put it into /media/usbdisk/ubuntu/.

Create a text file /media/usbdisk/boot/grub/grub.cfg with

menuentry "Ubuntu 10.10 (x86 desktop livecd)" {
    set isofile="/ubuntu/ubuntu-10.10-desktop-i386.iso"
    loopback loop $isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
    initrd (loop)/casper/initrd.lz

You can have as many ISO images as you want, just make sure to add a menuentry for each. There's no need to run grub-install again after adding or removing a .iso file. Oh, and if you want to use an ISO file for a different distribution, you'll have to figure out the correct linux and initrd lines somehow.

Update: Ubuntu 13.04 changed the name of the kernel -- use (loop)/casper/vmlinuz.efi instead of (loop)/casper/vmlinuz.

I tested it with the following images

  • ubuntu-10.04-desktop-i386.iso
  • ubuntu-10.04-server-i386.iso
  • ubuntu-10.04-server-amd64.iso
  • ubuntu-10.10-desktop-i386.iso
  • ubuntu-11.04-desktop-i386.iso
  • ubuntu-11.10-desktop-i386.iso
  • ubuntu-12.04-desktop-i386.iso
  • ubuntu-12.04-desktop-amd64.iso
  • ubuntu-12.04-server-i386.iso
  • ubuntu-12.04-server-amd64.iso
  • ubuntu-12.10-desktop-i386.iso
  • ubuntu-12.10-desktop-amd64.iso
  • ubuntu-13.04-desktop-amd64.iso

This solution skips the CD-ROM's boot menu. I haven't found a better one.

Update: I wrote a script to generate a grub.cfg for me so I don't have to do it by hand any more.