Advertisement
Guest User

Untitled

a guest
May 29th, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.93 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3. # Copyright (c) 2013 NetApp, Inc.
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. # 1. Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. # 2. Redistributions in binary form must reproduce the above copyright
  12. # notice, this list of conditions and the following disclaimer in the
  13. # documentation and/or other materials provided with the distribution.
  14. #
  15. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  16. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  19. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. # SUCH DAMAGE.
  26. #
  27. # $FreeBSD$
  28. #
  29.  
  30. LOADER=/usr/sbin/bhyveload
  31. BHYVECTL=/usr/sbin/bhyvectl
  32. FBSDRUN=/usr/sbin/bhyve
  33.  
  34. DEFAULT_MEMSIZE=512M
  35. DEFAULT_CPUS=2
  36. DEFAULT_TAPDEV=tap0
  37. DEFAULT_CONSOLE=stdio
  38.  
  39. DEFAULT_VIRTIO_DISK="./diskdev"
  40. DEFAULT_ISOFILE="./release.iso"
  41.  
  42. errmsg() {
  43. echo "*** $1"
  44. }
  45.  
  46. usage() {
  47. local msg=$1
  48.  
  49. echo "Usage: vmrun.sh [-ahi] [-c <CPUs>] [-C <console>] [-d <disk file>]"
  50. echo " [-e <name=value>] [-g <gdbport> ] [-H <directory>]"
  51. echo " [-I <location of installation iso>] [-m <memsize>]"
  52. echo " [-t <tapdev>] <vmname>"
  53. echo ""
  54. echo " -h: display this help message"
  55. echo " -a: force memory mapped local APIC access"
  56. echo " -c: number of virtual cpus (default is ${DEFAULT_CPUS})"
  57. echo " -C: console device (default is ${DEFAULT_CONSOLE})"
  58. echo " -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})"
  59. echo " -e: set FreeBSD loader environment variable"
  60. echo " -g: listen for connection from kgdb at <gdbport>"
  61. echo " -H: host filesystem to export to the loader"
  62. echo " -i: force boot of the Installation CDROM image"
  63. echo " -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})"
  64. echo " -m: memory size (default is ${DEFAULT_MEMSIZE})"
  65. echo " -p: pass-through a host PCI device at bus/slot/func (e.g. 10/0/0)"
  66. echo " -t: tap device for virtio-net (default is $DEFAULT_TAPDEV)"
  67. echo ""
  68. [ -n "$msg" ] && errmsg "$msg"
  69. exit 1
  70. }
  71.  
  72. if [ `id -u` -ne 0 ]; then
  73. errmsg "This script must be executed with superuser privileges"
  74. exit 1
  75. fi
  76.  
  77. kldstat -n vmm > /dev/null 2>&1
  78. if [ $? -ne 0 ]; then
  79. errmsg "vmm.ko is not loaded"
  80. exit 1
  81. fi
  82.  
  83. force_install=0
  84. isofile=${DEFAULT_ISOFILE}
  85. memsize=${DEFAULT_MEMSIZE}
  86. console=${DEFAULT_CONSOLE}
  87. cpus=${DEFAULT_CPUS}
  88. tap_total=0
  89. disk_total=0
  90. apic_opt=""
  91. gdbport=0
  92. loader_opt=""
  93. pass_total=0
  94.  
  95. while getopts ac:C:d:e:g:hH:iI:m:p:t: c ; do
  96. case $c in
  97. a)
  98. apic_opt="-a"
  99. ;;
  100. c)
  101. cpus=${OPTARG}
  102. ;;
  103. C)
  104. console=${OPTARG}
  105. ;;
  106. d)
  107. eval "disk_dev${disk_total}=\"${OPTARG}\""
  108. disk_total=$(($disk_total + 1))
  109. ;;
  110. e)
  111. loader_opt="${loader_opt} -e ${OPTARG}"
  112. ;;
  113. g)
  114. gdbport=${OPTARG}
  115. ;;
  116. H)
  117. host_base=`realpath ${OPTARG}`
  118. ;;
  119. i)
  120. force_install=1
  121. ;;
  122. I)
  123. isofile=${OPTARG}
  124. ;;
  125. m)
  126. memsize=${OPTARG}
  127. ;;
  128. p)
  129. eval "pass_dev${pass_total}=\"${OPTARG}\""
  130. pass_total=$(($pass_total + 1))
  131. ;;
  132. t)
  133. eval "tap_dev${tap_total}=\"${OPTARG}\""
  134. tap_total=$(($tap_total + 1))
  135. ;;
  136. *)
  137. usage
  138. ;;
  139. esac
  140. done
  141.  
  142. if [ $tap_total -eq 0 ] ; then
  143. tap_total=1
  144. tap_dev0="${DEFAULT_TAPDEV}"
  145. fi
  146. if [ $disk_total -eq 0 ] ; then
  147. disk_total=1
  148. disk_dev0="${DEFAULT_VIRTIO_DISK}"
  149.  
  150. fi
  151.  
  152. shift $((${OPTIND} - 1))
  153.  
  154. if [ $# -ne 1 ]; then
  155. usage "virtual machine name not specified"
  156. fi
  157.  
  158. vmname="$1"
  159. if [ -n "${host_base}" ]; then
  160. loader_opt="${loader_opt} -h ${host_base}"
  161. fi
  162.  
  163. make_and_check_diskdev()
  164. {
  165. local virtio_diskdev="$1"
  166. # Create the virtio diskdev file if needed
  167. if [ ! -e ${virtio_diskdev} ]; then
  168. echo "virtio disk device file \"${virtio_diskdev}\" does not exist."
  169. echo "Creating it ..."
  170. truncate -s 8G ${virtio_diskdev} > /dev/null
  171. fi
  172.  
  173. if [ ! -r ${virtio_diskdev} ]; then
  174. echo "virtio disk device file \"${virtio_diskdev}\" is not readable"
  175. exit 1
  176. fi
  177.  
  178. if [ ! -w ${virtio_diskdev} ]; then
  179. echo "virtio disk device file \"${virtio_diskdev}\" is not writable"
  180. exit 1
  181. fi
  182. }
  183.  
  184. echo "Launching virtual machine \"$vmname\" ..."
  185.  
  186. virtio_diskdev="$disk_dev0"
  187.  
  188. ${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
  189.  
  190. while [ 1 ]; do
  191.  
  192. file -s ${virtio_diskdev} | grep "boot sector" > /dev/null
  193. rc=$?
  194. if [ $rc -ne 0 ]; then
  195. file -s ${virtio_diskdev} | grep ": Unix Fast File sys" > /dev/null
  196. rc=$?
  197. fi
  198. if [ $rc -ne 0 ]; then
  199. need_install=1
  200. else
  201. need_install=0
  202. fi
  203.  
  204. if [ $force_install -eq 1 -o $need_install -eq 1 ]; then
  205. if [ ! -r ${isofile} ]; then
  206. echo -n "Installation CDROM image \"${isofile}\" "
  207. echo "is not readable"
  208. exit 1
  209. fi
  210. BOOTDISK=${isofile}
  211. installer_opt="-s 31:0,ahci-cd,${BOOTDISK}"
  212. else
  213. BOOTDISK=${virtio_diskdev}
  214. installer_opt=""
  215. fi
  216.  
  217. ${LOADER} -c ${console} -m ${memsize} -d ${BOOTDISK} ${loader_opt} \
  218. ${vmname}
  219. bhyve_exit=$?
  220. if [ $bhyve_exit -ne 0 ]; then
  221. break
  222. fi
  223.  
  224. #
  225. # Build up args for additional tap and disk devices now.
  226. #
  227. nextslot=2 # slot 0 is hostbridge, slot 1 is lpc
  228. devargs="" # accumulate disk/tap args here
  229. i=0
  230. while [ $i -lt $tap_total ] ; do
  231. eval "tapname=\$tap_dev${i}"
  232. devargs="$devargs -s $nextslot:0,virtio-net,${tapname} "
  233. nextslot=$(($nextslot + 1))
  234. i=$(($i + 1))
  235. done
  236.  
  237. i=0
  238. while [ $i -lt $disk_total ] ; do
  239. eval "disk=\$disk_dev${i}"
  240. make_and_check_diskdev "${disk}"
  241. devargs="$devargs -s $nextslot:0,virtio-blk,${disk} "
  242. nextslot=$(($nextslot + 1))
  243. i=$(($i + 1))
  244. done
  245.  
  246. i=0
  247. while [ $i -lt $pass_total ] ; do
  248. eval "pass=\$pass_dev${i}"
  249. devargs="$devargs -s $nextslot:0,passthru,${pass} "
  250. nextslot=$(($nextslot + 1))
  251. i=$(($i + 1))
  252. done
  253.  
  254. ${FBSDRUN} -c ${cpus} -m ${memsize} ${apic_opt} -A -H -P \
  255. -g ${gdbport} \
  256. -s 0:0,hostbridge \
  257. -s 1:0,lpc \
  258. ${devargs} \
  259. -l com1,${console} \
  260. ${installer_opt} \
  261. ${vmname}
  262.  
  263. bhyve_exit=$?
  264. # bhyve returns the following status codes:
  265. # 0 - VM has been reset
  266. # 1 - VM has been powered off
  267. # 2 - VM has been halted
  268. # 3 - VM generated a triple fault
  269. # all other non-zero status codes are errors
  270. #
  271. if [ $bhyve_exit -ne 0 ]; then
  272. break
  273. fi
  274. done
  275.  
  276.  
  277. case $bhyve_exit in
  278. 0|1|2)
  279. # Cleanup /dev/vmm entry when bhyve did not exit
  280. # due to an error.
  281. ${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
  282. ;;
  283. esac
  284.  
  285. exit $bhyve_exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement