vmrun.sh revision 248840
1248484Sneel#!/bin/sh 2248484Sneel# 3248484Sneel# Copyright (c) 2013 NetApp, Inc. 4248484Sneel# All rights reserved. 5248484Sneel# 6248484Sneel# Redistribution and use in source and binary forms, with or without 7248484Sneel# modification, are permitted provided that the following conditions 8248484Sneel# are met: 9248484Sneel# 1. Redistributions of source code must retain the above copyright 10248484Sneel# notice, this list of conditions and the following disclaimer. 11248484Sneel# 2. Redistributions in binary form must reproduce the above copyright 12248484Sneel# notice, this list of conditions and the following disclaimer in the 13248484Sneel# documentation and/or other materials provided with the distribution. 14248484Sneel# 15248484Sneel# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16248484Sneel# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17248484Sneel# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18248484Sneel# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19248484Sneel# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20248484Sneel# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21248484Sneel# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22248484Sneel# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23248484Sneel# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24248484Sneel# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25248484Sneel# SUCH DAMAGE. 26248484Sneel# 27248484Sneel# $FreeBSD: head/share/examples/bhyve/vmrun.sh 248840 2013-03-28 18:03:39Z neel $ 28248484Sneel# 29248484Sneel 30248484SneelLOADER=/usr/sbin/bhyveload 31248484SneelBHYVECTL=/usr/sbin/bhyvectl 32248484SneelFBSDRUN=/usr/sbin/bhyve 33248484Sneel 34256176SneelDEFAULT_MEMSIZE=512 35248484SneelDEFAULT_CPUS=2 36248484SneelDEFAULT_TAPDEV=tap0 37264837Sjhb 38248484SneelDEFAULT_VIRTIO_DISK="./diskdev" 39248484SneelDEFAULT_ISOFILE="./release.iso" 40248484Sneel 41248484Sneelusage() { 42248484Sneel echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-I <location of installation iso>][-t <tapdev>] <vmname>" 43264837Sjhb echo " -h: display this help message" 44264837Sjhb echo " -a: force memory mapped local apic access" 45264837Sjhb echo " -c: number of virtual cpus (default is ${DEFAULT_CPUS})" 46264837Sjhb echo " -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})" 47264837Sjhb echo " -g: listen for connection from kgdb at <gdbport>" 48248484Sneel echo " -i: force boot of the Installation CDROM image" 49264837Sjhb echo " -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})" 50248484Sneel echo " -m: memory size in MB (default is ${DEFAULT_MEMSIZE}MB)" 51264837Sjhb echo " -t: tap device for virtio-net (default is $DEFAULT_TAPDEV)" 52248484Sneel echo "" 53256657Sneel echo " This script needs to be executed with superuser privileges" 54248840Sneel echo "" 55264837Sjhb exit 1 56248484Sneel} 57248484Sneel 58256176Sneelif [ `id -u` -ne 0 ]; then 59248484Sneel usage 60248484Sneelfi 61248484Sneel 62248484Sneelkldstat -n vmm > /dev/null 2>&1 63248484Sneelif [ $? -ne 0 ]; then 64248484Sneel echo "vmm.ko is not loaded!" 65248484Sneel exit 1 66248484Sneelfi 67248484Sneel 68248484Sneelforce_install=0 69248484Sneelisofile=${DEFAULT_ISOFILE} 70248484Sneelmemsize=${DEFAULT_MEMSIZE} 71248484Sneelcpus=${DEFAULT_CPUS} 72248484Sneelvirtio_diskdev=${DEFAULT_VIRTIO_DISK} 73248484Sneeltapdev=${DEFAULT_TAPDEV} 74248484Sneelapic_opt="" 75248484Sneelgdbport=0 76248484Sneel 77248484Sneelwhile getopts haic:g:I:m:d:t: c ; do 78248484Sneel case $c in 79264837Sjhb h) 80248484Sneel usage 81267559Salfred ;; 82267559Salfred a) 83248484Sneel apic_opt="-a" 84248840Sneel ;; 85264837Sjhb d) 86248484Sneel virtio_diskdev=${OPTARG} 87264837Sjhb ;; 88248484Sneel g) gdbport=${OPTARG} 89248484Sneel ;; 90248484Sneel i) 91248484Sneel force_install=1 92264837Sjhb ;; 93264837Sjhb I) 94264837Sjhb isofile=${OPTARG} 95264837Sjhb ;; 96264837Sjhb c) 97264837Sjhb cpus=${OPTARG} 98248484Sneel ;; 99267559Salfred m) 100267559Salfred memsize=${OPTARG} 101248484Sneel ;; 102256657Sneel t) 103264837Sjhb tapdev=${OPTARG} 104256657Sneel ;; 105264837Sjhb \?) 106264837Sjhb usage 107248840Sneel ;; 108264837Sjhb esac 109264837Sjhbdone 110264837Sjhb 111248484Sneelshift $((${OPTIND} - 1)) 112248484Sneel 113248484Sneelif [ $# -ne 1 ]; then 114248484Sneel usage 115248484Sneelfi 116248484Sneel 117248484Sneelvmname="$1" 118248484Sneel 119248484Sneel# Create the virtio diskdev file if needed 120248484Sneelif [ ! -f ${virtio_diskdev} ]; then 121267559Salfred echo "virtio disk device file \"${virtio_diskdev}\" does not exist." 122267559Salfred echo "Creating it ..." 123248484Sneel truncate -s 8G ${virtio_diskdev} > /dev/null 124264837Sjhbfi 125248484Sneel 126248484Sneelif [ ! -r ${virtio_diskdev} ]; then 127248484Sneel echo "virtio disk device file \"${virtio_diskdev}\" is not readable" 128248484Sneel exit 1 129248484Sneelfi 130267559Salfred 131267559Salfredif [ ! -w ${virtio_diskdev} ]; then 132267559Salfred echo "virtio disk device file \"${virtio_diskdev}\" is not writable" 133267559Salfred exit 1 134267559Salfredfi 135267559Salfred 136267559Salfredecho "Launching virtual machine \"$vmname\" ..." 137267559Salfred 138267559Salfredwhile [ 1 ]; do 139267559Salfred ${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1 140248484Sneel 141248484Sneel file ${virtio_diskdev} | grep ": x86 boot sector" > /dev/null 142248484Sneel rc=$? 143248484Sneel if [ $rc -ne 0 ]; then 144248484Sneel file ${virtio_diskdev} | grep ": Unix Fast File sys" > /dev/null 145248484Sneel rc=$? 146248484Sneel fi 147264837Sjhb if [ $rc -ne 0 ]; then 148264837Sjhb need_install=1 149264837Sjhb else 150248484Sneel need_install=0 151267559Salfred fi 152267559Salfred 153267559Salfred if [ $force_install -eq 1 -o $need_install -eq 1 ]; then 154267559Salfred if [ ! -r ${isofile} ]; then 155267559Salfred echo -n "Installation CDROM image \"${isofile}\" " 156267559Salfred echo "is not readable" 157267559Salfred exit 1 158267559Salfred fi 159267559Salfred BOOTDISK=${isofile} 160248484Sneel installer_opt="-s 3:0,virtio-blk,${BOOTDISK}" 161267559Salfred else 162267559Salfred BOOTDISK=${virtio_diskdev} 163267559Salfred installer_opt="" 164267559Salfred fi 165248484Sneel 166267559Salfred ${LOADER} -m ${memsize} -d ${BOOTDISK} ${vmname} 167267559Salfred if [ $? -ne 0 ]; then 168267559Salfred break 169267559Salfred fi 170267559Salfred 171248484Sneel ${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -AI -H -P \ 172248484Sneel -g ${gdbport} \ 173248484Sneel -s 0:0,hostbridge \ 174267559Salfred -s 1:0,virtio-net,${tapdev} \ 175267559Salfred -s 2:0,virtio-blk,${virtio_diskdev} \ 176248484Sneel ${installer_opt} \ 177248484Sneel -S 31,uart,stdio \ 178248484Sneel ${vmname} 179248484Sneel if [ $? -ne 0 ]; then 180248484Sneel break 181248484Sneel fi 182248484Sneeldone 183248484Sneel 184248484Sneelexit 99 185248484Sneel