summaryrefslogtreecommitdiffstats
path: root/share/examples
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2014-06-17 00:53:00 +0000
committeralfred <alfred@FreeBSD.org>2014-06-17 00:53:00 +0000
commit5e82d43eb4acafcda2e56a9109a6af0ec6d2cedb (patch)
tree6c0a10574d120176baea2a9577289c184fb0b7c7 /share/examples
parentbb415f07f03c465a3d6adf758dcbdfc35357027d (diff)
downloadFreeBSD-src-5e82d43eb4acafcda2e56a9109a6af0ec6d2cedb.zip
FreeBSD-src-5e82d43eb4acafcda2e56a9109a6af0ec6d2cedb.tar.gz
Support for multiple disks and tap devices.
This allows you to give a bhyve instance multiple network devices and disk devices easily by specifying additional "-d " and "-t " options. Reviewed by: neel Sponsored by: Norse
Diffstat (limited to 'share/examples')
-rwxr-xr-xshare/examples/bhyve/vmrun.sh83
1 files changed, 61 insertions, 22 deletions
diff --git a/share/examples/bhyve/vmrun.sh b/share/examples/bhyve/vmrun.sh
index 0714b7f..d043846 100755
--- a/share/examples/bhyve/vmrun.sh
+++ b/share/examples/bhyve/vmrun.sh
@@ -78,8 +78,8 @@ 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=""
@@ -96,7 +96,8 @@ while getopts ac:C:d:e:g:hH:iI:m:t: c ; do
console=${OPTARG}
;;
d)
- virtio_diskdev=${OPTARG}
+ eval "disk_dev${disk_total}=\"${OPTARG}\""
+ disk_total=$(($disk_total + 1))
;;
e)
loader_opt="${loader_opt} -e ${OPTARG}"
@@ -117,7 +118,8 @@ while getopts ac:C:d:e:g:hH:iI:m:t: c ; do
memsize=${OPTARG}
;;
t)
- tapdev=${OPTARG}
+ eval "tap_dev${tap_total}=\"${OPTARG}\""
+ tap_total=$(($tap_total + 1))
;;
*)
usage
@@ -125,6 +127,16 @@ while getopts ac:C:d:e:g:hH:iI:m:t: c ; do
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
@@ -136,25 +148,31 @@ if [ -n "${host_base}" ]; then
loader_opt="${loader_opt} -h ${host_base}"
fi
-# 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
+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
@@ -189,12 +207,33 @@ while [ 1 ]; do
break
fi
+ #
+ # 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} \
+ ${devargs} \
-l com1,${console} \
${installer_opt} \
${vmname}
OpenPOWER on IntegriCloud