How to set up an Ubuntu 20.04 ISO image to auto-install a server
In Ubuntu 20.04 LTS, Canonical has switched to an all new and not yet fully finished system for automated server installs. Yesterday I wrote some notes about the autoinstall configuration file format, but creating a generally functional configuration file is only the first step; now you need to set up something to install it. Around here we use DVDs, or at least ISO images, in our install setup, so that's what I've focused on.
The first thing you need (besides your autoinstall configuration file) is a suitable ISO image. At the moment, the only x86 server image that's available for Ubuntu 20.04 is the 'live server' image, so that's what I used (see here for the 18.04 differences between the plain server image and the 'live server' one, but then Ubuntu 20.04 is all in on the 'live' version). To make this ISO into a self-contained ISO that will boot with your autoinstall configuration, we need to add some data files to the ISO and then modify the isolinux boot configuration.
The obvious data file we have to add to the ISO is our autoconfigure
file. However, it has to be set up in a directory for itself and a
companion file, and each has to be called special names. Let's say
that the directory within the ISO that we're going to use for this
/cslab/inst. Then our autoinstall configuration file
must be called
/cslab/inst/user-data, and we need an empty
/cslab/inst/meta-data file beside it. At install time, the path
to this directory is
/cdrom/cslab/inst, because the ISO is mounted
(I put our configuration in a subdirectory here because we put
additional bootstrap files under
/cslab that are copied onto the
system as part of the autoinstall.)
The isolinux configuration file we need to modify in the ISO is
/isolinux/txt.cfg. We want to modify the kernel command line
to add a new argument, '
default live label live menu label ^Install Ubuntu Server kernel /casper/vmlinuz append initrd=/casper/initrd quiet ds=nocloud;s=/cdrom/cslab/inst/ --- [...]
(You can modify the 'safe graphics' version of the boot entry as well if you think you may need it. I probably should do that to our isolinux txt.cfg.)
The purpose and parameters of the 'ds=' argument are described
This particular set of parameters tells the autoinstaller to find
our configuration file in
/cslab/inst/ on the ISO, where it will
automatically look for both '
user-data' and '
Some sources will tell you to also add an '
to the kernel command line. You probably don't want to do this, and
it's only necessary if you want a completely noninteractive install
that doesn't even stop to ask you if you're sure you want to erase
your disks. If you have some '
interactive-sections' specified in
your autoinstall configuration file, this is not applicable; you're
already having the autoinstall stop to ask you some questions.
For actually modifying the ISO image, what I do is prepare a scratch
directory, unpack the pristine ISO image into it with
we have 7z installed and it will unpack ISOs, among many other
things), modify the scratch directory, and then build a new ISO
mkisofs -o cslab_ubuntu_20.04.iso \ -ldots -allow-multidot -d -r -l -J \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ SCRATCH-DIRECTORY isohybrid cslab_ubuntu_20.04.iso
makes this ISO bootable as a USB stick. Well, theoretically bootable.
I haven't actually tried this for 20.04.)
You can automate all of this with some shell scripts that take an ISO image and a directory tree of things to merge into it (overwriting existing files) and generate a new image.