preseed: fix tasksel (syntax); add NET_HOSTNAME; pkvlm-create: clean out existing .iso
#!/bin/bash
### Parameters
## Options
_MOCK=${_MOCK:0}
## Guest info
GUEST_NAME=$1
# Basic params
GUEST_RAM=1G
GUEST_VCPUS=2
# OS variant (for virt-install)
GUEST_OS_VARIANT=debiansqueeze
## Disk
# Size of LV to create
DISK_SIZE=10G
# LVM vg to use
DISK_VG=pvl
# LVM lv to use
DISK_NAME=${GUEST_NAME}
# Path to disk block device
DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME}
DISK_BUS=virtio
GUEST_DISK=/dev/vda
## Network
NET_HOSTNAME=${GUEST_NAME}
NET_BRIDGE=br-lan
NET_IPADDR=194.197.235.36
## Installation image
# Original Debian Installer image (iso)
INSTALLER_NAME="debian-6.0.3-amd64"
INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
INSTALLER_TREE="iso-in/$INSTALLER_NAME"
INSTALLER_FLAG="${INSTALLER_TREE}.unpacked"
# Customized preseed image name
INSTALL_NAME="debian-6.0.3-amd64_${GUEST_NAME}"
# Customized image content
INSTALL_TREE="images/${INSTALL_NAME}"
INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
# Preseed output file in install tree
INSTALL_PRESEED_NAME="preseed.cfg"
INSTALL_PRESEED_FILE="${INSTALL_TREE}/${INSTALL_PRESEED_NAME}"
INSTALL_PRESEED_CHECKSUM= # set later
# Preseed source template
PRESEED_TEMPLATE="preseed/preseed.cfg"
PRESEED_ISOLINUX="preseed/isolinux.cfg"
PRESEED_REST="preseed/passwords.cfg"
## External progs
# Bootable .iso for Debian isolinux-based installer CDs
GENISOIMAGE=/usr/bin/genisoimage
GENISOIMAGE_OPTS="-r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat"
# LVM
LVM=/sbin/lvm
# Libvirt --connect URL
LIBVIRT=qemu:///system
VIRSH=/usr/bin/virsh
function virsh () {
$VIRSH --connect $LIBVIRT "$@"
}
# type of guest to create
LIBVIRT_TYPE=kvm
# virt-install
VIRT_INSTALL="/usr/bin/virt-install"
## SELinux?
#SEMANAGE=/usr/sbin/semanage
#RESTORECON=/sbin/restorecon
### Functions
set -u
set -e
scripts=$(dirname $0)/scripts
. $scripts/lib.sh
### Check
# VM exists?
if cmd virsh domid ${GUEST_NAME} 2> /dev/null; then
die "Virtual machine already exists: ${GUEST_NAME}"
fi
# Installer exists?
if cmd test ! -f ${INSTALLER_ISO}; then
die "Installer not found: ${INSTALLER_ISO}"
fi
### Go!
# Extract .iso
if [ -f ${INSTALLER_FLAG} ]; then
echo "Installer already unpacked: ${INSTALLER_TREE}"
else
echo "Unpacking installer: ${INSTALLER_ISO}"
cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE}
cmd touch ${INSTALLER_FLAG}
fi
# Copy to customized tree
cmd cp -r ${INSTALLER_TREE} ${INSTALL_TREE}
cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
# XXX: Customize preseed
cmd expand_template ${PRESEED_TEMPLATE} ${INSTALL_PRESEED_FILE}
# md5sum
INSTALL_PRESEED_CHECKSUM=$(my_md5sum $INSTALL_PRESEED_FILE)
# Isolinux .cfg
cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
# Others
for file in ${PRESEED_REST}; do
name=$(basename $file)
cmd expand_template $file ${INSTALL_TREE}/${name}
done
# Create .iso
[ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
cmd ${GENISOIMAGE} -o ${INSTALL_ISO} ${GENISOIMAGE_OPTS} ${INSTALL_TREE}
## LVM
# Create LV (unless it already exists)
[ -e $DISK_PATH ] || cmd sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG
## SELinux?
#$SEMANAGE fcontext -a -t virt_image_t $DISK
#$RESTORECON -v $DISK
## virt-install
cmd $VIRT_INSTALL \
--connect $LIBVIRT \
--name $GUEST_NAME \
--ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \
--cdrom "$INSTALL_ISO" \
--os-variant $GUEST_OS_VARIANT \
--disk path=$DISK_PATH,bus=$DISK_BUS \
--network bridge:$NET_BRIDGE \
--vnc \
--virt-type $LIBVIRT_TYPE \
--accelerate --hvm \
--serial pty