From 2519322aacdd6a8365bdf95562a3919b888e47f4 Mon Sep 17 00:00:00 2001 From: JDierkse Date: Fri, 12 May 2023 11:15:38 +0200 Subject: [PATCH] Add Multipath support --- info | 62 ++++++++++++++++++++++++------------ mountVolume | 84 ++++++++++++++++++++++++++++++++++++++++--------- testPerformance | 52 +++++++++++++++++++++++++++--- 3 files changed, 159 insertions(+), 39 deletions(-) diff --git a/info b/info index 111e018..1484dea 100755 --- a/info +++ b/info @@ -5,26 +5,46 @@ IQN=$1 PrintIQN() { IQN=$1 - IQNTEST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname) - if [ "${IQNTEST}" != "${IQN}" ]; then - echo "IQN not found" - echo "" + MULTIPATH=0 + IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname) + for IQNTEST in ${IQNTESTLIST}; do + if [ "${IQNTEST}" != "${IQN}" ]; then + echo "IQN not found" + echo "" - exit + exit + fi + + MULTIPATH=$((MULTIPATH + 1)) + done + + SESSIONFOLDERLIST=$(grep -l ${IQN} /sys/class/iscsi_session/*/targetname | xargs realpath) + + declare -A ADDRESSES + declare -A BLOCKDEVICES + for SESSIONFOLDER in ${SESSIONFOLDERLIST}; do + SESSION=$(echo "${SESSIONFOLDER}" | sed 's/.*session\([0-9]*\).*/\1/g') + HOST=$(echo "${SESSIONFOLDER}" | sed 's/.*host\([0-9]*\).*/\1/g') + + SCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed 's/\(.*\)\/iscsi_session.*/\1/g' | xargs ls -1 | grep "target${HOST}" | sed 's/target//g') + MAJOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 2) + MINOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 3) + + FULLSCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}/g" | xargs ls -1 | grep ":") + LUN=$(echo "${FULLSCSIADDRESS}" | cut -d ":" -f 4) + + ADDRESS="[${SESSION}]:scsi$HOST:${MAJOR}:${MINOR}:${LUN}" + ADDRESSES+="${ADDRESS} " + + BLOCKDEVICE=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}\/${FULLSCSIADDRESS}\/block/g" | xargs ls -1 | xargs printf "/dev/%s") + BLOCKDEVICES+="${BLOCKDEVICE} " + done + + MULTIPATHDEVICE=$(multipath -l ${BLOCKDEVICES[0]} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g') + if [ ! -z "${MULTIPATHDEVICE}" ]; then + BLOCKDEVICE="/dev/mapper/${MULTIPATHDEVICE}" fi - SESSIONFOLDER=$(grep -l ${IQN} /sys/class/iscsi_session/*/targetname | xargs realpath) - SESSION=$(echo "${SESSIONFOLDER}" | sed 's/.*session\([0-9]*\).*/\1/g') - HOST=$(echo "${SESSIONFOLDER}" | sed 's/.*host\([0-9]*\).*/\1/g') - - SCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed 's/\(.*\)\/iscsi_session.*/\1/g' | xargs ls -1 | grep "target${HOST}" | sed 's/target//g') - MAJOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 2) - MINOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 3) - - FULLSCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}/g" | xargs ls -1 | grep ":") - LUN=$(echo "${FULLSCSIADDRESS}" | cut -d ":" -f 4) - - BLOCKDEVICE=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}\/${FULLSCSIADDRESS}\/block/g" | xargs ls -1 | xargs printf "/dev/%s") MOUNTPOINT=$(grep "${BLOCKDEVICE}" /proc/mounts | head -n 1 | cut -d " " -f 2) echo "IQN: ${IQN}" @@ -33,17 +53,19 @@ PrintIQN() { #echo " Channel: ${MAJOR}"; #echo " Id: ${MINOR}"; #echo " LUN: ${LUN}"; - echo " Address: [${SESSION}] scsi$HOST:${MAJOR}:${MINOR}:${LUN}" + for ADDRESS in ${ADDRESSES}; do + echo " Address: ${ADDRESS}" + done echo " Device: ${BLOCKDEVICE}"; echo " Mountpoint: ${MOUNTPOINT}"; echo } if [[ -z "${IQN}" ]]; then - IQNLIST=$(cat /sys/class/iscsi_session/*/targetname) + IQNLIST=$(cat /sys/class/iscsi_session/*/targetname | sort -u) for IQN in ${IQNLIST}; do PrintIQN ${IQN} - done; + done else PrintIQN ${IQN} fi diff --git a/mountVolume b/mountVolume index cf753f8..92c5af2 100755 --- a/mountVolume +++ b/mountVolume @@ -3,33 +3,68 @@ IQN=$1 HOST=$2 -if [[ -z "${IQN}" ]]; then +if [ -z "${IQN}" ]; then echo "usage: $0 TargetIQN [Host]" echo "" exit fi -iscsiadm -m discovery -t sendtargets -o update -p ${HOST} &> /dev/null - -if [[ ! -z "${HOST}" ]]; then - iscsiadm -m node -T ${IQN} -p ${HOST} -l +if [ ! -z "${HOST}" ]; then + iscsiadm -m discovery -t sendtargets -o update -p ${HOST} &> /dev/null + iscsiadm -m node -T ${IQN} -p ${HOST} -l &> /dev/null + RETURNCODE=$? else - iscsiadm -m node -T ${IQN} -l + iscsiadm -m node -T ${IQN} -l &> /dev/null + RETURNCODE=$? fi sleep 0.5 -SESSIONID=$(iscsiadm -m session | grep "${IQN}" | head -n 1 | sed -e 's/.*\[\(.*\)\].*/\1/g') -DEVICE=$(iscsiadm -m session -r ${SESSIONID} -P 3 | grep "Attached scsi disk" | sed -e 's/.*Attached scsi disk \([^\t]*\).*/\/dev\/\1/g') -BLOCKDEVICE=${DEVICE} +MULTIPATH=0 +IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname) +for IQNTEST in ${IQNTESTLIST}; do + if [ "${IQNTEST}" != "${IQN}" ]; then + echo "IQN login failed" + echo "" -MULTIPATHDEVICE=$(multipath -l ${DEVICE} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g') -if [[ ! -z "${MULTIPATHDEVICE}" ]]; then + exit + fi + + MULTIPATH=$((MULTIPATH + 1)) +done + +SESSIONFOLDERLIST=$(grep -l ${IQN} /sys/class/iscsi_session/*/targetname | xargs realpath) + +declare -A ADDRESSES +declare -A BLOCKDEVICES +for SESSIONFOLDER in ${SESSIONFOLDERLIST}; do + SESSION=$(echo "${SESSIONFOLDER}" | sed 's/.*session\([0-9]*\).*/\1/g') + HOST=$(echo "${SESSIONFOLDER}" | sed 's/.*host\([0-9]*\).*/\1/g') + + SCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed 's/\(.*\)\/iscsi_session.*/\1/g' | xargs ls -1 | grep "target${HOST}" | sed 's/target//g') + MAJOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 2) + MINOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 3) + + FULLSCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}/g" | xargs ls -1 | grep ":") + LUN=$(echo "${FULLSCSIADDRESS}" | cut -d ":" -f 4) + + ADDRESS="[${SESSION}]:scsi$HOST:${MAJOR}:${MINOR}:${LUN}" + ADDRESSES+="${ADDRESS} " + + BLOCKDEVICE=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}\/${FULLSCSIADDRESS}\/block/g" | xargs ls -1 | xargs printf "/dev/%s") + BLOCKDEVICES+="${BLOCKDEVICE} " +done + +multipath -r +MULTIPATHDEVICE=$(multipath -l ${BLOCKDEVICES[0]} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g') +if [ ! -z "${MULTIPATHDEVICE}" ]; then BLOCKDEVICE="/dev/mapper/${MULTIPATHDEVICE}" fi -mkdir -p /mnt/iSCSI_${IQN} +MOUNTPOINT="/mnt/iSCSI_${IQN}" + +mkdir -p ${MOUNTPOINT} FILESYSTEM=$(blkid ${BLOCKDEVICE}) if [ -z "${FILESYSTEM}" ]; then @@ -37,8 +72,29 @@ if [ -z "${FILESYSTEM}" ]; then echo "mkfs.ext4 ${BLOCKDEVICE}" echo "" echo "And mount afterwards using:" - echo "mount ${BLOCKDEVICE} /mnt/iSCSI_${IQN}" + echo "mount ${BLOCKDEVICE} ${MOUNTPOINT}" else - mount -o discard ${BLOCKDEVICE} /mnt/iSCSI_${IQN} + mount -o discard ${BLOCKDEVICE} ${MOUNTPOINT} + RETURNCODE=$? + + if [ "${RETURNCODE}" != "0" ]; then + echo "IQN: ${IQN}" + for ADDRESS in ${ADDRESSES}; do + echo "Address: ${ADDRESS}" + done + echo "Device: ${BLOCKDEVICE}" + echo "Mountpoint: ${MOUNTPOINT}" + echo "Mounting failed" + else + echo "IQN: ${IQN}" + for ADDRESS in ${ADDRESSES}; do + echo "Address: ${ADDRESS}" + done + echo "Device: ${BLOCKDEVICE}" + echo "Mountpoint: ${MOUNTPOINT}" + echo "Mounting succeeded" + fi fi +echo "" + diff --git a/testPerformance b/testPerformance index 44390d8..b3c2129 100755 --- a/testPerformance +++ b/testPerformance @@ -9,16 +9,58 @@ if [[ -z "${IQN}" ]]; then exit fi -if [[ ! -d "/mnt/iSCSI_${IQN}" ]]; then +MULTIPATH=0 +IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname) +for IQNTEST in ${IQNTESTLIST}; do + if [ "${IQNTEST}" != "${IQN}" ]; then + echo "IQN not found" + echo "" + + exit + fi + + MULTIPATH=$((MULTIPATH + 1)) +done + +SESSIONFOLDERLIST=$(grep -l ${IQN} /sys/class/iscsi_session/*/targetname | xargs realpath) + +declare -A ADDRESSES +declare -A BLOCKDEVICES +for SESSIONFOLDER in ${SESSIONFOLDERLIST}; do + SESSION=$(echo "${SESSIONFOLDER}" | sed 's/.*session\([0-9]*\).*/\1/g') + HOST=$(echo "${SESSIONFOLDER}" | sed 's/.*host\([0-9]*\).*/\1/g') + + SCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed 's/\(.*\)\/iscsi_session.*/\1/g' | xargs ls -1 | grep "target${HOST}" | sed 's/target//g') + MAJOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 2) + MINOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 3) + + FULLSCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}/g" | xargs ls -1 | grep ":") + LUN=$(echo "${FULLSCSIADDRESS}" | cut -d ":" -f 4) + + ADDRESS="[${SESSION}]:scsi$HOST:${MAJOR}:${MINOR}:${LUN}" + ADDRESSES+="${ADDRESS} " + + BLOCKDEVICE=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}\/${FULLSCSIADDRESS}\/block/g" | xargs ls -1 | xargs printf "/dev/%s") + BLOCKDEVICES+="${BLOCKDEVICE} " +done + +MULTIPATHDEVICE=$(multipath -l ${BLOCKDEVICES[0]} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g') +if [ ! -z "${MULTIPATHDEVICE}" ]; then + BLOCKDEVICE="/dev/mapper/${MULTIPATHDEVICE}" +fi + +MOUNTPOINT=$(grep "${BLOCKDEVICE}" /proc/mounts | head -n 1 | cut -d " " -f 2) + +if [[ -z "${MOUNTPOINT}" || ! -d "${MOUNTPOINT}" ]]; then echo "IQN ${IQN} is not mounted" echo "" exit fi -dd if=/dev/zero of=/mnt/iSCSI_${IQN}/test1.img bs=1G count=1 oflag=dsync -dd if=/dev/zero of=/mnt/iSCSI_${IQN}/test2.img bs=512 count=1000 oflag=dsync +dd if=/dev/zero of=${MOUNTPOINT}/test1.img bs=1G count=1 oflag=dsync +dd if=/dev/zero of=${MOUNTPOINT}/test2.img bs=512 count=1000 oflag=dsync -rm -f /mnt/iSCSI_${IQN}/test1.img -rm -f /mnt/iSCSI_${IQN}/test2.img +rm -f ${MOUNTPOINT}/test1.img +rm -f ${MOUNTPOINT}/test2.img