------------------------------------------- * **preseed** * **Jonathan Haack** * **Haack's Networking** * **webmaster@haacksnetworking.org** ------------------------------------------- //preseed// ------------------------------------------- I created my own [[https://wiki.haacksnetworking.org/doku.php?id=computing:vmserver|virtualization stack]] about two and a half years ago. As I expanded and needed to spin up VMs, my first strategy was to create model VMs that fit particular use cases and then ''virt-clone'' those and then adapt to the new use case. Over time, this became cumbersome, and I started having use-cases that did not fit the templates. For this reason, it came to time to automate fresh Debian installs on new VMs. 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 learned that you could pass the preseed config file to virsh with the last line in this block: 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 that was only required for those desiring kickstarter and/or if they are using a remote site to host the configs from. My next task was to check the stock configuration file and create my own preseed config that would create machines as I desired. Here's the stock Debian config and the one I developed: * [[https://www.debian.org/releases/stable/example-preseed.txt|Stock Configuration]] * [[https://repo.haacksnetworking.org/haacknet/haackingclub/-/blob/main/scripts/preseeds/external/preseed.cfg?ref_type=heads|My Use-Case]] My next task was to automate all of this with a simple shell script. Here's what I came up with: #!/bin/bash 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 -n "What do you want the last octet of the IP address for this host to be? " read ip sleep 2s echo "Okay, I am now creating the preseed.cfg file for your host ..." mkdir /mnt/vms/cfgs/external/${hostname} cp -ar /mnt/vms/cfgs/external/preseed.cfg /mnt/vms/cfgs/external/${hostname}/preseed.cfg rpl -w "unassigned-hostname" "$hostname" /mnt/vms/cfgs/external/${hostname}/preseed.cfg rpl -w "unassigned-domain" "$hostname" /mnt/vms/cfgs/external/${hostname}/preseed.cfg rpl -w "XXX" "$ip" /mnt/vms/cfgs/external/${hostname}/preseed.cfg sleep 2s echo "Alright, I am opening up virt-installer and building your host ..." sleep 2s virt-install --name=${hostname}.qcow2 \ --os-variant=debian11 \ --vcpu=2 \ --ram=4096 \ --disk path=/mnt/vms/production/${hostname}.qcow2 \ --check path_in_use=off \ --graphics spice \ --location=/mnt/vms/isos/debian-12.4.0-amd64-netinst.iso \ --network bridge:br0 \ --network bridge:virbr1 \ --initrd-inject /mnt/vms/cfgs/external/${hostname}/preseed.cfg This script prompts me for domain name and size of the virtual hard disk. I will likely expand the script to add more parameters down the road, such as but not exclusive to networking, vdd location, ram, and so on. As I expand this, I will update the wiki here and also push my latest scripts and configs to the repository: * [[https://repo.haacksnetworking.org/haacknet/haackingclub/-/tree/main/scripts/preseeds?ref_type=heads|Preseed Project]] --- //[[jonathan@haacksnetworking.org|oemb1905]] 2024/02/17 17:53//