summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xshare/examples/bhyve/vmrun.sh130
1 files changed, 95 insertions, 35 deletions
diff --git a/share/examples/bhyve/vmrun.sh b/share/examples/bhyve/vmrun.sh
index 03f17b7..33d0db9 100755
--- a/share/examples/bhyve/vmrun.sh
+++ b/share/examples/bhyve/vmrun.sh
@@ -34,17 +34,25 @@ FBSDRUN=/usr/sbin/bhyve
DEFAULT_MEMSIZE=512M
DEFAULT_CPUS=2
DEFAULT_TAPDEV=tap0
+DEFAULT_CONSOLE=stdio
DEFAULT_VIRTIO_DISK="./diskdev"
DEFAULT_ISOFILE="./release.iso"
usage() {
- echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-I <location of installation iso>][-t <tapdev>] <vmname>"
+ echo "Usage: vmrun.sh [-ahi] [-c <CPUs>] [-C <console>] [-d <disk file>]"
+ echo " [-e <name=value>] [-g <gdbport> ] [-H <directory>]"
+ echo " [-I <location of installation iso>] [-m <memsize>]"
+ echo " [-t <tapdev>] <vmname>"
+ echo ""
echo " -h: display this help message"
- echo " -a: force memory mapped local apic access"
+ echo " -a: force memory mapped local APIC access"
echo " -c: number of virtual cpus (default is ${DEFAULT_CPUS})"
+ echo " -C: console device (default is ${DEFAULT_CONSOLE})"
echo " -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})"
+ echo " -e: set FreeBSD loader environment variable"
echo " -g: listen for connection from kgdb at <gdbport>"
+ echo " -H: host filesystem to export to the loader"
echo " -i: force boot of the Installation CDROM image"
echo " -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})"
echo " -m: memory size (default is ${DEFAULT_MEMSIZE})"
@@ -68,24 +76,37 @@ fi
force_install=0
isofile=${DEFAULT_ISOFILE}
memsize=${DEFAULT_MEMSIZE}
+console=${DEFAULT_CONSOLE}
cpus=${DEFAULT_CPUS}
-virtio_diskdev=${DEFAULT_VIRTIO_DISK}
-tapdev=${DEFAULT_TAPDEV}
+tap_total=0
+disk_total=0
apic_opt=""
gdbport=0
+loader_opt=""
-while getopts haic:g:I:m:d:t: c ; do
+while getopts ac:C:d:e:g:hH:iI:m:t: c ; do
case $c in
- h)
- usage
- ;;
a)
apic_opt="-a"
;;
+ c)
+ cpus=${OPTARG}
+ ;;
+ C)
+ console=${OPTARG}
+ ;;
d)
- virtio_diskdev=${OPTARG}
+ eval "disk_dev${disk_total}=\"${OPTARG}\""
+ disk_total=$(($disk_total + 1))
;;
- g) gdbport=${OPTARG}
+ e)
+ loader_opt="${loader_opt} -e ${OPTARG}"
+ ;;
+ g)
+ gdbport=${OPTARG}
+ ;;
+ H)
+ host_base=`realpath ${OPTARG}`
;;
i)
force_install=1
@@ -93,21 +114,29 @@ while getopts haic:g:I:m:d:t: c ; do
I)
isofile=${OPTARG}
;;
- c)
- cpus=${OPTARG}
- ;;
m)
memsize=${OPTARG}
;;
t)
- tapdev=${OPTARG}
+ eval "tap_dev${tap_total}=\"${OPTARG}\""
+ tap_total=$(($tap_total + 1))
;;
- \?)
+ *)
usage
;;
esac
done
+if [ $tap_total -eq 0 ] ; then
+ tap_total=1
+ tap_dev0="${DEFAULT_TAPDEV}"
+fi
+if [ $disk_total -eq 0 ] ; then
+ disk_total=1
+ disk_dev0="${DEFAULT_VIRTIO_DISK}"
+
+fi
+
shift $((${OPTIND} - 1))
if [ $# -ne 1 ]; then
@@ -115,26 +144,35 @@ if [ $# -ne 1 ]; then
fi
vmname="$1"
-
-# Create the virtio diskdev file if needed
-if [ ! -f ${virtio_diskdev} ]; then
- echo "virtio disk device file \"${virtio_diskdev}\" does not exist."
- echo "Creating it ..."
- truncate -s 8G ${virtio_diskdev} > /dev/null
-fi
-
-if [ ! -r ${virtio_diskdev} ]; then
- echo "virtio disk device file \"${virtio_diskdev}\" is not readable"
- exit 1
+if [ -n "${host_base}" ]; then
+ loader_opt="${loader_opt} -h ${host_base}"
fi
-if [ ! -w ${virtio_diskdev} ]; then
- echo "virtio disk device file \"${virtio_diskdev}\" is not writable"
- exit 1
-fi
+make_and_check_diskdev()
+{
+ local virtio_diskdev="$1"
+ # Create the virtio diskdev file if needed
+ if [ ! -f ${virtio_diskdev} ]; then
+ echo "virtio disk device file \"${virtio_diskdev}\" does not exist."
+ echo "Creating it ..."
+ truncate -s 8G ${virtio_diskdev} > /dev/null
+ fi
+
+ if [ ! -r ${virtio_diskdev} ]; then
+ echo "virtio disk device file \"${virtio_diskdev}\" is not readable"
+ exit 1
+ fi
+
+ if [ ! -w ${virtio_diskdev} ]; then
+ echo "virtio disk device file \"${virtio_diskdev}\" is not writable"
+ exit 1
+ fi
+}
echo "Launching virtual machine \"$vmname\" ..."
+virtio_diskdev="$disk_dev0"
+
while [ 1 ]; do
${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
@@ -163,18 +201,40 @@ while [ 1 ]; do
installer_opt=""
fi
- ${LOADER} -m ${memsize} -d ${BOOTDISK} ${vmname}
+ ${LOADER} -c ${console} -m ${memsize} -d ${BOOTDISK} ${loader_opt} \
+ ${vmname}
if [ $? -ne 0 ]; then
break
fi
- ${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -AI -H -P \
+ #
+ # Build up args for additional tap and disk devices now.
+ #
+ nextslot=2 # slot 0 is hostbridge, slot 1 is lpc
+ devargs="" # accumulate disk/tap args here
+ i=0
+ while [ $i -lt $tap_total ] ; do
+ eval "tapname=\$tap_dev${i}"
+ devargs="$devargs -s $nextslot:0,virtio-net,${tapname} "
+ nextslot=$(($nextslot + 1))
+ i=$(($i + 1))
+ done
+
+ i=0
+ while [ $i -lt $disk_total ] ; do
+ eval "disk=\$disk_dev${i}"
+ make_and_check_diskdev "${disk}"
+ devargs="$devargs -s $nextslot:0,virtio-blk,${disk} "
+ nextslot=$(($nextslot + 1))
+ i=$(($i + 1))
+ done
+
+ ${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -A -H -P \
-g ${gdbport} \
-s 0:0,hostbridge \
-s 1:0,lpc \
- -s 2:0,virtio-net,${tapdev} \
- -s 3:0,virtio-blk,${virtio_diskdev} \
- -l com1,stdio \
+ ${devargs} \
+ -l com1,${console} \
${installer_opt} \
${vmname}
if [ $? -ne 0 ]; then
OpenPOWER on IntegriCloud