Build a customized bootable image of Debian GNU/Linux

Recently, I was given a laptop on which I couldn’t install any software on the hard drive. Fortunately, this laptop has the ability to boot on USB devices and I happened to have a 8GB USB flash drive (which is, for the records, largely enough to install a Linux Live system on). To add extra complexity, I was required to use a tool (namely a patched version of NTT Docomo’s SEND implementation (that you can find here)) that is provided by Debian packages (.deb) for the SID version of Debian.

To sum up my requirements, I needed:

  • bootable system (on a USB flash drive)
  • Debian Linux (SID version)
  • possibility to store modifications to the system (persistence of the data)
Luckily, there was already a tool that does just that. Its name: Live Helper. Note that Live Helper does a lot of things. Among them, it can produce:
  • bootable ISO
  • netboot image
  • bootable USB image (which is what I’m interested in here)
A bunch of documentation is available here. Just so you see how simple it is to make funny thing (which is the whole point of this post). Here is what I typed to make my custom USB image:
$ lh_config -b usb-hdd --mirror-bootstrap "http://debian.mymirror.tld/debian"\
-p gnome --packages "nfqueue-bindings-python libnetfilter-queue1 iceweasel
radvd sshfs less wireshark vim xterm socat" -d sid --bootappend-live "keyb=fr"
$ lh_build
Pretty short, isn’t it ? Let us decompose the lh_config command here:
  • -b: selects the type of bootable image. USB image, net bootable image, ISO, etc.
  • –mirror-bootstrap: points to the debian repository where required packages should be fetched.
  • -p: defines a meta-set of packages. In practice, it is more collection of packages for a specific desktop environment. For example, gnome, kde, xfce, etc.
  • –packages: lists the extra packages you want to include in your image. Here, I needed some dependencies for NTT Docomo’s SEND implementation.
  • -d: defines the distribution name, which influence the version of the packages. Here, sid refers to the bleeding-edge version of Debian.
Last important step for me: I wanted to install some software that were not in the Debian. I could just have them installed during the build process of the image, but I wanted to keep things simple and easy to manage. So I used the persistance function. Everything you need to know about this function is very well explained here. In case you are lazy, I will detail it here for you:
  • Your flash drive must be partionned (you can use gparted if you are not used to partionning) at least in two partitions. The first one is the place you will dd the newly build USB image. The second one is where your persistent data will be stored.
  • Anytime you want a live image of the filesystem state in your running USB image, you type live-snapshot. A gzipped cpio archive will be created on your system (the command will tell you where) and you will have to copy it to your second partition.
  • Next time you boot, just happen persistent to the kernel parameter (in your ISOLinux prompt), and it will automatically load the archive, thus restoring the filesystem to its saved state.

That’s it!

P.-S.: in case you need more magic, check out Live-Magic. Installing it is as easy as:

$ aptitude install live-magic