#!/bin/bash # Thierry Parmentelat # 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 # use 2Gb to be safe now that we have a big infra # 1Gb used to be anough up to f18 # with f20 we went to 1.5 Gb # with f21 1.5 Gb might be enough too, but we now have much more memory space so WTH RAM=2048 DISK_SIZE=100G DISK_FORMAT=qcow2 DISK_IMAGE=hdd-${DISK_FORMAT}-${DISK_SIZE}.img SCRIPT=qemu-ifup ####### 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, IP and TARGET_ARCH CONFIG=qemu.conf [ -f "$CONFIG" ] || { echo "Config file for qemu $CONFIG not found in $(pwd)" ; exit 1 ; } . $CONFIG # 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 -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 "Failed" exit 1 fi 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 # 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 &