Subject: Re: bug#30706: Nginx service fails

From: [email-masked] (Ludovic Courtès)
Date: Mon, 05 Mar 2018 11:09:34 +0100

Andreas Enge <[email-masked]> skribis:

> guix system: loading new services: user-homes term-auto nginx...
> shepherd: Evaluating user expression (register-services (primitive-load "/gnu/st?") ?).
> guix system: error: exception caught while executing 'eval' on service 'root':
> find-long-options: unbound variable

The problem we have here is that the agetty service expects
‘find-long-options’ from linux-boot.scm, and it expects it at the top
level.

So what happens above is that we evaluate in PID 1 code like:

  (make <service>
    ;; …
    #:start (let ((tty … (find-long-options …) …))
               …))

If you run this on an “old” GuixSD, ‘find-long-options’ is undefined.

Thus the whole (register-services …) expression fails to evaluate, and
we end up with some of the services missing.

Conclusions:

  1. ‘guix system reconfigure’ should probably register services one by
     one so that if one of the service expressions is erroneous, we
     don’t bork everything.  See ‘upgrade-shepherd-services’.

  2. IWBN to delay execution of this whole default-tty thing to the
     #:start method.  Ideas, Danny?

In general we should do as little as possible at the top level in the
Shepherd config file.

Ludo’.