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
This commit is contained in:
Alfred Perlstein 2014-06-17 00:53:00 +00:00
parent a026dc3fcb
commit 3ab512ae80
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=267559

View file

@ -78,8 +78,8 @@ isofile=${DEFAULT_ISOFILE}
memsize=${DEFAULT_MEMSIZE} memsize=${DEFAULT_MEMSIZE}
console=${DEFAULT_CONSOLE} console=${DEFAULT_CONSOLE}
cpus=${DEFAULT_CPUS} cpus=${DEFAULT_CPUS}
virtio_diskdev=${DEFAULT_VIRTIO_DISK} tap_total=0
tapdev=${DEFAULT_TAPDEV} disk_total=0
apic_opt="" apic_opt=""
gdbport=0 gdbport=0
loader_opt="" loader_opt=""
@ -96,7 +96,8 @@ while getopts ac:C:d:e:g:hH:iI:m:t: c ; do
console=${OPTARG} console=${OPTARG}
;; ;;
d) d)
virtio_diskdev=${OPTARG} eval "disk_dev${disk_total}=\"${OPTARG}\""
disk_total=$(($disk_total + 1))
;; ;;
e) e)
loader_opt="${loader_opt} -e ${OPTARG}" 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} memsize=${OPTARG}
;; ;;
t) t)
tapdev=${OPTARG} eval "tap_dev${tap_total}=\"${OPTARG}\""
tap_total=$(($tap_total + 1))
;; ;;
*) *)
usage usage
@ -125,6 +127,16 @@ while getopts ac:C:d:e:g:hH:iI:m:t: c ; do
esac esac
done 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)) shift $((${OPTIND} - 1))
if [ $# -ne 1 ]; then if [ $# -ne 1 ]; then
@ -136,25 +148,31 @@ if [ -n "${host_base}" ]; then
loader_opt="${loader_opt} -h ${host_base}" loader_opt="${loader_opt} -h ${host_base}"
fi fi
# Create the virtio diskdev file if needed make_and_check_diskdev()
if [ ! -f ${virtio_diskdev} ]; then {
echo "virtio disk device file \"${virtio_diskdev}\" does not exist." local virtio_diskdev="$1"
echo "Creating it ..." # Create the virtio diskdev file if needed
truncate -s 8G ${virtio_diskdev} > /dev/null if [ ! -f ${virtio_diskdev} ]; then
fi 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 if [ ! -r ${virtio_diskdev} ]; then
echo "virtio disk device file \"${virtio_diskdev}\" is not readable" echo "virtio disk device file \"${virtio_diskdev}\" is not readable"
exit 1 exit 1
fi fi
if [ ! -w ${virtio_diskdev} ]; then if [ ! -w ${virtio_diskdev} ]; then
echo "virtio disk device file \"${virtio_diskdev}\" is not writable" echo "virtio disk device file \"${virtio_diskdev}\" is not writable"
exit 1 exit 1
fi fi
}
echo "Launching virtual machine \"$vmname\" ..." echo "Launching virtual machine \"$vmname\" ..."
virtio_diskdev="$disk_dev0"
while [ 1 ]; do while [ 1 ]; do
${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1 ${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
@ -189,12 +207,33 @@ while [ 1 ]; do
break break
fi 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 \ ${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -A -H -P \
-g ${gdbport} \ -g ${gdbport} \
-s 0:0,hostbridge \ -s 0:0,hostbridge \
-s 1:0,lpc \ -s 1:0,lpc \
-s 2:0,virtio-net,${tapdev} \ ${devargs} \
-s 3:0,virtio-blk,${virtio_diskdev} \
-l com1,${console} \ -l com1,${console} \
${installer_opt} \ ${installer_opt} \
${vmname} ${vmname}