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!

Why?

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.

How?

The tool is actually built into the Debian installer and is called preseed. 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 customized 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.

The Code

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.

Preseed Config

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.

Installation Scripts

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 installation.

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.

Isolinux

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 automated installer.

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 use the build.xml file included. Some other packages you may need are bsdtar and gensioimage.

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 netinst image.

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 it’s rebundled.

When things are done, you have an iso in build/preseed.iso that you can use to boot your virtual machine.