vmrun.sh revision 256657
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 256657 2013-10-17 00:28:35Z neel $
28248484Sneel#
29248484Sneel
30248484SneelLOADER=/usr/sbin/bhyveload
31248484SneelBHYVECTL=/usr/sbin/bhyvectl
32248484SneelFBSDRUN=/usr/sbin/bhyve
33248484Sneel
34256176SneelDEFAULT_MEMSIZE=512M
35248484SneelDEFAULT_CPUS=2
36248484SneelDEFAULT_TAPDEV=tap0
37248484Sneel
38248484SneelDEFAULT_VIRTIO_DISK="./diskdev"
39248484SneelDEFAULT_ISOFILE="./release.iso"
40248484Sneel
41248484Sneelusage() {
42256657Sneel	echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-e <name=value>][-I <location of installation iso>][-t <tapdev>] <vmname>"
43248484Sneel	echo "       -h: display this help message"
44248484Sneel	echo "       -a: force memory mapped local apic access"
45248484Sneel	echo "       -c: number of virtual cpus (default is ${DEFAULT_CPUS})"
46248484Sneel	echo "       -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})"
47256657Sneel	echo "       -e: set FreeBSD loader environment variable"
48248840Sneel	echo "       -g: listen for connection from kgdb at <gdbport>"
49248484Sneel	echo "       -i: force boot of the Installation CDROM image"
50248484Sneel	echo "       -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})"
51256176Sneel	echo "       -m: memory size (default is ${DEFAULT_MEMSIZE})"
52248484Sneel	echo "       -t: tap device for virtio-net (default is $DEFAULT_TAPDEV)"
53248484Sneel	echo ""
54248484Sneel	echo "       This script needs to be executed with superuser privileges"
55248484Sneel	echo ""
56248484Sneel	exit 1
57248484Sneel}
58248484Sneel
59248484Sneelif [ `id -u` -ne 0 ]; then
60248484Sneel	usage
61248484Sneelfi
62248484Sneel
63248484Sneelkldstat -n vmm > /dev/null 2>&1 
64248484Sneelif [ $? -ne 0 ]; then
65248484Sneel	echo "vmm.ko is not loaded!"
66248484Sneel	exit 1
67248484Sneelfi
68248484Sneel
69248484Sneelforce_install=0
70248484Sneelisofile=${DEFAULT_ISOFILE}
71248484Sneelmemsize=${DEFAULT_MEMSIZE}
72248484Sneelcpus=${DEFAULT_CPUS}
73248484Sneelvirtio_diskdev=${DEFAULT_VIRTIO_DISK}
74248484Sneeltapdev=${DEFAULT_TAPDEV}
75248484Sneelapic_opt=""
76248840Sneelgdbport=0
77256657Sneelenv_opt=""
78248484Sneel
79256657Sneelwhile getopts haic:e:g:I:m:d:t: c ; do
80248484Sneel	case $c in
81248484Sneel	h)
82248484Sneel		usage
83248484Sneel		;;
84248484Sneel	a)
85248484Sneel		apic_opt="-a"
86248484Sneel		;;
87248484Sneel	d)
88248484Sneel		virtio_diskdev=${OPTARG}
89248484Sneel		;;
90256657Sneel	e)
91256657Sneel		env_opt="${env_opt} -e ${OPTARG}"
92256657Sneel		;;
93248840Sneel	g)	gdbport=${OPTARG}
94248840Sneel		;;
95248484Sneel	i)
96248484Sneel		force_install=1
97248484Sneel		;;
98248484Sneel	I)
99248484Sneel		isofile=${OPTARG}
100248484Sneel		;;
101248484Sneel	c)
102248484Sneel		cpus=${OPTARG}
103248484Sneel		;;
104248484Sneel	m)
105248484Sneel		memsize=${OPTARG}
106248484Sneel		;;
107248484Sneel	t)
108248484Sneel		tapdev=${OPTARG}
109248484Sneel		;;
110248484Sneel	\?)
111248484Sneel		usage
112248484Sneel		;;
113248484Sneel	esac
114248484Sneeldone
115248484Sneel
116248484Sneelshift $((${OPTIND} - 1))
117248484Sneel
118248484Sneelif [ $# -ne 1 ]; then
119248484Sneel	usage
120248484Sneelfi
121248484Sneel
122248484Sneelvmname="$1"
123248484Sneel
124248484Sneel# Create the virtio diskdev file if needed
125248484Sneelif [ ! -f ${virtio_diskdev} ]; then
126248484Sneel	echo "virtio disk device file \"${virtio_diskdev}\" does not exist."
127248484Sneel	echo "Creating it ..."
128248484Sneel	truncate -s 8G ${virtio_diskdev} > /dev/null
129248484Sneelfi
130248484Sneel
131248484Sneelif [ ! -r ${virtio_diskdev} ]; then
132248484Sneel	echo "virtio disk device file \"${virtio_diskdev}\" is not readable"
133248484Sneel	exit 1
134248484Sneelfi
135248484Sneel
136248484Sneelif [ ! -w ${virtio_diskdev} ]; then
137248484Sneel	echo "virtio disk device file \"${virtio_diskdev}\" is not writable"
138248484Sneel	exit 1
139248484Sneelfi
140248484Sneel
141248484Sneelecho "Launching virtual machine \"$vmname\" ..."
142248484Sneel
143248484Sneelwhile [ 1 ]; do
144248484Sneel	${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
145248484Sneel
146248484Sneel	file ${virtio_diskdev} | grep ": x86 boot sector" > /dev/null
147248484Sneel	rc=$?
148248484Sneel	if [ $rc -ne 0 ]; then
149248484Sneel		file ${virtio_diskdev} | grep ": Unix Fast File sys" > /dev/null
150248484Sneel		rc=$?
151248484Sneel	fi
152248484Sneel	if [ $rc -ne 0 ]; then
153248484Sneel		need_install=1
154248484Sneel	else
155248484Sneel		need_install=0
156248484Sneel	fi
157248484Sneel
158248484Sneel	if [ $force_install -eq 1 -o $need_install -eq 1 ]; then
159248484Sneel		if [ ! -r ${isofile} ]; then
160248484Sneel			echo -n "Installation CDROM image \"${isofile}\" "
161248484Sneel			echo    "is not readable"
162248484Sneel			exit 1
163248484Sneel		fi
164248484Sneel		BOOTDISK=${isofile}
165248484Sneel		installer_opt="-s 3:0,virtio-blk,${BOOTDISK}"
166248484Sneel	else
167248484Sneel		BOOTDISK=${virtio_diskdev}
168248484Sneel		installer_opt=""
169248484Sneel	fi
170248484Sneel
171256657Sneel	${LOADER} -m ${memsize} -d ${BOOTDISK} ${env_opt} ${vmname}
172248484Sneel	if [ $? -ne 0 ]; then
173248484Sneel		break
174248484Sneel	fi
175248484Sneel
176248840Sneel	${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -AI -H -P	\
177248840Sneel		-g ${gdbport}						\
178248484Sneel		-s 0:0,hostbridge					\
179248484Sneel		-s 1:0,virtio-net,${tapdev}				\
180248484Sneel		-s 2:0,virtio-blk,${virtio_diskdev}			\
181248484Sneel		${installer_opt}					\
182248484Sneel		-S 31,uart,stdio					\
183248484Sneel		${vmname}
184248484Sneel	if [ $? -ne 0 ]; then
185248484Sneel		break
186248484Sneel	fi
187248484Sneeldone
188248484Sneel
189248484Sneelexit 99
190