Automating virt-install with preseed.cfg


  • preseed
  • Jonathan Haack
  • Haack’s Networking
  • webmaster@haacksnetworking.org

//preseed//


Latest Updates: https://wiki.haacksnetworking.org/doku.php?id=computing:preseed


I created my own virtualization stack which is complete with version control, file backups, full image backups and more. Additionally, because my client base and use-case does not require that I spin up VMs too often, it was very easy to just keep a few VMs pre-configured generically and then virt-clone them upon need and then tweak a few settings. However, my use-cases and needs are expanding and so I wanted to be able to spin up a new VM with a shell script and have a super minimal and clean copy of Debian installed on it, with absolutely no network configuration, extra packages, etc. So, I decided to dig deeper into both qemu and libvirt to see if there was something that could be developed. After working on qemu options for a bit, I decided that libvirt fit my needs better. After studying forums, I saw that Debian had an “auto-installer” feature and that you could pass configs to it through virsh by adding a few xml lines. After a little trial and error with using a remote site for the config vs. localhost, I developed the following recipe:

virt-install --name=domain.org.qcow2 \
--os-variant=debian11 \
--vcpu=2 \

--ram=4096 \
--disk path=/mnt/vms/production/domain.org.qcow2 \

--check path_in_use=off \
--graphics spice \
--location=/mnt/vms/isos/debian-12.4.0-amd64-netinst.iso \
--network bridge:br0 \
--initrd-inject /mnt/vms/cfgs/preseed.cfg

Other resources online insisted that I needed to add something like --extra-args="ks=file:/mnt/vms/cfgs/preseed.cfg console=tty0 console=ttyS0,115200" to the recipe as well, but I found that was unnecessary through trial and error. I think that syntax is required for those desiring kickstarter and/or if they are not using standard X passthrough for the shell. I’m not sure though. After I got the installer to recognize configuration file, I then began making a list as to which options worked automatically and which did not. One by one, I checked the stock configuration file here and adjusted my config until everything worked. Below, I’ve linked the stock configuration file I used as a jumping off point, and the one I developed for my use-case.

After getting the virt-install recipe and config to perform the desired Debian install, my next task was to automate all of this with a simple script that would create a virtual hard disk of any desired size and a libvirt entry with my desired naming convention in my production VM directory. Here’s what I came up with:

echo -n "Please enter the fully qualified hostname:"
read hostname
echo -n "How large (in GB) would you like the virtual hard disk to be?"
read size
qemu-img create -f qcow2 /mnt/vms/production/${hostname}.qcow2 ${size}G
sleep 2s

echo "Okay, I am now creating the preseed.cfg file for your host …"
mkdir /mnt/vms/cfgs/${hostname}
cp -ar /mnt/vms/cfgs/preseed.cfg /mnt/vms/cfgs/${hostname}/preseed.cfg
rpl -w "unassigned-hostname" "$hostname" /mnt/vms/cfgs/${hostname}/preseed.cfg
rpl -w "unassigned-domain" "$hostname" /mnt/vms/cfgs/${hostname}/preseed.cfg
sleep 2s
echo "Alright, I am opening up virt-installer and building your host …"

virt-install --name=${hostname}.qcow2 \
--os-variant=debian11 \
--vcpu=2 \
--ram=4096 \
--disk path=/mnt/pathtovms/${hostname}.qcow2 \
--check path_in_use=off \
--graphics spice \
--location=/mnt/vms/isos/debian-12.4.0-amd64-netinst.iso \
--network bridge:br0 \
--initrd-inject /mnt/pathtovms/${hostname}/preseed.cfg

For now, I just need really simple Debian VMs as quickly as possible. However, as I wrote this, I began to realize that I could easily expand this script to meet the needs of a variety of different use cases, could add conditionals to it, validation and more. Down the road, I plan to do that, and you can stay up to date with how I expand this script’s functionality on the repository. Well, after all that, I deleted everything and ran the script fresh from top to bottom and tested that everything worked. No more waiting for the jenky X passthrough feedback or putting in details that never/rarely change. It’s all hot and ready!

Happy Hacking
@oemb1905

Close
JavaScript licenses