pkvlm-create
author Tero Marttila <terom@fixme.fi>
Wed, 14 Dec 2011 01:10:41 +0200
changeset 4 bf9d63195f9d
parent 2 221db3973c99
child 7 ab661ceed4dc
permissions -rwxr-xr-x
preseed: add vim; host.cfg (exim4 - configs still unclear)
#!/bin/bash

### Parameters
## Options
_MOCK=${_MOCK:0}
_ACK=${_ACK: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_INCLUDES=("preseed/passwords.cfg" "preseed/host.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_INCLUDES[@]}; 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}

[ $_ACK ] && read -p "Continue..."

## 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