Quellcode durchsuchen

Add Multipath support

JDierkse vor 2 Jahren
Ursprung
Commit
2519322aac
3 geänderte Dateien mit 157 neuen und 37 gelöschten Zeilen
  1. 40 18
      info
  2. 70 14
      mountVolume
  3. 47 5
      testPerformance

+ 40 - 18
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
-	fi
+			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')
 
-	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)
 
-	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)
 
-	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
 
-	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

+ 70 - 14
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 ""
+
+		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)
 
-MULTIPATHDEVICE=$(multipath -l ${DEVICE} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g')
-if [[ ! -z "${MULTIPATHDEVICE}" ]]; then
+	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 ""
+

+ 47 - 5
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