iSCSI szivattyú (iscsi-scst)

A FibreChannel target összerakása után összedobtam egy iSCSI target-et Linux-on.
Az SCST iSCSI target implementációjára esett a választás, mivel az FC target esetén is SCST-s eszközökkel dolgoztam.
Az iscsi-scst csomag iSNS (nem Slota pártja Apple kiadásban) és SendTargets discovery módot támogat. Az előbbi a doksi szerint még erős béta állapotú.
Initiator oldalon az open-iscsi csomagot használtam.

A fő probléma a targettel az volt, hogy az iscsi-scstd démon alapból a gép minden interfészére rábindolt, így discovery esetén az initiator mindent 3 példányban fedezett fel (3 interfész volt a gépen fehúzva, és talán az is rásegíthetett, hogy az ip-forwarding is engedélyezve volt).

Van ugyan lehetőség, hogy a démonnak megmondjuk, hogy csak egy IP címen figyeljen, de erre csak parancssori argumentumként van lehetőség, a configfájlban nem lehet megadni ilyen opciót.
Ez viszont - szerintem - elég nagy fogyatékosság, mert így csak rc/initd fájl hegesztéssel lehet csak ezt megoldani, - míg - ha be lehetne állítani fájlból is, akkor jóval könnyebb lenne az ember élete.

Van ugyan a configfájlban iSNSServer <IP-cím> opció, de az igazából nincs hatássál arra, hogy a démon milyen IP-címen figyel, ez csak az iSNS szervert befolyásolná, ha az működne. De nem működik.
Röpke egy óra alatt 2,8G-ra fújta fel a syslog-omat, ami előtte 600K körül volt.

A cucc most működik, panaszra nincs különösebb ok. Az iscsi-scst initd fájlját is meghegesztettem, úgyhogy most csak egy IP címen figyel a bejövő kérésekre. Ettől eltekintve minden rendben, a cucc - az FC target társaságában működik rendesen.

Az összekalapálás során keletkezett doksikat most beszórom ide, hátha segít valakinek:

iSCSI-SCST általános leírás - ezen leírás szerint haladtam.
iSCSI-SCST leírás gentoo-ra - ha nem is teljesen erre volt szükségem, de a fejlettebb feature-ök alapjai benne vannak.
Open-iSCSI általános leírás.


root@nostromo:~# cat /etc/iscsi-scstd.conf
Target	iqn.2010-08.local.iscsi.nostromo:storage
Alias	nostromo
MaxConnections	1
root@nostromo:~#

root@nostromo:~# cat /etc/init.d/scsi-scst
#!/bin/sh
#
# chkconfig: - 39 35
# description: Starts and stops the iSCSI target
#
# pidfile: /var/run/iscsi-scstd.pid
# config:  /etc/iscsi-scstd.conf

# Limit iscsi-scstd to listen only on one interface. Leave empty if not needed.
ISCSI_SCSTD_IFACE="bond0"

IP=`which ip`
ISCSI_SCSTD_IFACE_ADDR=`$IP addr show $ISCSI_SCSTD_IFACE | sed -n 's:^.\+inet \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).\+$:\1:p'`

# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MEM_SIZE=1048576

configure_memsize()
{
    if [ -e /proc/sys/net/core/wmem_max ]; then
        echo ${MEM_SIZE} > /proc/sys/net/core/wmem_max
    fi

    if [ -e /proc/sys/net/core/rmem_max ]; then
        echo ${MEM_SIZE} > /proc/sys/net/core/rmem_max
    fi

    if [ -e /proc/sys/net/core/wmem_default ]; then
        echo ${MEM_SIZE} > /proc/sys/net/core/wmem_default
    fi

    if [ -e /proc/sys/net/core/rmem_default ]; then
        echo ${MEM_SIZE} > /proc/sys/net/core/rmem_default
    fi

    if [ -e /proc/sys/net/ipv4/tcp_mem ]; then
        echo "${MEM_SIZE} ${MEM_SIZE} ${MEM_SIZE}" > /proc/sys/net/ipv4/tcp_mem
    fi

    if [ -e  /proc/sys/net/ipv4/tcp_rmem ]; then
        echo "${MEM_SIZE} ${MEM_SIZE} ${MEM_SIZE}" > /proc/sys/net/ipv4/tcp_rmem
    fi

    if [ -e /proc/sys/net/ipv4/tcp_wmem ]; then
        echo "${MEM_SIZE} ${MEM_SIZE} ${MEM_SIZE}" > /proc/sys/net/ipv4/tcp_wmem
    fi
}

RETVAL=0

start()
{
	echo -n "Starting iSCSI target service: "
#	configure_memsize
	modprobe -q crc32c
	modprobe iscsi-scst
	if [ -n "$ISCSI_SCSTD_IFACE" ]; then
		daemon /usr/local/sbin/iscsi-scstd --address=$ISCSI_SCSTD_IFACE_ADDR
	else
		daemon /usr/local/sbin/iscsi-scstd
	fi
	RETVAL=$?
	echo
	return $RETVAL
}

stop()
{
	echo -n "Stopping iSCSI target service: "
	killall iscsi-scstd
	rmmod -w iscsi-scst
	RETVAL=$?
	modprobe -r crc32c 2>/dev/null
	if [ $RETVAL -eq 0 ]; then
		echo_success
	else
		echo_failure
	fi
	echo
	return $RETVAL
}

restart()
{
        stop
        start
}

condrestart()
{
	PID=`pidofproc iscsi-scstd`
	if [ $PID ]; then
        	restart
	fi
}

status()
{
	PID=`pidofproc iscsi-scstd`
	if [ ! $PID ]; then
		echo "iSCSI target stopped"
		exit 1
	else
		echo "iscsi-scstd (pid $PID) is running..."
	fi
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  condrestart)
        condrestart
        ;;
  status)
        status
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
esac

exit $?

root@nostromo:~#

Szükséges forráscsomagok letöltése:

svn co https://scst.svn.sourceforge.net/svnroot/scst
git clone git://git.kernel.org/pub/scm/linux/kernel/git/mnc/open-iscsi.git

Szükséges kernelmodulok iSCSI target-hez:

Device Drivers --> SCSI device support --> SCSI low-level drivers --> iSCSI initiator over TCP/IP
Device Drivers --> InfiniBand support --> iSCSI extensions for RDMA (iSER)
Device Drivers --> SCSI device support --> SCSI transports --> iSCSI Transport Attributes

Szükséges kernelmodulok FibreChannel target-hez:

Device Drivers --> SCSI device support --> SCSI low-level drivers --> QLogic QLA2XXX Fibre Channel Support
Device Drivers --> SCSI device support --> SCSI low-level drivers --> QLogic QLA2XXX Fibre Channel Support --> QLogic 2xxx target mode support
Device Drivers --> SCSI device support --> SCSI transports --> FiberChannel Transport Attributes
Device Drivers --> SCSI device support --> SCSI transports --> FiberChannel Transport Attributes --> SCSI target support for FiberChannel Transport Attributes

Open-iSCSI fordításánál, ha csak a userspace eszközöket akarjuk telepíteni akkor így tegyük
root@aurora:/usr/src/scst/open-iscsi/# make user
root@aurora:/usr/src/scst/open-iscsi/# make install_user

Egy adott hoszt által kiajánlott, az adott initiator számára elérhető target-ek felfedezése, és felcsatolása:
root@aurora:~# iscsi_discovery 192.168.5.1 -p 3260 -t tcp -l

Hozzászólások

Thx! Még jól jöhet. A $HOSTNAME vigyorgós de nagyon. :)

-pilisig-

Ismerős a jelenség. Nekem akkor szokott előjönni, amikor (még IET-s targettel) localhostra akarok csatlakozni az initiatorral. Tesztelésnél időnként jól jön, ha ilyet lehet csinálni. Na akkor az initiator mindig két példányban kapja vissza a targetet, mert az 127.0.0.1-es IP-n és az eth0 IP-jén is hallgatózik.

Csak iSCSI-ra használtam idáig SCST-t, FC-targetet nem csináltam még sosem. Ettől függetlenül meg lehetne próbálni ezt: korlátozd initiators.allow/deny fájlokból az initiator IP-jét. Ilyenkor az engedélyezett initiator IP alhálózatába nem tartozó IP címen hiába listenel a target, ott nem fogja a discovery visszaadni a target azonosítóját. Nem 100%, hogy ez most is be fog jönni, de talán érdemes megpróbálni.
---
Internet Memetikai Tanszék

Kösz' de nem.
Semmi ilyesmi nincs amúgy telepítve egyik gépre sem.
Külön érdekes, ha az ember épít egy külön storage hálózatot, mellette ott van még a rendes net-felé kilátó hálózat, és a drága iscsi-scstd ott is figyel, külön kérés nélkül.
Mint írtam, a target gépen be van kapcsolva az IP forwarding, így lehet, hogy ezért tudja az initiator felfedezni a targetet mindhárom IP címmel.
Viszont IP forwardingtól függetlenül a iscsi-scstd mindegyik interfészre felbindolt.
Ha multipath-os storage-et építenék, akkor is lenne olyan interfész, amire nem kellene felbindolnia a target-szoftvernek. A démonnak pedig, ha jól sejtem csak egy IP címet lehet megadni a --address=<IP> opcióval, így pedig a multipath működés esne kútba, ha jól gondolom.
-------------------------------------------------------------------------------
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 13.1 | 2.6.34.1-janos