[systemd-devel] [RFC] iscsid / systemd / dracut integration effort

Chris Leech cleech at redhat.com
Mon Dec 10 14:08:32 PST 2012


Sorry about the cross-posting, but I think that in order to get this right I'm
going to need as much feedback as I can get.

I think I've got this working pretty well now (at least for my iBFT configured
iSCSI root test case), although the dracut module still needs work.  This is
based on the iscsid socket activation patch from Tomasz Torcz and the unit
files from Tomasz and Jóhann B. Guðmundsson.

Attempting to start iscsid using systemd unit files (socket activated or not)
was impacting my iscsi-root test setup.  Rather than try to preserve the old
logic that used the _netdev mount flag to determine when iscsid could be safely
shutdown, I've been working on following the guidelines for root storage
daemons http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons.

1) I patched iscsid to set argv[0][0] = '@' if a new --initrd flag is passed on
   the command line.  It's simple, it works, we don't kill iscsid before the
   root filesystem is unmounted.

2) When starting iscsid from the initrd, I then ran into issues of iscsid not
   functioning properly after the switch_root.  It's not mentioned in the
   RootStorageDaemons documentation, but if a process left running from the
   initrd needs further filesystem access at runtime it will need to be able to
   chroot itself before the switch_root.  I patched iscsid and iscsiadm with a
   newroot command (using plymouth as an example), and used a dracut clenaup
   hook to call "iscsiadm --newroot /sysroot".

3) Related to #2, launching iscsid as a Type=simple service from the initrd
   (I'm testing this with Fedora 18 beta, where dracut uses systemd in the
   initrd) results in STDOUT/STDERR access after the switch_root failing with
   EPIPE.  It seems that the connection to the journal process is dead once the
   initrd instantiated systemd-journald is replaced with the runtime process.

   I can at least keep iscsid functioning if I run it as Type=forking, but I'm
   not sure if I'm losing runtime logging or not.  I may be able to do
   something with the StandardOutput and StandardError options in the service
   file.

4) None of this helps if the sessions are shutdown when we still need them.
   Rather than the all-or-nothing _netdev mount option checks that have been
   used in the past, I'm attempting to use the fact that iscsiadm will skip
   over session that match a node with startup=onboot set when doing a
   logoutall.  The iscsi_mark_root_nodes script is borrowed from the SUSE init
   scripts in the open-iscsi repos written by Hannes Reinecke.  I've made minor
   changes to export the list of sessions activated in the initramfs, and then
   mark those as onboot when starting iscsi.service.

Things that still need looking into.

1) Command line configured iSCSI parameters.  If iscsistart is to be fully
   removed something needs to setup the node from the command line.  Or
   iscsistart needs to be able to run alongside iscsid.

2) Proper ordering of the iscsi.service for non-root filesystems.

Any and all feedback and/or help welcome.

- Chris



More information about the systemd-devel mailing list