Snap-guest is a simple script for creating copy-on-write QEMU/KVM guests. I have added new option “-1 [command]” that will execute a script during first boot. It uses rc.local file, so it should be compatible with most distributions. I test on RHEL and Fedoras.

Primary reason is I maintain some auto-install scripts in git, so I usually do something like:

./snap-guest -b fedora-17-base -t test-vm -s 4098 -1 "git clone xyz && \
    cd xyz && bash -x script.sh"

Command is executed using screen utility (must be installed) in the /root directory and output of STDOUT and STDERR is captured in the /root/firstboot.log file. Also two aliases are dropped to root account: tt tails the logfile and ttr resumes screen.

To recapitulate snap-guest usage:

usage: ./snap-guest options

Simple script for creating copy-on-write QEMU/KVM guests. For the base image
install Fedora or RHEL (compatible), install acpid and ntpd or similar, do not
make any swap partition (use -s option), make sure the hostname is the same
as the vm name and it has "base" in it. Example: rhel-6-base.

OPTIONS:
  -h             Show this message
  -l             List avaiable images (with "base" in the name)
  -a             List all images
  -b [image]     Base image name (template) - required
  -t [image]     Target image name (and hostname) - required
  -n [network]   Network settings (default: "network=default")
  -m [MB]        Memory (default: 800 MiB)
  -c [CPUs]      Number of CPUs (default: 1)
  -p [path]      Images path (default: /var/lib/libvirt/images/)
  -d [domain]    Domain suffix like "mycompany.com" (default: none)
  -f             Force creating new guest (no questions)
  -w             Add IP address to /etc/hosts (works only with NAT)
  -s             Swap size (in MB) that is appeded as /dev/sdb to fstab
  -1 [command]   Command to execute during first boot in /root dir
                 (logfile available in /root/firstboot.log)

EXAMPLE:

  ./snap-guest -l
  ./snap-guest -p /mnt/data/images -l
  ./snap-guest -b fedora-17-base -t test-vm -s 4098
  ./snap-guest -b fedora-17-base -t test-vm2 -n bridge=br0 -d example.com
  ./snap-guest -b rhel-6-base -t test-vm -m 2048 -c 4 -p /mnt/data/images

Enjoy.