[RFC PATCH 5/5] iscsiroot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
modules.d/95iscsi/iscsi-netroot.sh   |   13 ---
modules.d/95iscsi/iscsiroot          |  186 ++++++++++++++++++---------------
modules.d/95iscsi/install            |    1 -
modules.d/95iscsi/parse-iscsiroot.sh |   93 ++++++++++++-----
4 files changed, 169 insertions(+), 121 deletions(-)

diff --git a/modules.d/95iscsi/install b/modules.d/95iscsi/install
index cd4a3ca..613c752 100755
--- a/modules.d/95iscsi/install
+++ b/modules.d/95iscsi/install
@@ -4,6 +4,5 @@ inst iscsistart
inst hostname
inst iscsi-iname
inst_hook cmdline 90 "$moddir/parse-iscsiroot.sh"
-inst_hook netroot 90 "$moddir/iscsi-netroot.sh"
inst "$moddir/iscsiroot" "/sbin/iscsiroot"
instmods iscsi_tcp crc32c
diff --git a/modules.d/95iscsi/iscsi-netroot.sh b/modules.d/95iscsi/iscsi-netroot.sh
deleted file mode 100755
index 4f02239..0000000
--- a/modules.d/95iscsi/iscsi-netroot.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-if [ "$root" = "dhcp" ]; then
-    if [ -n "$new_root_path" -a -z "${new_root_path%%iscsi:*}" ]; then
-	root="$new_root_path"
-    fi
-fi
-
-if [ -z "${root%iscsi:*}" ]; then
-    handler=/sbin/iscsiroot
-fi
-
-if getarg iscsiroot >/dev/null; then
-    handler=/sbin/iscsiroot
-fi
diff --git a/modules.d/95iscsi/iscsiroot b/modules.d/95iscsi/iscsiroot
index 8e20fda..b042caf 100755
--- a/modules.d/95iscsi/iscsiroot
+++ b/modules.d/95iscsi/iscsiroot
@@ -1,108 +1,124 @@
#!/bin/sh
+#
+# This implementation is incomplete: Discovery mode is not implemented and
+# the argument handling doesn't follow currently agreed formats. This is mainly
+# because rfc4173 does not say anything about iscsi_initiator but open-iscsi's +# iscsistart needs this.
+#

. /lib/dracut-lib

PATH=$PATH:/sbin:/usr/sbin

-# XXX needs error handling like ifup/dhclient-script
-
if getarg rdnetdebug; then
    exec > /tmp/iscsiroot.$1.$$.out
    exec 2>> /tmp/iscsiroot.$1.$$.out
    set -x
fi

-# read static conf settings
-for conf in conf/conf.d/*; do
-	[ -f ${conf} ] && . ${conf}
-done
+# Huh? Empty $1?
+[ -z "$1" ] && exit 1
+
+# Huh? Empty $2?
+[ -z "$2" ] && exit 1

# root is in the form root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+# or root=iscsi:iscsi_firmware
netif="$1"
root="$2"

+# read static conf settings
+# XXX Where are these from?
+for conf in conf/conf.d/*; do
+        [ -f ${conf} ] && . ${conf}
+done
+
+# If it's not iscsi we don't continue
+[ "${root%%:*}" = "iscsi" ] || exit 1
+
+# XXX modprobe crc32c should go in the cmdline parser, but I haven't yet
+# figured out a way how to check whether this is built-in or not
+modprobe crc32c

-if [ $root = ${root#iscsi:} ]; then
-	iroot=$(getarg iscsiroot)
-else
-	iroot=${root#iscsi:}
+if getarg iscsi_firmware ; then
+ echo iscsistart -b + exit 0
fi

-if getarg iscsi_firmware >/dev/null; then
-	modprobe iscsi_tcp
-	modprobe crc32c
-	iscsistart -b
-else
-	# override conf settings by command line options
-	arg=$(getarg iscsi_initiator)
-	[ -n "$arg" ] && iscsi_initiator=$arg
-	arg=$(getarg iscsi_initiator)
-	[ -n "$arg" ] && iscsi_target_name=$arg
-	arg=$(getarg iscsi_target_ip)
-	[ -n "$arg" ] && iscsi_target_ip=$arg
-	arg=$(getarg iscsi_target_port)
-	[ -n "$arg" ] && iscsi_target_port=$arg
-	arg=$(getarg iscsi_target_group)
-	[ -n "$arg" ] && iscsi_target_group=$arg
-	arg=$(getarg iscsi_username)
-	[ -n "$arg" ] && iscsi_username=$arg
-	arg=$(getarg iscsi_password)
-	[ -n "$arg" ] && iscsi_password=$arg
-	arg=$(getarg iscsi_in_username)
-	[ -n "$arg" ] && iscsi_in_username=$arg
-	arg=$(getarg iscsi_in_password)
-	[ -n "$arg" ] && iscsi_in_password=$arg
-
-
-	# override conf/commandline options by dhcp root_path
-	OLDIFS="$IFS"
-	IFS=:
-	set $iroot
-	iscsi_target_ip=$1; shift
-	iscsi_protocol=$1; shift # ignored
-	iscsi_target_port=$1; shift
-	iscsi_lun=$1; shift
-	iscsi_target_name=$*
-	IFS="$OLDIFS"
-
-	getarg ro && iscsirw=ro
-	getarg rw && iscsirw=rw
-	fsopts=${fsopts+$fsopts,}${iscsirw}
-
-	modprobe iscsi_tcp
-	modprobe crc32c
-
-	if [ -z $iscsi_initiator ]; then
-		[ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi
-		[ -f /etc/iscsi/initiatorname.iscsi ] && . /etc/iscsi/initiatorname.iscsi
-		iscsi_initiator=$InitiatorName
-	fi
-
-	if [ -z $iscsi_target_port ]; then
-		iscsi_target_port=3260
-	fi
-
-	if [ -z $iscsi_target_group ]; then
-		iscsi_target_group=1
-	fi
-
-	if [ -z $iscsi_initiator ]; then
-		iscsi_initiator=$(iscsi-iname)
-	fi
-
-	echo "InitiatorName='$iscsi_initiator'" > /dev/.initiatorname.iscsi
-
-	# FIXME $iscsi_lun?? $iscsi_protocol??
-
-	iscsistart -i $iscsi_initiator -t $iscsi_target_name	\
-		   -g $iscsi_target_group -a $iscsi_target_ip	\
-		   -p $iscsi_target_port \
-		   ${iscsi_username+-u $iscsi_username} \
-	           ${iscsi_password+-w $iscsi_password} \
-	           ${iscsi_in_username+-U $iscsi_in_username} \
-	           ${iscsi_in_password+-W $iscsi_in_password}
-	# now we have a root filesystem somewhere in /dev/sda*
-	# let the normal block handler handle root=
+# override conf settings by command line options
+arg=$(getarg iscsi_initiator)
+[ -n "$arg" ] && iscsi_initiator=$arg
+arg=$(getarg iscsi_target_name)
+[ -n "$arg" ] && iscsi_target_name=$arg
+arg=$(getarg iscsi_target_ip)
+[ -n "$arg" ] && iscsi_target_ip=$arg
+arg=$(getarg iscsi_target_port)
+[ -n "$arg" ] && iscsi_target_port=$arg
+arg=$(getarg iscsi_target_group)
+[ -n "$arg" ] && iscsi_target_group=$arg
+arg=$(getarg iscsi_username)
+[ -n "$arg" ] && iscsi_username=$arg
+arg=$(getarg iscsi_password)
+[ -n "$arg" ] && iscsi_password=$arg
+arg=$(getarg iscsi_in_username)
+[ -n "$arg" ] && iscsi_in_username=$arg
+arg=$(getarg iscsi_in_password)
+[ -n "$arg" ] && iscsi_in_password=$arg
+
+# override conf/commandline options by dhcp root_path
+# FIXME this assumes that all values have been provided
+iroot=$root
+OLDIFS="$IFS"
+IFS=:
+set $iroot
+iscsi_target_ip=$1; shift
+iscsi_protocol=$1; shift # ignored
+iscsi_target_port=$1; shift
+iscsi_lun=$1; shift
+iscsi_target_name=$*
+IFS="$OLDIFS"
+
+# XXX is this needed?
+getarg ro && iscsirw=ro
+getarg rw && iscsirw=rw
+fsopts=${fsopts+$fsopts,}${iscsirw}
+	
+if [ -z $iscsi_initiator ]; then
+    # XXX Where are these from?
+    [ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi
+    [ -f /etc/iscsi/initiatorname.iscsi ] && . /etc/iscsi/initiatorname.iscsi
+    iscsi_initiator=$InitiatorName
+
+    # XXX rfc3720 says 'SCSI Initiator Name: The iSCSI Initiator Name specifies
+    # the worldwide unique name of the initiator.' Could we use hostname/ip
+    # if missing?
fi

+if [ -z $iscsi_target_port ]; then
+    iscsi_target_port=3260
+fi
+
+if [ -z $iscsi_target_group ]; then
+    iscsi_target_group=1
+fi
+
+if [ -z $iscsi_initiator ]; then
+    # XXX is this correct?
+    iscsi_initiator=$(iscsi-iname)
+fi
+
+echo "InitiatorName='$iscsi_initiator'" > /dev/.initiatorname.iscsi
+
+# FIXME $iscsi_lun?? $iscsi_protocol??
+
+iscsistart -i $iscsi_initiator -t $iscsi_target_name	\
+    -g $iscsi_target_group -a $iscsi_target_ip	\
+    -p $iscsi_target_port \
+    ${iscsi_username+-u $iscsi_username} \
+    ${iscsi_password+-w $iscsi_password} \
+    ${iscsi_in_username+-U $iscsi_in_username} \
+    ${iscsi_in_password+-W $iscsi_in_password}
+
+# now we have a root filesystem somewhere in /dev/sda*
+# let the normal block handlers should mount root
exit 0
diff --git a/modules.d/95iscsi/parse-iscsiroot.sh b/modules.d/95iscsi/parse-iscsiroot.sh
index 4115248..1ba4277 100755
--- a/modules.d/95iscsi/parse-iscsiroot.sh
+++ b/modules.d/95iscsi/parse-iscsiroot.sh
@@ -1,32 +1,75 @@
-# XXX actually we could, if we move to root=XXX and netroot=XXX, then
-# you could do root=LABEL=/ iscsiroot=XXX, or netroot=iscsi:XXX
-#
+#!/bin/sh
#
# Preferred format:
-#       root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+#	root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+#	[root=*] netroot=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
#
# Legacy formats:
-#       iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
-#	root=dhcp iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
-#	root=iscsi iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
-#       root=??? iscsi_initiator= iscsi_target_name= iscsi_target_ip= iscsi_target_port= iscsi_target_group= iscsi_username= iscsi_password= iscsi_in_username= iscsi_in_password=
-#       root=??? iscsi_firmware
-
-case "$root" in
-    iscsi|dhcp|'')
-	if getarg iscsiroot= > /dev/null; then
-	    root=iscsi:$(getarg iscsiroot=)
-	fi
-	;;
-esac
-
-if [ "${root%%:*}" = "iscsi" ]; then
-    # XXX validate options here?
-    # XXX generate udev rules?
-    rootok=1
-    netroot=iscsi
+#	[net]root=[iscsi] iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+# 	[net]root=[iscsi] iscsi_firmware
+#
+# root= takes precedence over netroot= if root=iscsi[...]
+#
+
+# Don't continue if root is ok
+[ -n "$rootok" ] && return
+
+# This script is sourced, so root should be set. But let's be paranoid
+[ -z "$root" ] && root=$(getarg root=)
+[ -z "$netroot" ] && netroot=$(getarg netroot=)
+[ -z "$iscsiroot" ] && iscsiroot=$(getarg iscsiroot=)
+[ -z "$iscsi_firmware" ] && getarg iscsi_firmware && iscsi_firmware="1"
+
+[ -n "$iscsiroot" ] && [ -n "$iscsi_firmware" ] && die "Mixing iscsiroot and iscsi_firmware is dangerous"
+
+# Root takes precedence over netroot
+if [ "${root%%:*}" = "iscsi" ] ; then
+    if [ -n "$netroot" ] ; then
+	echo "Warning: root takes precedence over netroot. Ignoring netroot"
+
+    fi
+    netroot=$root
+fi
+
+# If it's not empty or iscsi we don't continue
+[ -z "$netroot" ] || [ "${netroot%%:*}" = "iscsi" ] || return
+
+if [ -n "$iscsiroot" ] ; then
+    [ -z "$netroot" ]  && netroot=$root
+
+    # @deprecated
+    echo "Warning: Argument isciroot is deprecated and might be removed in a future"
+    echo "release. See http://apps.sourceforge.net/trac/dracut/wiki/commandline for"
+    echo "more information."
+
+    # Accept iscsiroot argument?
+    [ -z "$netroot" ] || [ "$netroot" = "iscsi" ] || \
+	die "Argument iscsiroot only accepted for empty root= or [net]root=iscsi"
+
+    # Override root with iscsiroot content?
+    [ -z "$netroot" ] || [ "$netroot" = "iscsi" ] && netroot=iscsi:$iscsiroot
+fi
+
+# iscsi_firmware does not need argument checking
+if [ -n "$iscsi_firmware" ] ; then
+    netroot=${netroot:-iscsi}
fi

-if getarg iscsiroot; then
-	netroot=iscsi
+# If it's not iscsi we don't continue
+[ "${netroot%%:*}" = "iscsi" ] || return
+
+# Check required arguments. there's only one, but it's at the end
+if [ -z "$iscsi_firmware" ] ; then
+    case "${netroot##iscsi:*:*:*:*:}" in
+	$netroot|'') die "Argument targetname for iscsiroot is missing";;
+    esac
fi
+
+# ISCSI actually supported?
+[ -e /sys/devices/virtual/iscsi_transport ] || modprobe iscsi_tcp || die "iscsiroot requested but kernel/initrd does not support iscsi"
+
+# Done, all good!
+rootok=1
+
+# Shut up init error check
+[ -z "$root" ] && root="iscsi"
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux