#!/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 # Huh? Empty $1? [ -z "$1" ] && exit 1 # Huh? Empty $2? [ -z "$2" ] && exit 1 # Huh? Empty $3? This isn't really necessary, since NEWROOT isn't # used here. But let's be consistent [ -z "$3" ] && exit 1 # root is in the form root=iscsi:[]:[]:[]:[]: netif="$1" root="$2" # read static conf settings for conf in conf/conf.d/*; do [ -f ${conf} ] && . ${conf} done modprobe iscsi_tcp modprobe crc32c if getarg iscsi_firmware ; then iscsistart -b exit 0 fi # 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 if [ $root = ${root#iscsi:} ]; then iroot=$(getarg iscsiroot) else iroot=${root#iscsi:} fi # override conf/commandline options by dhcp root_path # FIXME this assumes that all values have been provided 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 handler handle root= exit 0