From c426dc773fe654aed309375e20e398e9299ca34e Mon Sep 17 00:00:00 2001 From: Thomas Blume Date: Mon, 19 Oct 2015 09:14:53 +0200 Subject: Replace iscsistart with iscsiadm References: FATE#319024 iscsistart allows for a single connection only, and offers no means or terminating or re-establishing another one. So replace iscsistart with iscsiadm to allow several connection for multipath booting and also to ease maintenance in case of error. Signed-off-by: Thomas Blume --- modules.d/95iscsi/iscsiroot.sh | 48 ++++++++++++++++++++++++------------ modules.d/95iscsi/module-setup.sh | 19 ++++++++++++-- modules.d/95iscsi/parse-iscsiroot.sh | 2 +- 3 files changed, 50 insertions(+), 19 deletions(-) Index: dracut-044/modules.d/95iscsi/iscsiroot.sh =================================================================== --- dracut-044.orig/modules.d/95iscsi/iscsiroot.sh 2016-04-18 17:43:51.198589298 +0200 +++ dracut-044/modules.d/95iscsi/iscsiroot.sh 2016-04-18 17:53:11.962323970 +0200 @@ -43,17 +43,13 @@ fi handle_firmware() { - if ! iscsistart -f; then - warn "iscistart: Could not get list of targets from firmware." + if ! iscsiadm -m fw; then + warn "iscsiadm: Could not get list of targets from firmware." return 1 fi - for p in $(getargs rd.iscsi.param -d iscsi_param); do - iscsi_param="$iscsi_param --param $p" - done - - if ! iscsistart -b $iscsi_param; then - warn "'iscsistart -b $iscsi_param' failed with return code $?" + if ! iscsiadm -m fw -l; then + warn "iscsiadm: Log-in to iscsi target failed" fi echo 'started' > "/tmp/iscsistarted-iscsi:" @@ -77,7 +73,7 @@ handle_netroot() # override conf settings by command line options arg=$(getarg rd.iscsi.initiator -d iscsi_initiator=) [ -n "$arg" ] && iscsi_initiator=$arg - arg=$(getarg rd.iscsi.target.name -d iscsi_target_name=) + arg=$(getargs rd.iscsi.target.name -d iscsi_target_name=) [ -n "$arg" ] && iscsi_target_name=$arg arg=$(getarg rd.iscsi.target.ip -d iscsi_target_ip) [ -n "$arg" ] && iscsi_target_ip=$arg @@ -94,7 +90,7 @@ handle_netroot() arg=$(getarg rd.iscsi.in.password -d iscsi_in_password=) [ -n "$arg" ] && iscsi_in_password=$arg for p in $(getargs rd.iscsi.param -d iscsi_param); do - iscsi_param="$iscsi_param --param $p" + iscsi_param="$iscsi_param $p" done parse_iscsi_root "$1" || return 1 @@ -182,45 +178,37 @@ handle_netroot() echo "iscsi_lun=$iscsi_lun . /bin/mount-lun.sh " > $hookdir/mount/01-$$-iscsi.sh fi - if [ -n "$DRACUT_SYSTEMD" ] && command -v systemd-run >/dev/null 2>&1; then - netroot_enc=$(systemd-escape "iscsistart_${1}") - status=$(systemctl is-active "$netroot_enc" 2>/dev/null) - is_active=$? - if [ $is_active -ne 0 ]; then - if [ "$status" != "activating" ] && ! systemctl is-failed "$netroot_enc" >/dev/null 2>&1; then - systemd-run --no-block --service-type=oneshot --remain-after-exit --quiet \ - --description="Login iSCSI Target $iscsi_target_name" \ - --unit="$netroot_enc" -- \ - $(command -v 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"} \ - ${iscsi_iface_name:+--param "iface.iscsi_ifacename=$iscsi_iface_name"} \ - ${iscsi_netdev_name:+--param "iface.net_ifacename=$iscsi_netdev_name"} \ - ${iscsi_param} >/dev/null 2>&1 \ - && { > $hookdir/initqueue/work ; } + ### ToDo: Upstream calls systemd-run - Shall we, do we have to port this? + + if iscsiadm -m node; then + targets=$(iscsiadm -m node | sed 's/^.*iqn/iqn/') + else + targets=$(iscsiadm -m discovery -t st -p $iscsi_target_ip:${iscsi_target_port:+$iscsi_target_port} | sed 's/^.*iqn/iqn/') + [ -z "$targets" ] && echo "Target discovery to $iscsi_target_ip:${iscsi_target_port:+$iscsi_target_port} failed with status $?" && exit 1 + fi + + for target in $iscsi_target_name; do + if [[ "$targets" =~ "$target" ]]; then + if [ -n "$iscsi_iface_name" ]; then + $(iscsiadm -m iface -I $iscsi_iface_name --op=new) + [ -n "$iscsi_initiator" ] && $(iscsiadm -m iface -I $iscsi_iface_name --op=update --name=iface.initiatorname --value=$iscsi_initiator) + [ -n "$iscsi_netdev_name" ] && $(iscsiadm -m iface -I $iscsi_iface_name --op=update --name=iface.net_ifacename --value=$iscsi_netdev_name) + COMMAND="iscsiadm -m node -T $target -p $iscsi_target_ip${iscsi_target_port:+:$iscsi_target_port} -I $iscsi_iface_name --op=update" else - systemctl --no-block restart "$netroot_enc" >/dev/null 2>&1 \ - && { > $hookdir/initqueue/work ; } + COMMAND="iscsiadm -m node -T $target -p $iscsi_target_ip${iscsi_target_port:+:$iscsi_target_port} --op=update" fi + $($COMMAND --name=node.startup --value=onboot) + [ -n "$iscsi_username" ] && $($COMMAND --name=node.session.auth.username --value=$iscsi_username) + [ -n "$iscsi_password" ] && $($COMMAND --name=node.session.auth.password --value=$iscsi_password) + [ -n "$iscsi_in_username" ] && $($COMMAND --name=node.session.auth.username_in --value=$iscsi_in_username) + [ -n "$iscsi_in_password" ] && $($COMMAND --name=node.session.auth.password_in --value=$iscsi_in_password) + [ -n "$iscsi_param" ] && $($COMMAND --name=${iscsi_param%=*} --value=${iscsi_param#*=} fi - else - 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"} \ - ${iscsi_iface_name:+--param "iface.iscsi_ifacename=$iscsi_iface_name"} \ - ${iscsi_netdev_name:+--param "iface.net_ifacename=$iscsi_netdev_name"} \ - ${iscsi_param} \ - && { > $hookdir/initqueue/work ; } - fi + done + + iscsiadm -m node -L onboot || : + > $hookdir/initqueue/work + netroot_enc=$(str_replace "$1" '/' '\2f') echo 'started' > "/tmp/iscsistarted-iscsi:${netroot_enc}" return 0 Index: dracut-044/modules.d/95iscsi/module-setup.sh =================================================================== --- dracut-044.orig/modules.d/95iscsi/module-setup.sh 2016-04-18 17:43:51.198589298 +0200 +++ dracut-044/modules.d/95iscsi/module-setup.sh 2016-04-18 17:53:11.962323970 +0200 @@ -4,7 +4,7 @@ check() { local _rootdev # If our prerequisites are not met, fail anyways. - require_binaries iscsistart hostname iscsi-iname || return 1 + require_binaries hostname iscsi-iname iscsiadm iscsid || return 1 # If hostonly was requested, fail the check if we are not actually # booting from root. @@ -211,9 +211,22 @@ cmdline() { # called by dracut install() { - inst_multiple umount iscsistart hostname iscsi-iname inst_multiple -o iscsiuio inst_libdir_file 'libgcc_s.so*' + inst_multiple umount hostname iscsi-iname iscsiadm iscsid + + ln -sf $systemdsystemunitdir/iscsid.socket $systemdsystemunitdir/sockets.target.wants/iscsid.socket + ln -sf $systemdsystemunitdir/iscsiuio.socket $systemdsystemunitdir/sockets.target.wants/iscsiuio.socket + + inst_multiple -o \ + $systemdsystemunitdir/iscsid.socket \ + $systemdsystemunitdir/iscsid.service \ + $systemdsystemunitdir/iscsiuio.service \ + $systemdsystemunitdir/iscsiuio.socket \ + $systemdsystemunitdir/sockets.target.wants/iscsid.socket \ + $systemdsystemunitdir/sockets.target.wants/iscsiuio.socket + + [[ -d /etc/iscsi ]] && inst_dir $(/usr/bin/find /etc/iscsi) # Detect iBFT and perform mandatory steps if [[ $hostonly_cmdline == "yes" ]] ; then @@ -221,6 +234,8 @@ install() { [[ $_iscsiconf ]] && printf "%s\n" "$_iscsiconf" >> "${initdir}/etc/cmdline.d/95iscsi.conf" fi + echo 'rd.neednet=1' >> "${initdir}/etc/cmdline.d/95iscsi.conf" + inst_hook cmdline 90 "$moddir/parse-iscsiroot.sh" inst_hook cleanup 90 "$moddir/cleanup-iscsi.sh" inst "$moddir/iscsiroot.sh" "/sbin/iscsiroot"