vmrun.sh revision 256176
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 256176 2013-10-09 03:56:07Z 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() {
42248840Sneel	echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-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})"
47248840Sneel	echo "       -g: listen for connection from kgdb at <gdbport>"
48248484Sneel	echo "       -i: force boot of the Installation CDROM image"
49248484Sneel	echo "       -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})"
50256176Sneel	echo "       -m: memory size (default is ${DEFAULT_MEMSIZE})"
51248484Sneel	echo "       -t: tap device for virtio-net (default is $DEFAULT_TAPDEV)"
52248484Sneel	echo ""
53248484Sneel	echo "       This script needs to be executed with superuser privileges"
54248484Sneel	echo ""
55248484Sneel	exit 1
56248484Sneel}
57248484Sneel
58248484Sneelif [ `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=""
75248840Sneelgdbport=0
76248484Sneel
77248840Sneelwhile getopts haic:g:I:m:d:t: c ; do
78248484Sneel	case $c in
79248484Sneel	h)
80248484Sneel		usage
81248484Sneel		;;
82248484Sneel	a)
83248484Sneel		apic_opt="-a"
84248484Sneel		;;
85248484Sneel	d)
86248484Sneel		virtio_diskdev=${OPTARG}
87248484Sneel		;;
88248840Sneel	g)	gdbport=${OPTARG}
89248840Sneel		;;
90248484Sneel	i)
91248484Sneel		force_install=1
92248484Sneel		;;
93248484Sneel	I)
94248484Sneel		isofile=${OPTARG}
95248484Sneel		;;
96248484Sneel	c)
97248484Sneel		cpus=${OPTARG}
98248484Sneel		;;
99248484Sneel	m)
100248484Sneel		memsize=${OPTARG}
101248484Sneel		;;
102248484Sneel	t)
103248484Sneel		tapdev=${OPTARG}
104248484Sneel		;;
105248484Sneel	\?)
106248484Sneel		usage
107248484Sneel		;;
108248484Sneel	esac
109248484Sneeldone
110248484Sneel
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
121248484Sneel	echo "virtio disk device file \"${virtio_diskdev}\" does not exist."
122248484Sneel	echo "Creating it ..."
123248484Sneel	truncate -s 8G ${virtio_diskdev} > /dev/null
124248484Sneelfi
125248484Sneel
126248484Sneelif [ ! -r ${virtio_diskdev} ]; then
127248484Sneel	echo "virtio disk device file \"${virtio_diskdev}\" is not readable"
128248484Sneel	exit 1
129248484Sneelfi
130248484Sneel
131248484Sneelif [ ! -w ${virtio_diskdev} ]; then
132248484Sneel	echo "virtio disk device file \"${virtio_diskdev}\" is not writable"
133248484Sneel	exit 1
134248484Sneelfi
135248484Sneel
136248484Sneelecho "Launching virtual machine \"$vmname\" ..."
137248484Sneel
138248484Sneelwhile [ 1 ]; do
139248484Sneel	${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
147248484Sneel	if [ $rc -ne 0 ]; then
148248484Sneel		need_install=1
149248484Sneel	else
150248484Sneel		need_install=0
151248484Sneel	fi
152248484Sneel
153248484Sneel	if [ $force_install -eq 1 -o $need_install -eq 1 ]; then
154248484Sneel		if [ ! -r ${isofile} ]; then
155248484Sneel			echo -n "Installation CDROM image \"${isofile}\" "
156248484Sneel			echo    "is not readable"
157248484Sneel			exit 1
158248484Sneel		fi
159248484Sneel		BOOTDISK=${isofile}
160248484Sneel		installer_opt="-s 3:0,virtio-blk,${BOOTDISK}"
161248484Sneel	else
162248484Sneel		BOOTDISK=${virtio_diskdev}
163248484Sneel		installer_opt=""
164248484Sneel	fi
165248484Sneel
166248484Sneel	${LOADER} -m ${memsize} -d ${BOOTDISK} ${vmname}
167248484Sneel	if [ $? -ne 0 ]; then
168248484Sneel		break
169248484Sneel	fi
170248484Sneel
171248840Sneel	${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -AI -H -P	\
172248840Sneel		-g ${gdbport}						\
173248484Sneel		-s 0:0,hostbridge					\
174248484Sneel		-s 1:0,virtio-net,${tapdev}				\
175248484Sneel		-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
185