diff --git a/scripts/vagrant/Vagrantfile b/scripts/vagrant/Vagrantfile index 030abe544..9110ff7bd 100644 --- a/scripts/vagrant/Vagrantfile +++ b/scripts/vagrant/Vagrantfile @@ -98,6 +98,9 @@ Vagrant.configure(2) do |config| vhost_host_dir=(ENV['VHOST_HOST_DIR'] || "none") vhost_vm_dir=(ENV['VHOST_VM_DIR'] || "none") vmemulator=(ENV['SPDK_QEMU_EMULATOR'] || "") + emulated_nvme_types=(ENV['NVME_DISKS_TYPE'] || "nvme").split(',') + nvme_namespaces=(ENV['NVME_DISKS_NAMESPACES'] || "").split(',') + nvme_file=(ENV['NVME_FILE'] || "").split(',') config.ssh.forward_agent = true config.ssh.forward_x11 = true @@ -131,20 +134,42 @@ Vagrant.configure(2) do |config| # we put nvme_disk inside default pool to eliminate libvirt/SELinux Permissions Problems # and to be able to run vagrant from user $HOME directory - if ENV['NVME_FILE'] - nvme_disk="/var/lib/libvirt/images/" + ENV['NVME_FILE'] - else - nvme_disk="/var/lib/libvirt/images/nvme_disk.img" - end - unless File.exist? (nvme_disk) - puts "If run with libvirt provider please execute create_nvme_img.sh" - end + # Loop to create all emulated disks set + emulated_nvme_types.each_with_index { |disk, index| + if ENV['NVME_FILE'] + nvme_disk_id="#{disk}" + "-#{index}" + nvme_disk="#{nvme_file["#{index}".to_i]}" + else + nvme_disk="/var/lib/libvirt/images/nvme_disk.img" + end + + unless File.exist? (nvme_disk) + puts "If run with libvirt provider please execute create_nvme_img.sh" + end + + if disk == "nvme" + libvirt.qemuargs :value => "-drive" + libvirt.qemuargs :value => "format=raw,file=#{nvme_disk},if=none,id=#{nvme_disk_id}" + libvirt.qemuargs :value => "-device" + if nvme_namespaces["#{index}".to_i].nil? + libvirt.qemuargs :value => "nvme,drive=#{nvme_disk_id},serial=1234#{index}" + else + libvirt.qemuargs :value => "nvme,drive=#{nvme_disk_id},serial=1234#{index},namespaces=#{nvme_namespaces["#{index}".to_i]}" + end + elsif disk == "ocssd" + libvirt.qemuargs :value => "-drive" + libvirt.qemuargs :value => "format=raw,file=#{nvme_disk},if=none,id=#{nvme_disk_id}" + libvirt.qemuargs :value => "-device" + # create ocssd drive with special parameters + # lba_index=4 it is LBA namespace format, 4 means that block size is 4K and have 64B metadata + # lnum_lun, lnum_pln, lpgs_per_blk, lsecs_per_pg, lblks_per_pln this are parameters describing the device geometry + # we need to multiply these parameters by ourselves to have backend file minimal size: + # in our case: 4K * 8 * 2 * 1536 * 2 * 45 = 8640 MB + libvirt.qemuargs :value => "nvme,drive=#{nvme_disk_id},serial=deadbeef,oacs=0,namespaces=1,lver=2,lba_index=4,mdts=10,lnum_lun=8,lnum_pln=2,lpgs_per_blk=1536,lsecs_per_pg=2,lblks_per_pln=45,metadata=/var/lib/libvirt/images/ocssd_md,nsdatafile=/var/lib/libvirt/images/ocssd_blknvme.ns,laer_thread_sleep=3000,stride=4" + end + } - libvirt.qemuargs :value => "-drive" - libvirt.qemuargs :value => "file=#{nvme_disk},if=none,id=D22" - libvirt.qemuargs :value => "-device" - libvirt.qemuargs :value => "nvme,drive=D22,serial=1234" libvirt.driver = "kvm" libvirt.graphics_type = "vnc" libvirt.memory = "#{vmram}" diff --git a/scripts/vagrant/create_nvme_img.sh b/scripts/vagrant/create_nvme_img.sh index 17f6f1f3f..4c3594b03 100755 --- a/scripts/vagrant/create_nvme_img.sh +++ b/scripts/vagrant/create_nvme_img.sh @@ -2,14 +2,16 @@ SYSTEM=$(uname -s) size="1024M" name="nvme_disk.img" +type="nvme" function usage() { echo "Usage: ${0##*/} [-s ] [-n ]" echo "-s with postfix e.g. 2G default: 1024M" echo "-n default: nvme_disk.img" + echo "-t default: nvme available: ocssd" } -while getopts "s:n:h-:" opt; do +while getopts "s:n:t:h-:" opt; do case "${opt}" in -) echo " Invalid argument: $OPTARG" @@ -22,6 +24,9 @@ while getopts "s:n:h-:" opt; do n) name=$OPTARG ;; + t) + type=$OPTARG + ;; h) usage exit 0 @@ -37,8 +42,19 @@ done if [ ! "${SYSTEM}" = "FreeBSD" ]; then WHICH_OS=$(lsb_release -i | awk '{print $3}') nvme_disk="/var/lib/libvirt/images/$name" - - qemu-img create -f raw $nvme_disk ${size} + case $type in + "nvme") + qemu-img create -f raw $nvme_disk ${size} + ;; + "ocssd") + fallocate -l ${size} $nvme_disk + touch /var/lib/libvirt/images/ocssd_md + ;; + *) + echo "We support only nvme and ocssd disks types" + exit 1 + ;; + esac #Change SE Policy on Fedora if [ $WHICH_OS == "Fedora" ]; then sudo chcon -t svirt_image_t $nvme_disk diff --git a/scripts/vagrant/create_vbox.sh b/scripts/vagrant/create_vbox.sh index 0cb9c131d..32ef74a16 100755 --- a/scripts/vagrant/create_vbox.sh +++ b/scripts/vagrant/create_vbox.sh @@ -19,7 +19,11 @@ display_help() { echo echo " distro = " echo - echo " -b default: ${NVME_FILE}" + echo " -b nvme file path with name" + echo " type of emulated nvme disk" + echo " usage: type types available: ocssd, nvme" + echo " If no -b option is specified then this option defaults to emulating single" + echo " NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img" echo " -s in kb default: ${SPDK_VAGRANT_VMRAM}" echo " -n 1 to 4 default: ${SPDK_VAGRANT_VMCPU}" echo " -x default: \"${SPDK_VAGRANT_HTTP_PROXY}\"" @@ -39,7 +43,10 @@ display_help() { echo " $0 -x http://user:password@host:port fedora28" echo " $0 -s 2048 -n 2 ubuntu16" echo " $0 -rv freebsd" - echo " $0 fedora28 " + echo " $0 fedora28" + echo " $0 -b /var/lib/libvirt/images/nvme1.img,nvme,1 fedora30" + echo " $0 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30" + echo " $0 -b /var/lib/libvirt/images/nvme5.img,nvme,5 -b /var/lib/libvirt/images/ocssd.img,ocssd fedora30" echo } @@ -58,7 +65,9 @@ SPDK_VAGRANT_VMRAM=4096 SPDK_VAGRANT_PROVIDER="virtualbox" SPDK_QEMU_EMULATOR="" OPTIND=1 -NVME_FILE="nvme_disk.img" +NVME_DISKS_TYPE="" +NVME_DISKS_NAMESPACES="" +NVME_FILE="" while getopts ":b:n:s:x:p:vrldh-:" opt; do case "${opt}" in @@ -101,7 +110,7 @@ while getopts ":b:n:s:x:p:vrldh-:" opt; do DEPLOY_TEST_VM=1 ;; b) - NVME_FILE=$OPTARG + NVME_FILE+="${OPTARG#*=} " ;; *) echo " Invalid argument: -$OPTARG" >&2 @@ -151,6 +160,27 @@ if ! echo "$SPDK_VAGRANT_DISTRO" | grep -q fedora && [ $DEPLOY_TEST_VM -eq 1 ]; echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build" DEPLOY_TEST_VM=0 fi +if [ -z "$NVME_FILE" ]; then + TMP="/var/lib/libvirt/images/nvme_disk.img" + NVME_DISKS_TYPE="nvme" + NVME_DISKS_NAMESPACES="1" +else + TMP="" + for args in $NVME_FILE; do + while IFS=, read -r path type namespace; do + TMP+="$path,"; + if [ -z "$type" ]; then + type="nvme" + fi + NVME_DISKS_TYPE+="$type,"; + if [ -z "$namespace" ]; then + namespace="1" + fi + NVME_DISKS_NAMESPACES+="$namespace,"; + done <<< $args + done +fi +NVME_FILE=$TMP if [ ${VERBOSE} = 1 ]; then echo @@ -160,6 +190,8 @@ if [ ${VERBOSE} = 1 ]; then echo HELP=$HELP echo DRY_RUN=$DRY_RUN echo NVME_FILE=$NVME_FILE + echo NVME_DISKS_TYPE=$NVME_DISKS_TYPE + echo NVME_DISKS_NAMESPACES=$NVME_DISKS_NAMESPACES echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM @@ -177,6 +209,8 @@ export SPDK_VAGRANT_VMRAM export SPDK_DIR export COPY_SPDK_DIR export DEPLOY_TEST_VM +export NVME_DISKS_TYPE +export NVME_DISKS_NAMESPACES export NVME_FILE if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then @@ -207,6 +241,9 @@ if [ ${DRY_RUN} = 1 ]; then printenv SPDK_VAGRANT_PROVIDER printenv SPDK_VAGRANT_HTTP_PROXY printenv SPDK_QEMU_EMULATOR + printenv NVME_DISKS_TYPE + printenv NVME_DISKS_NAMESPACES + printenv NVME_FILE printenv SPDK_DIR fi