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