Q: Can you fit a bootable Fedora distribution into 100 kilobytes?

A: You bet!*

* by cheating … read on.

Take an ordinary Fedora appliance as made by febootstrap or appliance-creator. The appliance image is big because it contains copies of programs ( /bin/bash ) and libraries ( /lib/libc.so ), the kernel and kernel modules. It needs to, to make it self-contained.

But a technique we’ve been using for a few months in libguestfs is to say: we’re booting this appliance on a Fedora host. Let’s strip out all those programs and libraries from the appliance, and we’ll add them back from the host just before we launch it.

I called such appliances “supermin appliances”, and now I’ve ported the functionality from libguestfs into febootstrap so everyone can use it.

A supermin appliance is really small:

-rw-rw-r-- 1 rjones rjones 14K 2009-10-22 12:43 hostfiles.txt -rw-rw-r-- 1 rjones rjones 87K 2009-10-22 12:43 supermin.img

yet it’s fully bootable, given the right sort of host:

It’s really easy to use the new febootstrap to make your own super-small supermin appliances.

We’ll start with this small shell script to make a supermin appliance:

#!/bin/sh - distro=rawhide febootstrap -i bash -i coreutils $distro fedora febootstrap-minimize fedora cat > init <<EOF #!/bin/sh echo Starting /init script ... PATH=/sbin:/usr/sbin:$PATH touch /etc/fstab mount -t proc /proc /proc mount -t sysfs /sys /sys exec bash -i EOF febootstrap-install fedora init /init 0755 root.root rm init # Create the supermin appliance. febootstrap-to-supermin fedora supermin.img hostfiles.txt # Create the ordinary appliance just for comparison. febootstrap-to-initramfs fedora > ordinary.img

You will need to use febootstrap >= 2.5, and set the distro variable so it exactly matches your base Fedora system (eg. set distro=fedora-11 ).

The script below can be used to boot the appliance, and it’s what I used to get the screenshot above.

#!/bin/sh - time febootstrap-supermin-helper \ supermin.img hostfiles.txt kernel initrd qemu-system-x86_64 -m 1024 -kernel kernel -initrd initrd