scripts/vagrant: Add more NVMe emulation options

Current scripts/vagrant allow us to create only a single file for
emulating NVMe with single namespace.
This patch allow to create multiple emulated drives with multiple namespaces.
This patch also allows to emulate OCSSD disks which are used in OCF tests.

Change-Id: Ia7a4667bd405ba18235e72bcdf608270002b5242
Signed-off-by: Maciej Wawryk <maciejx.wawryk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/466555
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Seth Howell <seth.howell@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Maciej Wawryk 2019-08-28 16:08:21 +02:00 committed by Tomasz Zawadzki
parent 8cad9cc10a
commit ff231506d3
3 changed files with 97 additions and 19 deletions

View File

@ -98,6 +98,9 @@ Vagrant.configure(2) do |config|
vhost_host_dir=(ENV['VHOST_HOST_DIR'] || "none") vhost_host_dir=(ENV['VHOST_HOST_DIR'] || "none")
vhost_vm_dir=(ENV['VHOST_VM_DIR'] || "none") vhost_vm_dir=(ENV['VHOST_VM_DIR'] || "none")
vmemulator=(ENV['SPDK_QEMU_EMULATOR'] || "") 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_agent = true
config.ssh.forward_x11 = true config.ssh.forward_x11 = true
@ -131,8 +134,12 @@ Vagrant.configure(2) do |config|
# we put nvme_disk inside default pool to eliminate libvirt/SELinux Permissions Problems # we put nvme_disk inside default pool to eliminate libvirt/SELinux Permissions Problems
# and to be able to run vagrant from user $HOME directory # and to be able to run vagrant from user $HOME directory
# Loop to create all emulated disks set
emulated_nvme_types.each_with_index { |disk, index|
if ENV['NVME_FILE'] if ENV['NVME_FILE']
nvme_disk="/var/lib/libvirt/images/" + ENV['NVME_FILE'] nvme_disk_id="#{disk}" + "-#{index}"
nvme_disk="#{nvme_file["#{index}".to_i]}"
else else
nvme_disk="/var/lib/libvirt/images/nvme_disk.img" nvme_disk="/var/lib/libvirt/images/nvme_disk.img"
end end
@ -141,10 +148,28 @@ Vagrant.configure(2) do |config|
puts "If run with libvirt provider please execute create_nvme_img.sh" puts "If run with libvirt provider please execute create_nvme_img.sh"
end end
if disk == "nvme"
libvirt.qemuargs :value => "-drive" libvirt.qemuargs :value => "-drive"
libvirt.qemuargs :value => "file=#{nvme_disk},if=none,id=D22" libvirt.qemuargs :value => "format=raw,file=#{nvme_disk},if=none,id=#{nvme_disk_id}"
libvirt.qemuargs :value => "-device" libvirt.qemuargs :value => "-device"
libvirt.qemuargs :value => "nvme,drive=D22,serial=1234" 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.driver = "kvm" libvirt.driver = "kvm"
libvirt.graphics_type = "vnc" libvirt.graphics_type = "vnc"
libvirt.memory = "#{vmram}" libvirt.memory = "#{vmram}"

View File

@ -2,14 +2,16 @@
SYSTEM=$(uname -s) SYSTEM=$(uname -s)
size="1024M" size="1024M"
name="nvme_disk.img" name="nvme_disk.img"
type="nvme"
function usage() { function usage() {
echo "Usage: ${0##*/} [-s <disk_size>] [-n <backing file name>]" echo "Usage: ${0##*/} [-s <disk_size>] [-n <backing file name>]"
echo "-s <disk_size> with postfix e.g. 2G default: 1024M" echo "-s <disk_size> with postfix e.g. 2G default: 1024M"
echo "-n <backing file name> default: nvme_disk.img" echo "-n <backing file name> default: nvme_disk.img"
echo "-t <type> default: nvme available: ocssd"
} }
while getopts "s:n:h-:" opt; do while getopts "s:n:t:h-:" opt; do
case "${opt}" in case "${opt}" in
-) -)
echo " Invalid argument: $OPTARG" echo " Invalid argument: $OPTARG"
@ -22,6 +24,9 @@ while getopts "s:n:h-:" opt; do
n) n)
name=$OPTARG name=$OPTARG
;; ;;
t)
type=$OPTARG
;;
h) h)
usage usage
exit 0 exit 0
@ -37,8 +42,19 @@ done
if [ ! "${SYSTEM}" = "FreeBSD" ]; then if [ ! "${SYSTEM}" = "FreeBSD" ]; then
WHICH_OS=$(lsb_release -i | awk '{print $3}') WHICH_OS=$(lsb_release -i | awk '{print $3}')
nvme_disk="/var/lib/libvirt/images/$name" nvme_disk="/var/lib/libvirt/images/$name"
case $type in
"nvme")
qemu-img create -f raw $nvme_disk ${size} 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 #Change SE Policy on Fedora
if [ $WHICH_OS == "Fedora" ]; then if [ $WHICH_OS == "Fedora" ]; then
sudo chcon -t svirt_image_t $nvme_disk sudo chcon -t svirt_image_t $nvme_disk

View File

@ -19,7 +19,11 @@ display_help() {
echo echo
echo " distro = <centos7 | ubuntu16 | ubuntu18 | fedora28 | fedora29 | fedora 30 | freebsd11> " echo " distro = <centos7 | ubuntu16 | ubuntu18 | fedora28 | fedora29 | fedora 30 | freebsd11> "
echo echo
echo " -b <nvme-backing-file> default: ${NVME_FILE}" echo " -b <nvme-backing-file> nvme file path with name"
echo " type of emulated nvme disk"
echo " usage: type <number_of_namespaces> 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 <ram-size> in kb default: ${SPDK_VAGRANT_VMRAM}" echo " -s <ram-size> in kb default: ${SPDK_VAGRANT_VMRAM}"
echo " -n <num-cpus> 1 to 4 default: ${SPDK_VAGRANT_VMCPU}" echo " -n <num-cpus> 1 to 4 default: ${SPDK_VAGRANT_VMCPU}"
echo " -x <http-proxy> default: \"${SPDK_VAGRANT_HTTP_PROXY}\"" echo " -x <http-proxy> default: \"${SPDK_VAGRANT_HTTP_PROXY}\""
@ -40,6 +44,9 @@ display_help() {
echo " $0 -s 2048 -n 2 ubuntu16" echo " $0 -s 2048 -n 2 ubuntu16"
echo " $0 -rv freebsd" 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 echo
} }
@ -58,7 +65,9 @@ SPDK_VAGRANT_VMRAM=4096
SPDK_VAGRANT_PROVIDER="virtualbox" SPDK_VAGRANT_PROVIDER="virtualbox"
SPDK_QEMU_EMULATOR="" SPDK_QEMU_EMULATOR=""
OPTIND=1 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 while getopts ":b:n:s:x:p:vrldh-:" opt; do
case "${opt}" in case "${opt}" in
@ -101,7 +110,7 @@ while getopts ":b:n:s:x:p:vrldh-:" opt; do
DEPLOY_TEST_VM=1 DEPLOY_TEST_VM=1
;; ;;
b) b)
NVME_FILE=$OPTARG NVME_FILE+="${OPTARG#*=} "
;; ;;
*) *)
echo " Invalid argument: -$OPTARG" >&2 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" echo "Warning: Test machine deployment is only available on fedora distros. Disabling it for this build"
DEPLOY_TEST_VM=0 DEPLOY_TEST_VM=0
fi 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 if [ ${VERBOSE} = 1 ]; then
echo echo
@ -160,6 +190,8 @@ if [ ${VERBOSE} = 1 ]; then
echo HELP=$HELP echo HELP=$HELP
echo DRY_RUN=$DRY_RUN echo DRY_RUN=$DRY_RUN
echo NVME_FILE=$NVME_FILE 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_DISTRO=$SPDK_VAGRANT_DISTRO
echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
@ -177,6 +209,8 @@ export SPDK_VAGRANT_VMRAM
export SPDK_DIR export SPDK_DIR
export COPY_SPDK_DIR export COPY_SPDK_DIR
export DEPLOY_TEST_VM export DEPLOY_TEST_VM
export NVME_DISKS_TYPE
export NVME_DISKS_NAMESPACES
export NVME_FILE export NVME_FILE
if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then if [ -n "$SPDK_VAGRANT_PROVIDER" ]; then
@ -207,6 +241,9 @@ if [ ${DRY_RUN} = 1 ]; then
printenv SPDK_VAGRANT_PROVIDER printenv SPDK_VAGRANT_PROVIDER
printenv SPDK_VAGRANT_HTTP_PROXY printenv SPDK_VAGRANT_HTTP_PROXY
printenv SPDK_QEMU_EMULATOR printenv SPDK_QEMU_EMULATOR
printenv NVME_DISKS_TYPE
printenv NVME_DISKS_NAMESPACES
printenv NVME_FILE
printenv SPDK_DIR printenv SPDK_DIR
fi fi