Custom Debian ISO
If you’re installing Debian on a regular basis, or want to automate the installation a bit more, building a custom Debian installation ISO can be quite handy. You can automate some of the more tedious parts of the installation, install extra packages and run additional setup, or even completely automate the installation!
In my case, I’m working with some automated provisioning using Puppet and Packer. Most of the time, you can start with a pre-installed operating system and work from there. However, for other provisioners, like VMWare, Qemu, and Proxmox, you need a raw ISO image.
Packer can also type in installation commands and run through the setup in a hybrid-automatic way, but this required quite a bit of custom syntax, timing issues, and wouldn’t be very portable if things in the Debian installer should change.
The ideal solution for me was to create a fully-automated installation process that could be called on a blank virtual machine, and is where the idea for an automated Debian installer iso came from.
The tool is actually built into the Debian installer and is called
It takes a configuration file with answers to all of the built-in installer
questions and substitutes things in automatically.
In order to make this fully automated, we also repackage the ISO file with our
preseed.conf file already installed. You don’t have to go this
far, you can specify
preseed.conf files on HTTP servers and other external
locations at boot time, but I wanted a fully automatic process.
Doing this is pretty straightforward, and I even made a system to do this automatically. The scripts I wrote download the latest ISO, verify its checksum, then extract and repackage it with the required files to make things automated. I’ve placed an example of all of this on GitHub.
When finished, a single ISO file is output, and booting this ISO will launch a fully automated installation. It’s important to note that this installation will not ask you any questions and overwrite anything that’s on the first hard drive. It also sets an insecure root password that you should immediately change.
The magic file that tells
preseed what to do is
preseed.cfg. This file is
taken directly from the Debian example and options modified to fit our needs.
You can modify this file further, and set different options as you see fit.
Another feature of this code comes in handy for something you can’t do with the vanilla installer, run scripts automatically on the new system.
Running these scripts directly from
preseed.conf can be a chore, especially
with IO redirection and arguments. To work around this, I created a helper
script that runs any number of scripts setup in
install.d at the end of the
These scripts are also bundled in the ISO file, and executed after the final
installation step of the Debian installer. This lets you access the new system,
it’s just in
/target. I have an example file there that automatically sets up
a new sudoers file.
To add more scripts, just add more shell script files into that directory. There are no arguments when running them, so they’ll need to be self-sufficient.
The final piece of the puzzle we need to modify is Isolinux. Isolinux is the bootloader used to load the installer and Linux Kernel, and we need to tell it to load our preseed file.
There are ways to do this manually without changing anything in Isolinux, but
again I wanted a fully automatic process. I added
isolinux.cfg to create a
simple prompt that will give the user a 10 second timeout before booting the
The Build Process
If you choose to build this, you’ll need to run things as
root. This is
because the ISO contains a lot of root-owned files, which will lead to some
issues during cleanup if you aren’t root as well.
Also, I used Apache Ant to coordinate the build process. You’ll need that to
build.xml file included. Some other packages you may need are
When you start the build, it first checks to see if there’s an ISO locally
available and download one if not. This comes straight from the Debian release
mirror and will be the latest
The downloaded ISO is then extracted. Our files for the
preseed install as
well as the patched
isolinux.cfg files are all installed into the ISO, then
When things are done, you have an iso in
build/preseed.iso that you can use to
boot your virtual machine.