#!/bin/bash
+# Thierry Parmentelat <thierry.parmentelat@inria.fr>
+# Copyright (C) 2010 INRIA
+#
+# it does the following:
+# (*) close all file descriptors and redirect output to log.txt
+# this is because it is designed for use through ssh from a remote test master controller
+# (*) initialize a disk image if it does not exist yet
+# (*) starts a qemu instance
+
# cd in this command's directory
+COMMAND=$(basename $0)
cd $(dirname $0)
########## globals
-HDA=hard_drive.img
-RAM=1024
-qemu-img create -f qcow2 $HDA 10G
+# historically we used 1Gb nodes but with fedora20 bootcd with qemu this is not enough
+# OTOH our test infra is old so 2Gb would be a lot
+RAM=$((1024+512))
+DISK_SIZE=100G
+DISK_FORMAT=qcow2
+DISK_IMAGE=hdd-${DISK_FORMAT}-${DISK_SIZE}.img
SCRIPT=qemu-ifup
-TAP="tap,script=$SCRIPT"
+
+####### we want this script to be invokable through ssh without the ssh client to remain hanging
+# close stdin
+exec <&-
+# redirect stdout
+exec >> log.txt
+# redirect stderr on stdout
+exec 2>&1
########## from the test environment
-# expected vars are MACADDR, NODE_ISO, HOSTNAME and TARGET_ARCH
+# expected vars are MACADDR, NODE_ISO, HOSTNAME, IP and TARGET_ARCH
CONFIG=qemu.conf
-if [ ! -e ${CONFIG} ];then
- echo "File for node_iso version not found"
- exit 1
-fi
+[ -f "$CONFIG" ] || { echo "Config file for qemu $CONFIG not found in $(pwd)" ; exit 1 ; }
. $CONFIG
-# the launcher, depending on local/target archs
-archs="$(uname -i)+$TARGET_ARCH"
-case $archs in
- i386+i386) QEMU= qemu;;
- i386+x86_64) QEMU= qemu-system-x86_64;;
- x86_64+i386) QEMU= qemu;;
- x86_64+x86_64) QEMU= qemu-system-x86_64;;
-esac
-
-#Creating new HDA if needed only
-#using qcow2 disk image format which is essential to support VM snapshots
-if [ -f $HDA ] ; then
- echo "Using $HDA"
+# NOTE: check if the machine supports 64bits. We'll add -no-kqemu only
+# if it does. On 32bits host, qemu-system-x86_64 doesn't accept this
+# parameter (although it's there in the man page)
+function is_64bits () {
+ return $(cat /proc/cpuinfo | grep "^flags" | grep " lm " > /dev/null)
+}
+
+
+# the launcher, depending on target arch
+# make sure to check qemu-kill-node for consistency
+
+# use kvm if available
+has_kvm=$(type -p qemu-kvm)
+if [ -n "$has_kvm" ] ; then
+ QEMU="qemu-kvm" ; ARGS=""
+else
+ case $TARGET_ARCH in
+ i386) QEMU=qemu ; ARGS="" ;;
+ x86_64) QEMU=qemu-system-x86_64 ; if is_64bits; then ARGS="-no-kqemu"; else ARGS=""; fi ;;
+ *) echo "Cannot handle TARGET_ARCH=$TARGET_ARCH"; exit 1 ;;
+ esac
+fi
+
+echo "Running $COMMAND in $(pwd)"
+echo "Starting at $(date)"
+
+#Creating new DISK_IMAGE if needed only
+if [ -f $DISK_IMAGE ] ; then
+ echo "Using existing $DISK_IMAGE"
else
- echo "Creating hard disk (10G) for Qemu install under $HDA"
- img=$($QEMU_CREATE_IMAGE)
+ echo -n "Creating hard disk image (${DISK_SIZE}) as $DISK_IMAGE .. "
+ img=$(qemu-img create -f ${DISK_FORMAT} $DISK_IMAGE ${DISK_SIZE})
if [ -z "$img" ];then
- echo "Can't Create disk image..."
+ echo "Failed"
exit 1
fi
- echo "New image $HDA created"
+ echo "Done"
+fi
+
+echo 'Trying to load the kqemu module'
+if modprobe kqemu &> /dev/null ; then
+ echo "kqemu loaded"
+else
+ echo "WARNING : Could not modprobe kqemu"
fi
+echo 'Checking for a loaded kqemu module'
+lsmod | grep kqemu
+echo 'Checking for /dev/kqemu'
+ls -l /dev/kqemu
+
+echo 'Cleaning up pid file'
rm -f qemu.pid
-#Command for running the Qemu Emulator
-ARGS="-boot d -net nic,macaddr=${MACADDR} -net $TAP, -cdrom ${NODE_ISO} -hda ${HDA} -m ${RAM} -nographic -pidfile qemu.pid"
-echo "Running $QEMU $ARGS < /dev/null"
-exec $QEMU $ARGS < /dev/null
+
+
+# qemu options
+# basics
+ARGS="$ARGS -m ${RAM}"
+ARGS="$ARGS -hda ${DISK_IMAGE}"
+ARGS="$ARGS -nographic"
+ARGS="$ARGS -pidfile qemu.pid"
+# boot from CD
+ARGS="$ARGS -boot d"
+ARGS="$ARGS -cdrom ${NODE_ISO}"
+# set mac address
+ARGS="$ARGS -net nic,macaddr=${MACADDR}"
+# set init script
+ARGS="$ARGS -net tap,script=${SCRIPT}"
+echo "Running $QEMU $ARGS"
+exec $QEMU $ARGS &