CentOS 7, NSF, “feature” [SOLVED]

Home » CentOS » CentOS 7, NSF, “feature” [SOLVED]
CentOS 10 Comments

The issue: NFS fails to start in CentOS 7 if it cannot resolve any of a list of hosts.

Well, my manager had to google to find the *truly* obscure solution that uses a deeply oddball syntax.

In /usr/lib/systemd/system/nfs-server.service, you edit the following line so that it looks like this:
ExecStartPre=-/usr/sbin/exportfs -r

Notice the *deeply* weird syntax of “=-“. This apparently tells it that “a nonzero exit code” should be ignored and considered “success”.

And, I read in the manpage for systemd.service that if you precede it with an @, it will pass arguments. Why it does not use the used-everywhere-else of *post*fixing those parms, I have no data.

And, speaking specifically about nfs-server.service, I also don’t understand why you’d set as an out-of-the-box default that it should fail to come up if it can’t resolve any export host, rather than default to coming up.

mark, discovering new reasons to dislike systemd

10 thoughts on - CentOS 7, NSF, “feature” [SOLVED]

  • Deeply weird or not, this is standard make (or at least gnu make) syntax. I wouldn’t be surprised if the developers thought it was completely normal.

    My reading of the man page is that arguments are always passed, and @ just means that the first “argument” (i.e. 1st token after the executable name) is passed as argv[0] (which would normally the path of the executable itself). But that’s entirely based on the man page, no actual experience.

    Noam

  • That syntax comes from make(1), where it means the same thing. make(1) has been with us since 1977, so I’d think “old and familiar” is a better description than “deeply weird.”

    You’ve misread the page.

    All this option does is lets you run one command but tell the command itself that it was called by a different name. I’m not sure why the systemd creators added this, since you normally get this behavior with links:

    $ sudo yum install unzip
    $ ls -li /bin/unzip /bin/infozip
    135096149 -rwxr-xr-x. 2 root root 181248 Mar 18 2015 unzip
    135096149 -rwxr-xr-x. 2 root root 181248 Mar 18 2015 zipinfo

    That is, we have a single program binary with two different names. Invoking the program as “zipinfo” makes it behave differently than if you invoke it as “unzip”.

    All this systemd feature does is lets you say something like:

    ExecStart=@/bin/unzip zipinfo …

    That is, you can run the unzip binary but *call it* zipinfo.

    Again, I don’t know why they couldn’t just do it with links. However, I will point out that the C programming interfaces on your system (execv() and friends) also support this feature, and have since back before 1977, so that this, too, is not some fresh new weirdness.

    You do it for the same reason you’d fail when mounting any other filesystem. It may be critical to operation, as with shared /usr.

  • Probably because they want to support a read-only root filesystem, working toward “stateless” systems.

  • Warren Young wrote:

    Beg pardon? The NFS server is offering it out, not requiring the f/s in. How could it be considered critical, as mounting / is? I can see it if
    *networking’s* not up, but when it’s only members of a list to whom it is available?

    mark

  • How does that explain anything? The same RPM that installed the service file can create a hard link or symlink giving the command an alternate name.

  • I get why second-rate programmers would care to do that, but what I don’t get is why systemd would need a feature to support that wish.

    No, I suspect the real reason systemd needs to support this is to work around someone’s broken argv[0] parsing. For instance, there may be a program that assumes it is always started through the PATH, so argv[0] never contains slashes. But, systemd only works with absolute paths for security, so rather than fix the broken program, they added a feature to systemd that lets it lie to the broken program, supplying the program’s basename in argv[0] even though it was started via an absolute path.

    Just a guess, of course.

    I notice that none of the service files on my main EL7 box use this leading-@ feature.

  • Perhaps the Systemd are all ‘second-rate’ programmers ? Good programmers always try to avoid the crap.


    Regards,

    Paul. England, EU. England’s place is in the European Union.

  • don’t get is why systemd would need a feature to support that wish.

    That’s enough.

    You’ve been around these lists long enough to realise attacks like that nonsense are inappropriate and won’t be tolerated.