Add Multipath support

This commit is contained in:
2023-05-12 11:15:38 +02:00
parent 905361e72f
commit 2519322aac
3 changed files with 159 additions and 39 deletions
+42 -20
View File
@@ -5,26 +5,46 @@ IQN=$1
PrintIQN() { PrintIQN() {
IQN=$1 IQN=$1
IQNTEST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname) MULTIPATH=0
if [ "${IQNTEST}" != "${IQN}" ]; then IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname)
echo "IQN not found" for IQNTEST in ${IQNTESTLIST}; do
echo "" 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 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) MOUNTPOINT=$(grep "${BLOCKDEVICE}" /proc/mounts | head -n 1 | cut -d " " -f 2)
echo "IQN: ${IQN}" echo "IQN: ${IQN}"
@@ -33,17 +53,19 @@ PrintIQN() {
#echo " Channel: ${MAJOR}"; #echo " Channel: ${MAJOR}";
#echo " Id: ${MINOR}"; #echo " Id: ${MINOR}";
#echo " LUN: ${LUN}"; #echo " LUN: ${LUN}";
echo " Address: [${SESSION}] scsi$HOST:${MAJOR}:${MINOR}:${LUN}" for ADDRESS in ${ADDRESSES}; do
echo " Address: ${ADDRESS}"
done
echo " Device: ${BLOCKDEVICE}"; echo " Device: ${BLOCKDEVICE}";
echo " Mountpoint: ${MOUNTPOINT}"; echo " Mountpoint: ${MOUNTPOINT}";
echo echo
} }
if [[ -z "${IQN}" ]]; then 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 for IQN in ${IQNLIST}; do
PrintIQN ${IQN} PrintIQN ${IQN}
done; done
else else
PrintIQN ${IQN} PrintIQN ${IQN}
fi fi
+70 -14
View File
@@ -3,33 +3,68 @@
IQN=$1 IQN=$1
HOST=$2 HOST=$2
if [[ -z "${IQN}" ]]; then if [ -z "${IQN}" ]; then
echo "usage: $0 TargetIQN [Host]" echo "usage: $0 TargetIQN [Host]"
echo "" echo ""
exit exit
fi fi
iscsiadm -m discovery -t sendtargets -o update -p ${HOST} &> /dev/null if [ ! -z "${HOST}" ]; then
iscsiadm -m discovery -t sendtargets -o update -p ${HOST} &> /dev/null
if [[ ! -z "${HOST}" ]]; then iscsiadm -m node -T ${IQN} -p ${HOST} -l &> /dev/null
iscsiadm -m node -T ${IQN} -p ${HOST} -l RETURNCODE=$?
else else
iscsiadm -m node -T ${IQN} -l iscsiadm -m node -T ${IQN} -l &> /dev/null
RETURNCODE=$?
fi fi
sleep 0.5 sleep 0.5
SESSIONID=$(iscsiadm -m session | grep "${IQN}" | head -n 1 | sed -e 's/.*\[\(.*\)\].*/\1/g') MULTIPATH=0
DEVICE=$(iscsiadm -m session -r ${SESSIONID} -P 3 | grep "Attached scsi disk" | sed -e 's/.*Attached scsi disk \([^\t]*\).*/\/dev\/\1/g') IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname)
BLOCKDEVICE=${DEVICE} 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') exit
if [[ ! -z "${MULTIPATHDEVICE}" ]]; then 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}" BLOCKDEVICE="/dev/mapper/${MULTIPATHDEVICE}"
fi fi
mkdir -p /mnt/iSCSI_${IQN} MOUNTPOINT="/mnt/iSCSI_${IQN}"
mkdir -p ${MOUNTPOINT}
FILESYSTEM=$(blkid ${BLOCKDEVICE}) FILESYSTEM=$(blkid ${BLOCKDEVICE})
if [ -z "${FILESYSTEM}" ]; then if [ -z "${FILESYSTEM}" ]; then
@@ -37,8 +72,29 @@ if [ -z "${FILESYSTEM}" ]; then
echo "mkfs.ext4 ${BLOCKDEVICE}" echo "mkfs.ext4 ${BLOCKDEVICE}"
echo "" echo ""
echo "And mount afterwards using:" echo "And mount afterwards using:"
echo "mount ${BLOCKDEVICE} /mnt/iSCSI_${IQN}" echo "mount ${BLOCKDEVICE} ${MOUNTPOINT}"
else 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 fi
echo ""
+47 -5
View File
@@ -9,16 +9,58 @@ if [[ -z "${IQN}" ]]; then
exit exit
fi 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 "IQN ${IQN} is not mounted"
echo "" echo ""
exit exit
fi fi
dd if=/dev/zero of=/mnt/iSCSI_${IQN}/test1.img bs=1G count=1 oflag=dsync dd if=/dev/zero of=${MOUNTPOINT}/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}/test2.img bs=512 count=1000 oflag=dsync
rm -f /mnt/iSCSI_${IQN}/test1.img rm -f ${MOUNTPOINT}/test1.img
rm -f /mnt/iSCSI_${IQN}/test2.img rm -f ${MOUNTPOINT}/test2.img