In my initial post about unattended Ubuntu installs, I made the less-automated choice of hacking at the Ubuntu installation ISO and baking my preseed configuration right into the ISO. This proved to be incredibly inefficient and prevented a lot of the customization and quick-spin-up potential of what I interested in. In other words, if I wanted to spin up five identical VMs differing only by their hostname, was I really expected to bake five custom ISO’s whose preseed file only differed by their specification of the hostname?
Solution: With a bit of Internet poking, I found that you can specify the URL of a preseed file, accessible via HTTP, for your VM to read during OS installation as a kernel boot parameter. Given all this, there really was no reason to bake my own ISO in the first place. I had to test using virt-install specifying all these parameters on the command line, including using a straight Ubuntu install ISO. Results? Success!
For those curious of the command-line I used:
sudo /usr/bin/virt-install \
--connect qemu:///system \
--disk vol=<disk pool>/<disk volume>,cache=none \
--extra-args "locale=en_US.UTF-8 console-keymaps-at/keymap=us console-setup/ask_detect=false console-setup/layoutcode=us keyboard-configuration/layout=USA keyboard-configuration/variant=US netcfg/get_hostname=<VM hostname> netcfg/get_domainname=<VM domain name> console=tty0 console=ttyS0,115200n8 preseed/url=<URL to preseed file>" \
--location /mnt/raid1/dump/ubuntu-14.04.1-server-amd64.iso \
--network bridge=<bridge if> \
--name <VM name according to libvirt> \
--os-type linux \
--ram 512 \
--vcpus 1 \
--virt-type kvm \
Preseed file: This file can live on any accessible-from-your-VM http server. During the install process, it is retrieved via wget as part of the install procedure. But how do you specify the URL for the preseed file?
The only one modification I did have to make to my preseed file had to do with selecting a mirror. I was constantly prompted to select a mirror hostname. After another couple Google searches, I was left with what seems to work, by default picking a US-based HTTP mirror for Ubuntu packages:
d-i mirror/http/countries select US
d-i mirror/http/hostname string archive.ubuntu.com
d-i mirror/http/directory string /debian
d-i mirror/http/mirror select us.archive.ubuntu.com
d-i mirror/protocol select http
d-i mirror/country string US
d-i mirror/http/proxy string