Debian has an autoinstaller. With some difficulty, you can even get it to automatically install Debian. What the autoinstaller actually does under the hood is interesting in its own right since Debian doesn’t technically install from Debian, but instead from a different operating system that uses a distinct package collection and its own distinct package manager.

This distinct system, which as far as I am aware doesn’t really have a name beyond “debian-installer” is a very compact system that is not designed to be particularly user editable, after all its sole purpose is to install Debian, which is designed to be extremely user modifiable. To accomplish this installation in an automatic mode, the installer makes use of debconf which is an extremely extensible framework for prompting for user input normally used during dpkg transactions. To perform the automatic installation debconf just loads all the answers to the questions it would normally ask from a file rather than prompting them to the screen. While there is virtually no documentation for this beyond the source code itself, it takes surprisingly few toggles to get an automatic installation. The bulk of the config goes into answering the questions in partman the partition manager.

All of this is relatively straightforward unless you want to build a system without swap. Now why you would want to do this is beyond the scope of this article, but many reasons exist where you would not want to provision a server with a swap partition. To disable this there is a token provided for this purpose:

d-i partman-basicfilesystems/no_swap boolean true

This should acknowledge the dialog that warns you that you have not provisioned a swap partition. It does not. Regardless the value of this selection the installer is convinced that I need to go back and add a swap partition. By my reading of the actual check code, there is no possible way this config could ever work:

if ! $swap; then 
  db_input critical partman-basicfilesystems/no_swap || true 
  db_go || true 
  db_get partman-basicfilesystems/no_swap 
  if [ "$RET" = true ]; then 
    exit 1 
  fi 
fi 

This is at the very end of the check_swap file. And there is no way I can see to drive that Return value false with the toggle. I asked in the #debian-boot IRC channel and didn’t get any kind of answer over the course of a week, so I kind of assume this isn’t a well tested path.

Fortunately the check is written in shell, so we can use a shell shaped hammer to solve this shell shaped problem:

# UGLY HACK ALERT!!!  This works around the installer not correctly
# handling the value that should normally suppress this check by just
# claiming that we have swap when we don't.
d-i partman/early_command string sed -i "s/swap=false/swap=:/" /lib/partman/check.d/10check_swap

Is this the right solution? No the right solution is to figure out why db_get partman-basicfilesystems/no_swap doesn’t work, but that would require dealing with Debian’s byzantine patch process as well as waiting on a new release of the installer. Since the project that led me down this rabbit hole in the first place is likely about to abandon the entire partman component due to its differing opinions on how to set up LUKS containers, I’m going to leave this as an ugly hack that I hope to get rid of by getting rid of the entire component that consumes it.

Since I couldn’t find anything in my googling that explained how to do this I’ve written up my solution. If you have a better answer for how to do this, or are from one of the Debian team’s responsible for how this is supposed to work and can explain why this doesn’t work today please reach out.