On Thursday, December 7, 2017 at 11:49:53 AM UTC-8, cathy.z...@oracle.com wrote: > > From: Cathy Zhou <cathy.z...@oracle.com> > > Co-existence of iscsid and iscsistart can lead to unexpected iSCSI boot > behavior: > > We ran into iSCSI netboot failure when multiple interfaces are configured > with dhcp. The problem is that iscsistart is not designed to be working > together with iscsid. When an interface gets the dhcp offer successfully, > the iscsiroot script is run which starts the iscsistart service to > establish the iSCSI session. With the existence of iscsid, the iscsistart > service's attempt to setup its own mgmt ipc fails. Instead, the request > to login to the iscsi target is handled by the mgmt ipc of iscsid. After > iscsistart finishes its login attempt, it eventually sends a > stop_event_loop request to stop the mgmt process. As the result, it > terminates iscsid. > > I don't think this behavior is expected. Further, we believe the restart > of the iscsid service in iscsiroot.sh for multiple interfaces could also > interfere with each other and race. That could also cause unexpected > behavior. > > Specifically, in our multiple interface iSCSI boot case, below is what > happened: > > a. eth0 successfully got the dhcp offer, the iscsiroot script was run and > eventually ran "system-run" to start the "oneshot" iscsistart service. > > b. Before step a succeeded, the iscsiroot script was also run for eth1. > It checks the status of the first iscsistart service instance, which was > still "activating". So the iscsistart service was restarted and that > killed the first instance. Note that in this case, the stop_event_loop > request has not been sent, and iscsid was not terminated. As the result, > the second iscsistart instance also failed because of the "existing > session" error, as the half-baked session already existed in iscsid. > > Based on iscsistart(8), iscsistart's primary use is to start session > used for iSCSI root boot, and is meant to work indpependently from iscsid. > Making the two work together would need coordination between each > other, which would be complicate and unnecessary. >
No, I believe iscsistart was mean to run *instead* of iscsid, not independently. > > Therefore, to fix the issue, we'd either choose to remove the use of > iscsid and solely use iscsistart or to remove iscsistart and use iscsid > and iscsiadm to manage the iSCSI sessions. > > Our fix chooses the former. We tested the change in our setup. > > Signed-off-by: Cathy Zhou <cathy.z...@oracle.com> > --- > modules.d/95iscsi/cleanup-iscsi.sh | 2 +- > modules.d/95iscsi/iscsiroot.sh | 25 +------------------------ > modules.d/95iscsi/module-setup.sh | 30 ------------------------------ > modules.d/95iscsi/parse-iscsiroot.sh | 10 ---------- > 4 files changed, 2 insertions(+), 65 deletions(-) > > diff --git a/modules.d/95iscsi/cleanup-iscsi.sh > b/modules.d/95iscsi/cleanup-iscsi.sh > index bfc8aefc..e97d65ac 100755 > --- a/modules.d/95iscsi/cleanup-iscsi.sh > +++ b/modules.d/95iscsi/cleanup-iscsi.sh > @@ -1,4 +1,4 @@ > #!/bin/sh > > -[ -z "${DRACUT_SYSTEMD}" ] && [ -e /sys/module/bnx2i ] && killproc > iscsiuio > +[ -e /sys/module/bnx2i ] && killproc iscsiuio > Why are you removing the DRACUT_SYSTEMD checks? > > diff --git a/modules.d/95iscsi/iscsiroot.sh > b/modules.d/95iscsi/iscsiroot.sh > index aefd263d..c7f1c474 100755 > --- a/modules.d/95iscsi/iscsiroot.sh > +++ b/modules.d/95iscsi/iscsiroot.sh > @@ -36,7 +36,7 @@ iroot=${iroot#:} > # figured out a way how to check whether this is built-in or not > modprobe crc32c 2>/dev/null > > -if [ -z "${DRACUT_SYSTEMD}" ] && [ -e /sys/module/bnx2i ] && ! [ -e > /tmp/iscsiuio-started ]; then > +[ -e /sys/module/bnx2i ] && ! [ -e /tmp/iscsiuio-started ]; then > iscsiuio > > /tmp/iscsiuio-started > fi > @@ -117,11 +117,6 @@ handle_netroot() > mkdir -p /etc/iscsi > ln -fs /run/initiatorname.iscsi /etc/iscsi/initiatorname.iscsi > > /tmp/iscsi_set_initiator > - if [ -n "$DRACUT_SYSTEMD" ]; then > - systemctl try-restart iscsid > - # FIXME: iscsid is not yet ready, when the service is :-/ > - sleep 1 > - fi > fi > > if [ -z "$iscsi_initiator" ]; then > @@ -138,11 +133,6 @@ handle_netroot() > mkdir -p /etc/iscsi > ln -fs /run/initiatorname.iscsi /etc/iscsi/initiatorname.iscsi > > /tmp/iscsi_set_initiator > - if [ -n "$DRACUT_SYSTEMD" ]; then > - systemctl try-restart iscsid > - # FIXME: iscsid is not yet ready, when the service is :-/ > - sleep 1 > - fi > fi > > > @@ -163,11 +153,6 @@ handle_netroot() > if ! [ -e /etc/iscsi/initiatorname.iscsi ]; then > mkdir -p /etc/iscsi > ln -fs /run/initiatorname.iscsi /etc/iscsi/initiatorname.iscsi > - if [ -n "$DRACUT_SYSTEMD" ]; then > - systemctl try-restart iscsid > - # FIXME: iscsid is not yet ready, when the service is :-/ > - sleep 1 > - fi > fi > # FIXME $iscsi_protocol?? > > @@ -234,14 +219,6 @@ if [ "$netif" != "timeout" ] && getargbool 1 > rd.iscsi.waitnet; then > all_ifaces_setup || exit 0 > fi > > -if [ "$netif" = "timeout" ] && all_ifaces_setup; then > - # s.th. went wrong and the timeout script hits > - # restart > - systemctl restart iscsid > - # damn iscsid is not ready after unit says it's ready > - sleep 2 > -fi > - > if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then > if [ "$netif" = "timeout" ] || [ "$netif" = "online" ]; then > handle_firmware > diff --git a/modules.d/95iscsi/module-setup.sh > b/modules.d/95iscsi/module-setup.sh > index 04937b5b..1d185a84 100755 > --- a/modules.d/95iscsi/module-setup.sh > +++ b/modules.d/95iscsi/module-setup.sh > @@ -199,36 +199,6 @@ install() { > inst "$moddir/iscsiroot.sh" "/sbin/iscsiroot" > if ! dracut_module_included "systemd"; then > inst "$moddir/mount-lun.sh" "/bin/mount-lun.sh" > - else > - inst_multiple -o \ > - $systemdsystemunitdir/iscsi.service \ > - $systemdsystemunitdir/iscsid.service \ > - $systemdsystemunitdir/iscsid.socket \ > - $systemdsystemunitdir/iscsiuio.service \ > - $systemdsystemunitdir/iscsiuio.socket \ > - iscsiadm iscsid > - > - mkdir -p "${initdir}/$systemdsystemunitdir/sockets.target.wants" > - for i in \ > - iscsiuio.socket \ > - ; do > - ln_r "$systemdsystemunitdir/${i}" > "$systemdsystemunitdir/sockets.target.wants/${i}" > - done > - > - mkdir -p "${initdir}/$systemdsystemunitdir/basic.target.wants" > - for i in \ > - iscsid.service \ > - ; do > - ln_r "$systemdsystemunitdir/${i}" > "$systemdsystemunitdir/basic.target.wants/${i}" > - done > - > - # Make sure iscsid is started after dracut-cmdline and ready for > the initqueue > - mkdir -p "${initdir}/$systemdsystemunitdir/iscsid.service.d" > - ( > - echo "[Unit]" > - echo "After=dracut-cmdline.service" > - echo "Before=dracut-initqueue.service" > - ) > > "${initdir}/$systemdsystemunitdir/iscsid.service.d/dracut.conf" > I'm not sure why you've removed all of this. > fi > inst_dir /var/lib/iscsi > dracut_need_initqueue > diff --git a/modules.d/95iscsi/parse-iscsiroot.sh > b/modules.d/95iscsi/parse-iscsiroot.sh > index 43b2e088..c8c66ccf 100755 > --- a/modules.d/95iscsi/parse-iscsiroot.sh > +++ b/modules.d/95iscsi/parse-iscsiroot.sh > @@ -116,11 +116,6 @@ if arg=$(getarg rd.iscsi.initiator -d > iscsi_initiator=) && [ -n "$arg" ] && ! [ > if ! [ -e /etc/iscsi/initiatorname.iscsi ]; then > mkdir -p /etc/iscsi > ln -fs /run/initiatorname.iscsi /etc/iscsi/initiatorname.iscsi > - if [ -n "$DRACUT_SYSTEMD" ]; then > - systemctl try-restart iscsid > - # FIXME: iscsid is not yet ready, when the service is :-/ > - sleep 1 > - fi > fi > fi > > @@ -133,11 +128,6 @@ if [ -z $iscsi_initiator ] && [ -f > /sys/firmware/ibft/initiator/initiator-name ] > mkdir -p /etc/iscsi > ln -fs /run/initiatorname.iscsi /etc/iscsi/initiatorname.iscsi > > /tmp/iscsi_set_initiator > - if [ -n "$DRACUT_SYSTEMD" ]; then > - systemctl try-restart iscsid > - # FIXME: iscsid is not yet ready, when the service is :-/ > - sleep 1 > - fi > fi > fi > > -- > 2.11.1 > > So in general you've stopped starting or restarting the iscsid service? Have you tested this with iscsiuio/brcm? I have no way currently to test to make sure things all still work. Note: dracut is *not* my specialty, but I have looked at this stuff in the SUSE distribution, and it seems like a bit of a house of cards. :( -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscr...@googlegroups.com. To post to this group, send email to open-iscsi@googlegroups.com. Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.