Automating Debian installation using preseeding

In a previous post I went over automating a CentOS installation using a kickstart file. This post is going to look at a similar technique called preseeding which can be used to do the same thing for Debian based distributions.

Note: like the previous CentOS example, the example given in this post is a VM being run under VirtualBox.

Creating a preseed file

One way to generate a preseed file is using the debconf-get-selections command. First make sure the debconf-utils package is installed:

apt-get install debconf-utils

Then create a new preseed file:

echo "#_preseed_V1" > preseed.cfg
debconf-get-selections --installer >> preseed.cfg
debconf-get-selections >> preseed.cfg

Although you can make a preseed file this way the resulting file will still need manual intervention. Generally it's a better idea to start with the example configuration provided by Debian:

wget -O preseed.cfg https://www.debian.org/releases/squeeze/example-preseed.txt

Customising

Although the example configuration is a good starting point, there are several changes I had to make before the installation was completely automated. You will likely want to make different changes, however feel free to refer to the preseed config used in this post.

Locale and keyboard layout

Set the locale and keyboard layout to match your location:

d-i debian-installer/locale string en_GB.UTF-8

d-i console-keymaps-at/keymap select gb
d-i keyboard-configuration/xkb-keymap select gb

Mirror URL

Update the mirror URL to a suitable mirror

d-i mirror/http/hostname string ftp.uk.debian.org

Note: a full list of mirrors can be found on debian.org.

User accounts

For the sake of simplicity this post is just going to create a root account and skip creating a non root user. This can be done with the following configuration:

d-i passwd/make-user boolean false
d-i passwd/root-password password example
d-i passwd/root-password-again password example

Note: use the passwd/root-password-crypted option and a password hash instead of a clear text password if you're planning to keep the VM.

Timezone

Set a suitable timezone:

d-i time/zone string Europe/London

Note: Wikipedia has a list of tz database time zones:

Disk configuration and Grub

For this post the following config was used to partition the VM's disk:

d-i partman-auto/init_automatically_partition select biggest_free
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular

Grub also needs to be installed on the disk, this can be done with the following config:

# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true

# Due notably to potential USB sticks, the location of the MBR can not be
# determined safely in general, so this needs to be specified:
d-i grub-installer/bootdev  string /dev/sda

Software installation

Make sure the apt mirror is enabled, and select which packaged groups you want to install:

d-i apt-setup/use_mirror boolean true
tasksel tasksel/first multiselect standard

Additional packages can also be installed if required:

d-i pkgsel/include string curl

Debian popularity contest

Finally choose if you want to contribute statistics to the Debian popularity contest:

popularity-contest popularity-contest/participate boolean false

Remove the CD from apt

Before restarting the VM, make sure the cdrom repo is not configured in /etc/apt/sources.list:

d-i preseed/late_command string sed -i '/^deb cdrom:/d' /target/etc/apt/sources.list

Note: the partitioned disk is mounted under /target/ during installation.

Installation

There are a few ways you can get the preseed file to the VM being build. For this post the file is going to be served over HTTP:

$ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Once a temporary web server is running to serve the preseed config, boot the VM from a Debian ISO. Press Tab to edit the boot arguments and add the following:

hostname=preseed domain=localhost auto=true
url=http://192.168.56.1/preseed.cfg

The Grub menu should now look similar to the following:

A Debian VM showing the grub boot menu during installation.

From here you should be able to hit Enter to start the installation. If everything goes well you should be able to make a cup of tea can come back to a completed Debian installation.