[systemd-devel] Running system services required for certain filesystems

Colin Guthrie gmane at colin.guthr.ie
Mon Jan 12 03:34:37 PST 2015


Colin Guthrie wrote on 12/01/15 10:37:
> So, overall is remote-fs-pre.target sufficient here, or should we look
> into supporting this in a more hotplug/JIT friendly way?

Digging into this further, I actually notice a problem with
remote-fs-pre.target, at least on my system.

It seems that it's not activated here any longer, despite me having
remote-fs.target enabled and, as remote-fs-pre.target is static, I
cannot specifically enable it. It's my understanding that it should be
automatically started.

Also, in an unrelated issue, remote-fs.target seems to be reached
*before* my actual remote fs's are mounted.

This all seems a little wrong (although correct in the sense that I am
using the nofail option which is what triggers this lack of waiting)

After a fresh boot here (note specifically how remote-fs-pre.target is
not active and that the rhome.mount is reached about 40 seconds after
remote-fs.target is reached):


[colin at jimmy systemd (master)]$ systemctl status rhome.mount
remote-fs.target remote-fs-pre.target network.target nfs-lock.service
● rhome.mount - /rhome
   Loaded: loaded (/etc/fstab)
   Active: active (mounted) since Mon 2015-01-12 10:44:24 GMT; 19min ago
    Where: /rhome
     What: nfs:/home/
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
  Process: 19065 ExecMount=/bin/mount -n nfs:/home/ /rhome -t nfs -o
_netdev,nfsvers=3,nofail,user,tcp,rsize=8192,wsize=8192,soft
(code=exited, status=0/SUCCESS)

● remote-fs.target - Remote File Systems
   Loaded: loaded (/usr/lib/systemd/system/remote-fs.target; enabled)
   Active: active since Mon 2015-01-12 10:43:44 GMT; 19min ago
     Docs: man:systemd.special(7)

● remote-fs-pre.target - Remote File Systems (Pre)
   Loaded: loaded (/usr/lib/systemd/system/remote-fs-pre.target; static)
   Active: inactive (dead)
     Docs: man:systemd.special(7)

● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; static)
   Active: active since Mon 2015-01-12 10:44:24 GMT; 19min ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

● nfs-lock.service - NFS file locking service.
   Loaded: loaded (/usr/lib/systemd/system/nfs-lock.service; static)
   Active: active (running) since Mon 2015-01-12 10:44:24 GMT; 19min ago
  Process: 19099 ExecStart=/sbin/rpc.statd $STATDARGS (code=exited,
status=0/SUCCESS)
  Process: 19074
ExecStartPre=/usr/libexec/nfs-utils/scripts/nfs-lock.preconfig
(code=exited, status=0/SUCCESS)
 Main PID: 19101 (rpc.statd)
   CGroup: /system.slice/nfs-lock.service
           └─19101 /sbin/rpc.statd


On my system I think nfs-lock.service was probably started by the (now
fixed) horrible /usr/sbin/start-statd callout script implemented in
mount.nfs.

I do have nfs-lock unit specified with Before=remote-fs-pre.target, so
in the past it was started before any mounts were attempted, but now it
doesn't start it might not be activated until later.

I'm not sure but is this just a bug in fstab-generator? i.e. Shouldn't
it put a Requires+After=remote-fs-pre.target in it's generated .mount
units for those mounts that are determined to be remote? (neither of
which are present here)

Or am I missing something?

What else is meant to pull in remote-fs-pre.target? The only mention in
the code is in src/core/mount.c but that's just for an After= dep, not a
Requires= one.

Perhaps the fstab-generator just needs a Requires= dep and mount.c takes
care of the After= bit?

I don't see any specific commits to fstab-generator since v217 which is
what I'm using.

This is my generated unit:

[colin at jimmy systemd (master)]$ cat /run/systemd/generator/rhome.mount
# Automatically generated by systemd-fstab-generator

[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)

[Mount]
What=nfs:/home/
Where=/rhome
Type=nfs
Options=_netdev,nfsvers=3,nofail,user,tcp,rsize=8192,wsize=8192,soft

And the other deps that are added in memory only (not sure why they are
not just encoded into the generated .mount unit).

[colin at jimmy systemd (master)]$ systemctl show rhome.mount| grep -Ei
"before|after|want|require"
Requires=-.mount
Wants=network-online.target system.slice
WantedBy=remote-fs.target
Before=umount.target
After=systemd-journald.socket remote-fs-pre.target network.target
network-online.target system.slice -.mount
RequiresMountsFor=/






Going back to the fact that remote-fs.target starts before the mounts
due to my use of nofail, this is the offending line in fstab-generator:

        if (post && !noauto && !nofail && !automount)
                fprintf(f, "Before=%s\n", post);

In an ideal world, I'd still like remote-fs.target (aka "post") to wait,
but I can see why local-fs.target should not wait (when post contains
that value).

e.g. I'd like remote-fs.target to be reached eventually, but only after
the mount jobs have timed out

Would a condition of:

        if (post && !noauto && (!nofail || streq(post,
SPECIAL_REMOTE_FS_TARGET) && !automount)
                fprintf(f, "Before=%s\n", post);

be permissible here or would there be other consequences?

I know there's still a "point in time" based issue here generally, and
it would introduce a slight asymmetry between local-fs and remote-fs
targets with regard to their nofail handling, but perhaps it's justified?

Thoughts?

Col

-- 

Colin Guthrie
gmane(at)colin.guthr.ie
http://colin.guthr.ie/

Day Job:
  Tribalogic Limited http://www.tribalogic.net/
Open Source:
  Mageia Contributor http://www.mageia.org/
  PulseAudio Hacker http://www.pulseaudio.org/
  Trac Hacker http://trac.edgewall.org/



More information about the systemd-devel mailing list