1#!/usr/bin/env bash 2 3# create_vbox.sh 4# 5# Creates a virtual box with vagrant in the $PWD. 6# 7# This script creates a subdirectory called $PWD/<distro> and copies the Vagrantfile 8# into that directory before running 'vagrant up' 9 10set -e 11 12VAGRANT_TARGET="$PWD" 13 14DIR="$(cd "$(dirname $0)" && pwd)" 15SPDK_DIR="$(cd "${DIR}/../../" && pwd)" 16 17# The command line help 18display_help() { 19 echo 20 echo " Usage: ${0##*/} [-b nvme-backing-file] [-n <num-cpus>] [-s <ram-size>] [-x <http-proxy>] [-hvrldcuf] <distro>" 21 echo 22 echo " distro = <centos7 | centos8| ubuntu1604 | ubuntu1804 | ubuntu2004 |" 23 echo " fedora32 | fedora33 | fedora34 | freebsd11 | freebsd12 | arch | clearlinux>" 24 echo 25 echo " -s <ram-size> in MB Default: ${SPDK_VAGRANT_VMRAM}" 26 echo " -n <num-cpus> 1 to 4 Default: ${SPDK_VAGRANT_VMCPU}" 27 echo " -x <http-proxy> Default: \"${SPDK_VAGRANT_HTTP_PROXY}\"" 28 echo " -p <provider> \"libvirt\" or \"virtualbox\". Default: ${SPDK_VAGRANT_PROVIDER}" 29 echo " -b <nvme-backing-file> Emulated NVMe options." 30 echo " If no -b option is specified then this option defaults to emulating single" 31 echo " NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img" 32 echo " -b option can be used multiple times for attaching multiple files to the VM" 33 echo " Parameters for -b option: <path>,<type>,<namespaces>,<cmb>,<pmr_file[:pmr_size]>" 34 echo " Available types: nvme" 35 echo " Default pmr size: 16M" 36 echo " Default cmb: false" 37 echo " -c Create all above disk, default 0" 38 echo " -H Use hugepages for allocating VM memory. Only for libvirt provider. Default: false." 39 echo " -u Use password authentication to the VM instead of SSH keys." 40 echo " -l Use a local copy of spdk, don't try to rsync from the host." 41 echo " -a Copy spdk/autorun.sh artifacts from VM to host system." 42 echo " -d Deploy a test vm by provisioning all prerequisites for spdk autotest" 43 echo " -o Add network interface for openstack tests" 44 echo " --qemu-emulator=<path> Path to custom QEMU binary. Only works with libvirt provider" 45 echo " --vagrantfiles-dir=<path> Destination directory to put Vagrantfile into." 46 echo " --package-box Install all dependencies for SPDK and create a local vagrant box version." 47 echo " --vagrantfile=<path> Path to a custom Vagrantfile" 48 echo " -r dry-run" 49 echo " -h help" 50 echo " -v verbose" 51 echo " -f Force use of given distro, regardless if it's supported by the script or not." 52 echo " --box-version Version of the vagrant box to select for given distro." 53 echo " Examples:" 54 echo 55 echo " $0 -x http://user:password@host:port fedora33" 56 echo " $0 -s 2048 -n 2 ubuntu16" 57 echo " $0 -rv freebsd" 58 echo " $0 fedora33" 59 echo " $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora33" 60 echo " $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 fedora33" 61 echo 62} 63 64# Set up vagrant proxy. Assumes git-bash on Windows 65# https://stackoverflow.com/questions/19872591/how-to-use-vagrant-in-a-proxy-environment 66SPDK_VAGRANT_HTTP_PROXY="" 67 68VERBOSE=0 69HELP=0 70COPY_SPDK_DIR=1 71COPY_SPDK_ARTIFACTS=0 72DRY_RUN=0 73DEPLOY_TEST_VM=0 74SPDK_VAGRANT_DISTRO="distro" 75SPDK_VAGRANT_VMCPU=4 76SPDK_VAGRANT_VMRAM=4096 77SPDK_VAGRANT_PROVIDER="virtualbox" 78SPDK_QEMU_EMULATOR="" 79SPDK_OPENSTACK_NETWORK=0 80OPTIND=1 81NVME_DISKS_TYPE="" 82NVME_DISKS_NAMESPACES="" 83NVME_FILE="" 84NVME_AUTO_CREATE=0 85VAGRANTFILE_DIR="" 86VAGRANT_PASSWORD_AUTH=0 87VAGRANT_PACKAGE_BOX=0 88VAGRANT_HUGE_MEM=0 89VAGRANTFILE=$DIR/Vagrantfile 90FORCE_DISTRO=false 91VAGRANT_BOX_VERSION="" 92 93while getopts ":b:n:s:x:p:uvcraldoHhf-:" opt; do 94 case "${opt}" in 95 -) 96 case "${OPTARG}" in 97 package-box) VAGRANT_PACKAGE_BOX=1 ;; 98 qemu-emulator=*) SPDK_QEMU_EMULATOR="${OPTARG#*=}" ;; 99 vagrantfiles-dir=*) VAGRANTFILE_DIR="${OPTARG#*=}" ;; 100 vagrantfile=*) [[ -n ${OPTARG#*=} ]] && VAGRANTFILE="${OPTARG#*=}" ;; 101 box-version=*) [[ -n ${OPTARG#*=} ]] && VAGRANT_BOX_VERSION="${OPTARG#*=}" ;; 102 *) echo "Invalid argument '$OPTARG'" ;; 103 esac 104 ;; 105 x) 106 http_proxy=$OPTARG 107 https_proxy=$http_proxy 108 SPDK_VAGRANT_HTTP_PROXY="${http_proxy}" 109 ;; 110 n) 111 SPDK_VAGRANT_VMCPU=$OPTARG 112 ;; 113 s) 114 SPDK_VAGRANT_VMRAM=$OPTARG 115 ;; 116 p) 117 SPDK_VAGRANT_PROVIDER=$OPTARG 118 ;; 119 v) 120 VERBOSE=1 121 ;; 122 c) 123 NVME_AUTO_CREATE=1 124 ;; 125 r) 126 DRY_RUN=1 127 ;; 128 h) 129 display_help >&2 130 exit 0 131 ;; 132 a) 133 COPY_SPDK_ARTIFACTS=1 134 ;; 135 l) 136 COPY_SPDK_DIR=0 137 ;; 138 d) 139 DEPLOY_TEST_VM=1 140 ;; 141 o) 142 SPDK_OPENSTACK_NETWORK=1 143 ;; 144 b) 145 NVME_FILE+="${OPTARG#*=} " 146 ;; 147 u) 148 VAGRANT_PASSWORD_AUTH=1 149 ;; 150 H) 151 VAGRANT_HUGE_MEM=1 152 ;; 153 f) 154 FORCE_DISTRO=true 155 ;; 156 *) 157 echo " Invalid argument: -$OPTARG" >&2 158 echo " Try: \"$0 -h\"" >&2 159 exit 1 160 ;; 161 esac 162done 163 164shift "$((OPTIND - 1))" # Discard the options and sentinel -- 165 166SPDK_VAGRANT_DISTRO="$*" 167 168case "${SPDK_VAGRANT_DISTRO}" in 169 centos[78]) ;& 170 ubuntu1[68]04 | ubuntu2004) ;& 171 fedora3[2-4]) ;& 172 freebsd1[12]) ;& 173 arch | clearlinux) ;; 174 *) 175 if [[ $FORCE_DISTRO == false ]]; then 176 echo " Invalid argument \"${SPDK_VAGRANT_DISTRO}\"" >&2 177 echo " Try: \"$0 -h\"" >&2 178 exit 1 179 fi 180 ;; 181esac 182export SPDK_VAGRANT_DISTRO 183 184if [ -z "$NVME_FILE" ]; then 185 TMP="/var/lib/libvirt/images/nvme_disk.img" 186 NVME_DISKS_TYPE="nvme" 187else 188 TMP="" 189 for args in $NVME_FILE; do 190 while IFS=, read -r path type namespace cmb pmr; do 191 TMP+="$path," 192 if [ -z "$type" ]; then 193 type="nvme" 194 fi 195 if [[ -n $cmb ]]; then 196 NVME_CMB=${NVME_CMB:+$NVME_CMB,}$cmb 197 fi 198 if [[ -n $pmr ]]; then 199 NVME_PMR=${NVME_PMR:+$NVME_PMR,}$pmr 200 fi 201 NVME_DISKS_TYPE+="$type," 202 if [ -z "$namespace" ] && [ -n "$SPDK_QEMU_EMULATOR" ]; then 203 namespace="1" 204 fi 205 NVME_DISKS_NAMESPACES+="$namespace," 206 if [ ${NVME_AUTO_CREATE} = 1 ]; then 207 $SPDK_DIR/scripts/vagrant/create_nvme_img.sh -t $type -n $path 208 fi 209 done <<< $args 210 done 211fi 212NVME_FILE=$TMP 213 214if [ ${VERBOSE} = 1 ]; then 215 echo 216 echo DIR=${DIR} 217 echo SPDK_DIR=${SPDK_DIR} 218 echo VAGRANT_TARGET=${VAGRANT_TARGET} 219 echo HELP=$HELP 220 echo DRY_RUN=$DRY_RUN 221 echo NVME_FILE=$NVME_FILE 222 echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE 223 echo NVME_AUTO_CREATE=$NVME_AUTO_CREATE 224 echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES 225 echo NVME_CMB=$NVME_CMB 226 echo NVME_PMR=$NVME_PMR 227 echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO 228 echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU 229 echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM 230 echo SPDK_VAGRANT_PROVIDER=$SPDK_VAGRANT_PROVIDER 231 echo SPDK_VAGRANT_HTTP_PROXY=$SPDK_VAGRANT_HTTP_PROXY 232 echo SPDK_QEMU_EMULATOR=$SPDK_QEMU_EMULATOR 233 echo SPDK_OPENSTACK_NETWORK=$SPDK_OPENSTACK_NETWORK 234 echo VAGRANT_PACKAGE_BOX=$VAGRANT_PACKAGE_BOX 235 echo VAGRANTFILE=$VAGRANTFILE 236 echo FORCE_DISTRO=$FORCE_DISTRO 237 echo VAGRANT_BOX_VERSION=$VAGRANT_BOX_VERSION 238 echo 239fi 240 241export SPDK_VAGRANT_HTTP_PROXY 242export SPDK_VAGRANT_VMCPU 243export SPDK_VAGRANT_VMRAM 244export SPDK_DIR 245export SPDK_OPENSTACK_NETWORK 246export COPY_SPDK_DIR 247export COPY_SPDK_ARTIFACTS 248export DEPLOY_TEST_VM 249export NVME_CMB 250export NVME_PMR 251export NVME_DISKS_TYPE 252export NVME_DISKS_NAMESPACES 253export NVME_FILE 254export VAGRANT_PASSWORD_AUTH 255export VAGRANT_HUGE_MEM 256export FORCE_DISTRO 257export VAGRANT_BOX_VERSION 258 259if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then 260 provider="--provider=${SPDK_VAGRANT_PROVIDER}" 261fi 262 263if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then 264 export SPDK_VAGRANT_PROVIDER 265fi 266 267if [ -n "$SPDK_QEMU_EMULATOR" ] && [ "$SPDK_VAGRANT_PROVIDER" == "libvirt" ]; then 268 export SPDK_QEMU_EMULATOR 269fi 270 271if [ ${DRY_RUN} = 1 ]; then 272 echo "Environemnt Variables" 273 printenv SPDK_VAGRANT_DISTRO 274 printenv SPDK_VAGRANT_VMRAM 275 printenv SPDK_VAGRANT_VMCPU 276 printenv SPDK_VAGRANT_PROVIDER 277 printenv SPDK_VAGRANT_HTTP_PROXY 278 printenv SPDK_QEMU_EMULATOR 279 printenv NVME_DISKS_TYPE 280 printenv NVME_AUTO_CREATE 281 printenv NVME_DISKS_NAMESPACES 282 printenv NVME_FILE 283 printenv SPDK_DIR 284 printenv VAGRANT_HUGE_MEM 285 printenv VAGRANTFILE 286 printenv FORCE_DISTRO 287 printenv VAGRANT_BOX_VERSION 288fi 289if [ -z "$VAGRANTFILE_DIR" ]; then 290 VAGRANTFILE_DIR="${VAGRANT_TARGET}/${SPDK_VAGRANT_DISTRO}-${SPDK_VAGRANT_PROVIDER}" 291 export VAGRANTFILE_DIR 292fi 293 294if [ -d "${VAGRANTFILE_DIR}" ]; then 295 echo "Error: ${VAGRANTFILE_DIR} already exists!" 296 exit 1 297fi 298 299if [[ ! -f $VAGRANTFILE ]]; then 300 echo "$VAGRANTFILE is not a regular file!" 301 exit 1 302fi 303 304if [ ${DRY_RUN} != 1 ]; then 305 mkdir -vp "${VAGRANTFILE_DIR}" 306 ln -s "$VAGRANTFILE" "${VAGRANTFILE_DIR}/Vagrantfile" 307 pushd "${VAGRANTFILE_DIR}" 308 if [ -n "${http_proxy}" ]; then 309 export http_proxy 310 export https_proxy 311 if echo "$SPDK_VAGRANT_DISTRO" | grep -q freebsd; then 312 cat > ~/vagrant_pkg.conf << EOF 313pkg_env: { 314http_proxy: ${http_proxy} 315} 316EOF 317 fi 318 fi 319 mkdir -p "${VAGRANTFILE_DIR}/output" 320 vagrant up $provider 321 if [ ${VAGRANT_PACKAGE_BOX} == 1 ]; then 322 vagrant ssh -c 'sudo spdk_repo/spdk/scripts/vagrant/update.sh' 323 vagrant halt 324 vagrant package --output spdk_${SPDK_VAGRANT_DISTRO}.box 325 vagrant box add spdk/${SPDK_VAGRANT_DISTRO} spdk_${SPDK_VAGRANT_DISTRO}.box \ 326 && rm spdk_${SPDK_VAGRANT_DISTRO}.box 327 vagrant destroy 328 fi 329 echo "" 330 echo " SUCCESS!" 331 echo "" 332 echo " cd to ${VAGRANTFILE_DIR} and type \"vagrant ssh\" to use." 333 echo " Use vagrant \"suspend\" and vagrant \"resume\" to stop and start." 334 echo " Use vagrant \"destroy\" followed by \"rm -rf ${VAGRANTFILE_DIR}\" to destroy all trace of vm." 335 echo "" 336fi 337