[shepherd]: Guix Home's shepherd masks shutdown/reboot on foreign distribution

  • Open
  • quality assurance status badge
Details
3 participants
  • Dariqq
  • Jakob Honal
  • Ludovic Courtès
Owner
unassigned
Submitted by
Dariqq
Severity
normal
D
D
Dariqq wrote on 20 Oct 12:12 +0200
(address . bug-guix@gnu.org)
7869edcc-d4a4-48a1-9a76-e0e67752d806@posteo.net
When using guix home to manage shepherd services on a foreign
distribution the shepherd package is also added to the home-profile.

This then makes the home profile provide 'halt', 'shutdown' and 'reboot'
(and their manpages) masking the system ones.

Trying to run one of these then results in an error:
reboot: error: /var/run/shepherd/socket: No such file or directory

instead of e.g. rebooting the system.
J
J
Jakob Honal wrote on 6 Nov 14:52 +0100
(no subject)
(address . 73903@debbugs.gnu.org)
trinity-07a96b86-fa85-40d1-8f2c-046e162f762b-1730901139123@msvc-mesg-gmx005
Attachment: file
L
L
Ludovic Courtès wrote on 10 Nov 12:51 +0100
Re: bug#73903: [shepherd]: Guix Home's shepherd masks shutdown/reboot on foreign distribution
(name . Dariqq)(address . dariqq@posteo.net)(address . 73903@debbugs.gnu.org)
87a5e7wbmf.fsf@gnu.org
Hi,

Dariqq <dariqq@posteo.net> skribis:

Toggle quote (6 lines)
> When using guix home to manage shepherd services on a foreign
> distribution the shepherd package is also added to the home-profile.
>
> This then makes the home profile provide 'halt', 'shutdown' and
> 'reboot' (and their manpages) masking the system ones.

Oh, indeed. I’m not sure how to address that though. Ideas?

Ludo’.
D
D
Dariqq wrote on 10 Nov 16:57 +0100
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 73903@debbugs.gnu.org)
e1746555-6ef6-4a7c-970e-007bdd5c91ab@posteo.net
Hi Ludo,

On 10.11.24 12:51, Ludovic Courtès wrote:
Toggle quote (12 lines)
> Hi,
>
> Dariqq <dariqq@posteo.net> skribis:
>
>> When using guix home to manage shepherd services on a foreign
>> distribution the shepherd package is also added to the home-profile.
>>
>> This then makes the home profile provide 'halt', 'shutdown' and
>> 'reboot' (and their manpages) masking the system ones.
>
> Oh, indeed. I’m not sure how to address that though. Ideas?
>
Not sure if this is something that should be addressed by shepherd or
the default shepherd package used for guix home.

Initially I had the idea to add a configure flag to shepherd to disable
"building" and installing these 5 files (which is why I reported against
shepherd). I threw something together that works but I am not really
happy with it because imo such an option should disable *all*
things that are not required when only using it for user level
services and not just the entrypoints. That would be a lot more work though.

Another (simpler solution) would be to just solve the problem in guix by
using a shepherd variant that deletes sbin and share/man/man8.


Wdyt?
Toggle quote (1 lines)
> Ludo’.
L
L
Ludovic Courtès wrote on 20 Nov 11:46 +0100
(name . Dariqq)(address . dariqq@posteo.net)(address . 73903@debbugs.gnu.org)
87jzcyyygp.fsf@gnu.org
Hi,

Dariqq <dariqq@posteo.net> skribis:

Toggle quote (14 lines)
> On 10.11.24 12:51, Ludovic Courtès wrote:
>> Hi,
>> Dariqq <dariqq@posteo.net> skribis:
>>
>>> When using guix home to manage shepherd services on a foreign
>>> distribution the shepherd package is also added to the home-profile.
>>>
>>> This then makes the home profile provide 'halt', 'shutdown' and
>>> 'reboot' (and their manpages) masking the system ones.
>> Oh, indeed. I’m not sure how to address that though. Ideas?
>>
> Not sure if this is something that should be addressed by shepherd or
> the default shepherd package used for guix home.

[...]

Toggle quote (3 lines)
> Another (simpler solution) would be to just solve the problem in guix
> by using a shepherd variant that deletes sbin and share/man/man8.

Yes, this sounds like a reasonable solution to me.

Ludo’.
D
D
Dariqq wrote on 21 Nov 17:21 +0100
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 73903@debbugs.gnu.org)
f344c832-f1e9-48af-b6b6-05ec074be630@posteo.net
Hi,

On 20.11.24 11:46, Ludovic Courtès wrote:

Toggle quote (8 lines)
>
>> Another (simpler solution) would be to just solve the problem in guix
>> by using a shepherd variant that deletes sbin and share/man/man8.
>
> Yes, this sounds like a reasonable solution to me.
>
> Ludo’.

How should this work? should this be a (public?) procedure? Should it
rebuild shepherd or just copy the output with trivial-build-system?


I just thought of a more elegant solution, but this would be a lot
harder to implement properly:

- Move the sbin stuff into a seperate output
- Home shepherd service only adds the main output to the profile and
shepherd-root-service both
- Will need adjustments some packages that currently reference
shutdown/reboot ( -> lots of rebuilds because logind) and the same
change for the shepherd packages in the shepherd module.
L
L
Ludovic Courtès wrote on 26 Nov 16:55 +0100
(name . Dariqq)(address . dariqq@posteo.net)(address . 73903@debbugs.gnu.org)
87bjy2at2h.fsf@gnu.org
Hi,

Dariqq <dariqq@posteo.net> skribis:

Toggle quote (11 lines)
> On 20.11.24 11:46, Ludovic Courtès wrote:
>
>>
>>> Another (simpler solution) would be to just solve the problem in guix
>>> by using a shepherd variant that deletes sbin and share/man/man8.
>> Yes, this sounds like a reasonable solution to me.
>> Ludo’.
>
> How should this work? should this be a (public?) procedure? Should it
> rebuild shepherd or just copy the output with trivial-build-system?

My understanding of this proposal is that there would be a
“shepherd-foreign” package, which is like “shepherd” but without
‘reboot’ and ‘halt’.

That package could be implemented with ‘trivial-build-system’ or
‘copy-build-system’ indeed, and it would symlink all of ‘shepherd’,
except its ‘sbin’ directory.

Toggle quote (10 lines)
> I just thought of a more elegant solution, but this would be a lot
> harder to implement properly:
>
> - Move the sbin stuff into a seperate output
> - Home shepherd service only adds the main output to the profile and
> shepherd-root-service both
> - Will need adjustments some packages that currently reference
> shutdown/reboot ( -> lots of rebuilds because logind) and the same
> change for the shepherd packages in the shepherd module.

The advantage is that no extra step would be needed when using a foreign
distro. But yeah, it’s relatively intrusive, and not my favorite
solution, FWIW. Dunno.

WDYT?

Ludo’.
D
D
Dariqq wrote on 26 Nov 19:49 +0100
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 73903@debbugs.gnu.org)
6054002f-17fb-4a5d-832d-30392aac396a@posteo.net
Hi,

On 26.11.24 16:55, Ludovic Courtès wrote:
Toggle quote (17 lines)
> Hi,
>
> Dariqq <dariqq@posteo.net> skribis:
>
>>
>> How should this work? should this be a (public?) procedure? Should it
>> rebuild shepherd or just copy the output with trivial-build-system?
>
> My understanding of this proposal is that there would be a
> “shepherd-foreign” package, which is like “shepherd” but without
> ‘reboot’ and ‘halt’.
>
> That package could be implemented with ‘trivial-build-system’ or
> ‘copy-build-system’ indeed, and it would symlink all of ‘shepherd’,
> except its ‘sbin’ directory.
>

Imo it would make sense to have the sbinless shepherd be the default
shepherd for home-shepherd s.t. the home environment never provides
shutdown/halt by default. Those are commands are for the system to take
care of (whether that is the shepherd coming from root-shepherd or the
init from the foreign system).

On my foreign distro setup i am currently using this (apologies if the
formatting turns out weird):

Toggle snippet (25 lines)
(define shepherd-for-home
(package
(inherit shepherd)
(name "shepherd-for-home")
(source #f)
(build-system trivial-build-system)
(arguments
(list
#:modules '((guix build union)
(guix build utils))
#:builder
#~(begin
(use-modules (guix build union)
(guix build utils))
(union-build #$output
(list #$(this-package-input "shepherd"))
#:create-all-directories? #t)
(delete-file-recursively (string-append #$output "/sbin"))
(delete-file-recursively (string-append #$output
"/share/man/man8")))))
(native-inputs '())
(inputs (list shepherd))))


If we don't want to care about the manpages then the
(#:create-all-directories? #t) can be omitted in union-build.

Toggle quote (16 lines)
>> I just thought of a more elegant solution, but this would be a lot
>> harder to implement properly:
>>
>> - Move the sbin stuff into a seperate output
>> - Home shepherd service only adds the main output to the profile and
>> shepherd-root-service both
>> - Will need adjustments some packages that currently reference
>> shutdown/reboot ( -> lots of rebuilds because logind) and the same
>> change for the shepherd packages in the shepherd module.
>
> The advantage is that no extra step would be needed when using a foreign
> distro. But yeah, it’s relatively intrusive, and not my favorite
> solution, FWIW. Dunno.
>


If this would be possible without rebuilding I'd really like it because
it makes clear what part of the shepherd something depends on (service
manager stuff vs generic init stuff) and avoids an extra package that is
just shepherd minus sbindir. But the 3300 dependants of logind makes
this really unattractive.

Toggle quote (4 lines)
> WDYT?
>
> Ludo’.

Dariqq
L
L
Ludovic Courtès wrote 5 days ago
(name . Dariqq)(address . dariqq@posteo.net)(address . 73903@debbugs.gnu.org)
87frmtcgze.fsf@gnu.org
Hi Dariqq,

Dariqq <dariqq@posteo.net> skribis:

Toggle quote (6 lines)
> Imo it would make sense to have the sbinless shepherd be the default
> shepherd for home-shepherd s.t. the home environment never provides
> shutdown/halt by default. Those are commands are for the system to take
> care of (whether that is the shepherd coming from root-shepherd or the
> init from the foreign system).

I agree.

Toggle quote (26 lines)
> On my foreign distro setup i am currently using this (apologies if the
> formatting turns out weird):
>
> (define shepherd-for-home
> (package
> (inherit shepherd)
> (name "shepherd-for-home")
> (source #f)
> (build-system trivial-build-system)
> (arguments
> (list
> #:modules '((guix build union)
> (guix build utils))
> #:builder
> #~(begin
> (use-modules (guix build union)
> (guix build utils))
> (union-build #$output
> (list #$(this-package-input "shepherd"))
> #:create-all-directories? #t)
> (delete-file-recursively (string-append #$output "/sbin"))
> (delete-file-recursively (string-append #$output
> "/share/man/man8")))))
> (native-inputs '())
> (inputs (list shepherd))))

Perfect!

Would you like to submit a patch adding this package (probably with the
‘hidden?’ property), followed by a patch making it the default for Home?

Thanks,
Ludo’.
D
D
Dariqq wrote 4 hours ago
[PATCH 0/2] Add shepherd-for-home and make it default
(address . 73903@debbugs.gnu.org)(name . Dariqq)(address . dariqq@posteo.net)
cover.1734384082.git.dariqq@posteo.net
Hello,

This adds a variant of shepherd without sbin and makes it the default for home services. The reason is that when using guix home with shepherd services on a foreign distribution the default shepherd package masks commands like halt, shutdown and reboot which are usually provided by the initsystem.

Per the discussion in https://issues.guix.gnu.org/73903the package is hidden and just symlinks all the relevant files from the base shepberd to the new output.

I successfully reconfigured my home environment and confirmed that halt/reboot are now provided by my system profile.


Dariqq (2):
gnu: Add shepherd-for-home.
gnu: home: Use shepherd-for-home as the default shepherd.

gnu/home/services/shepherd.scm | 2 +-
gnu/packages/admin.scm | 27 +++++++++++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)


base-commit: c3290cee6add60b7e56f5f919d9498d78542790a
--
2.46.0
D
D
Dariqq wrote 4 hours ago
[PATCH 1/2] gnu: Add shepherd-for-home.
(address . 73903@debbugs.gnu.org)(name . Dariqq)(address . dariqq@posteo.net)
eb03bd84723fc23f8ca3548442f4b44ba96a6891.1734384082.git.dariqq@posteo.net
* gnu/packages/admin.scm (shepherd-for-home): New variable.

Change-Id: If66c7e7b688de239ca862326b51592b43ba22c25
---
gnu/packages/admin.scm | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)

Toggle diff (40 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 77d02baa4e..08ac3d582a 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -428,6 +428,33 @@ (define-public shepherd-1.0
(define-public shepherd shepherd-0.10)
+;; A variant of shepherd without sbin to not mask
+;; halt and reboot on foreign distributions
+(define-public shepherd-for-home
+ (let ((base shepherd-1.0))
+ (hidden-package
+ (package/inherit base
+ (name "shepherd-for-home")
+ (source #f)
+ (build-system trivial-build-system)
+ (arguments
+ (list
+ #:modules '((guix build union)
+ (guix build utils))
+ #:builder
+ #~(begin
+ (use-modules (guix build union)
+ (guix build utils))
+ (union-build #$output
+ (list #$(this-package-input "shepherd"))
+ #:create-all-directories? #t)
+ (delete-file-recursively
+ (string-append #$output "/sbin"))
+ (delete-file-recursively
+ (string-append #$output "/share/man/man8")))))
+ (native-inputs '())
+ (inputs (list base))))))
+
(define-public guile2.2-shepherd
(package
(inherit shepherd-0.10)
--
2.46.0
D
D
Dariqq wrote 4 hours ago
[PATCH 2/2] gnu: home: Use shepherd-for-home as the default shepherd.
(address . 73903@debbugs.gnu.org)(name . Dariqq)(address . dariqq@posteo.net)
635b463202206bc955624634a5734987b0319835.1734384082.git.dariqq@posteo.net
* gnu/home/services/shepherd.scm (home-shepherd-configuration): Change default
value of shepherd field to shepherd-for-home

Change-Id: I3773403bb1fcdcbe2acb1bbcbfaa009f4d31ace4
---
gnu/home/services/shepherd.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Toggle diff (15 lines)
diff --git a/gnu/home/services/shepherd.scm b/gnu/home/services/shepherd.scm
index 37ad1489d6..c9bf819803 100644
--- a/gnu/home/services/shepherd.scm
+++ b/gnu/home/services/shepherd.scm
@@ -55,7 +55,7 @@ (define-record-type* <home-shepherd-configuration>
home-shepherd-configuration make-home-shepherd-configuration
home-shepherd-configuration?
(shepherd home-shepherd-configuration-shepherd
- (default shepherd-1.0)) ;package
+ (default shepherd-for-home)) ;package
(auto-start? home-shepherd-configuration-auto-start?
(default #t))
(daemonize? home-shepherd-configuration-daemonize?
--
2.46.0
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 73903@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 73903
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch