make "shutdown" work

create a package for the s6-compatible shutdown/halt/poweroff
commands and put it on the path ahead of busybox
This commit is contained in:
Daniel Barlow 2022-09-26 14:13:23 +01:00
parent 2430e80ca1
commit d5ccecf038
5 changed files with 40 additions and 17 deletions

View file

@ -75,7 +75,7 @@ Sun Sep 25 20:56:28 BST 2022
TODO - bugs, missing bits, other infelicities as they occur to me: TODO - bugs, missing bits, other infelicities as they occur to me:
1) shutdown doesn't work as its using the busybox one not s6. DONE 1) shutdown doesn't work as its using the busybox one not s6.
2) perhaps we shouldn't have process-based services like dhcp, ppp 2) perhaps we shouldn't have process-based services like dhcp, ppp
implement "address provider interface" - instead have a separate implement "address provider interface" - instead have a separate
@ -120,7 +120,7 @@ we want to change the pseudofiles in an overlay?
is that specified or fluke? is that specified or fluke?
16) tighten up the module specs. (DONE) services.foo should be a s6-rc 16) tighten up the module specs. (DONE) services.foo should be a s6-rc
service, kernel config should be checked in some way service, (DONE) kernel config should be checked in some way
DONE 17) rename nixwrt references in kernel builder DONE 17) rename nixwrt references in kernel builder

View file

@ -39,7 +39,7 @@ let
}; };
s6-pseudofiles = pkgs.s6-init-files; s6-pseudofiles = pkgs.s6-init-files;
profile = writeScript ".profile" '' profile = writeScript ".profile" ''
PATH=${lib.makeBinPath (with pkgs; [busybox execline s6-linux-init s6-rc])} PATH=${lib.makeBinPath (with pkgs; [ s6-init-bin busybox execline s6-linux-init s6-rc])}
export PATH export PATH
''; '';
pseudofiles = writeText "pseudofiles" '' pseudofiles = writeText "pseudofiles" ''
@ -60,7 +60,7 @@ let
/sys d 0555 root root /sys d 0555 root root
/dev/pts d 0755 0 0 /dev/pts d 0755 0 0
/etc/init.d d 0755 0 0 /etc/init.d d 0755 0 0
/bin/init s 0755 0 0 /etc/s6-linux-init/current/bin/init /bin/init s 0755 0 0 ${pkgs.s6-init-bin}/bin/init
/bin/sh s 0755 0 0 ${pkgs.pkgsStatic.busybox}/bin/sh /bin/sh s 0755 0 0 ${pkgs.pkgsStatic.busybox}/bin/sh
/bin/busybox s 0755 0 0 ${pkgs.busybox}/bin/busybox /bin/busybox s 0755 0 0 ${pkgs.busybox}/bin/busybox
/etc/s6-rc d 0755 0 0 /etc/s6-rc d 0755 0 0

View file

@ -8,6 +8,8 @@ final: prev: {
}; };
writeAshScript = final.callPackage ./pkgs/write-ash-script {}; writeAshScript = final.callPackage ./pkgs/write-ash-script {};
s6-init-bin = final.callPackage ./pkgs/s6-init-bin {};
pppoe = prev.rpPPPoE.overrideAttrs (o: { pppoe = prev.rpPPPoE.overrideAttrs (o: {
# use newer rp-pppoe, it builds cleanly # use newer rp-pppoe, it builds cleanly
src = final.fetchFromGitHub { src = final.fetchFromGitHub {

View file

@ -0,0 +1,33 @@
{
s6-linux-init
, execline
, writeScript
, stdenvNoCC
, lib
, busybox
, s6-rc
}:
let
hpr = name: arg: writeScript name ''
#!${execline}/bin/execlineb -S0
${s6-linux-init}/bin/s6-linux-init-hpr ${arg} \$@
'';
init = writeScript "init" ''
#!${execline}/bin/execlineb -S0
${s6-linux-init}/bin/s6-linux-init -c /etc/s6-linux-init/current -m 0022 -p ${lib.makeBinPath [busybox execline s6-linux-init s6-rc]}:/usr/bin:/bin -d /dev -- "\$@"
'';
in stdenvNoCC.mkDerivation {
name = "s6-init-bin";
phases = ["installPhase"];
installPhase = ''
bin=$out/bin
mkdir -p $bin
cd $bin
ln -s ${s6-linux-init}/bin/s6-linux-init-shutdown shutdown
ln -s ${s6-linux-init}/bin/s6-linux-init-telinit telinit
ln -s ${hpr "reboot" "-r"} reboot
ln -s ${hpr "poweroff" "-p"} poweroff
ln -s ${hpr "halt" "-h"} halt
ln -s ${init} init
'';
}

View file

@ -23,18 +23,6 @@ let
}; };
dir = contents: { type = "d"; inherit contents; }; dir = contents: { type = "d"; inherit contents; };
symlink = target: { type = "s"; inherit target; }; symlink = target: { type = "s"; inherit target; };
hpr = arg: "#!${execline}/bin/execlineb -S0\n${s6-linux-init}/bin/s6-linux-init-hpr ${arg} \$@";
bin = dir {
shutdown = symlink "${s6-linux-init}/bin/s6-linux-init-shutdown";
telinit = symlink "${s6-linux-init}/bin/s6-linux-init-telinit";
reboot = { type="f"; file = hpr "-r"; mode="0755"; };
poweroff = { type="f"; file = hpr "-p"; mode="0755"; };
halt = { type="f"; file = hpr "-h"; mode="0755"; };
init = {
type="f"; mode="0755";
file = "#!${execline}/bin/execlineb -S0\n${s6-linux-init}/bin/s6-linux-init -c /etc/s6-linux-init/current -m 0022 -p ${lib.makeBinPath [busybox execline s6-linux-init s6-rc]}:/usr/bin:/bin -d /dev -- \"\\$@\"";
};
};
scripts = symlink "${initscripts}/scripts"; scripts = symlink "${initscripts}/scripts";
env = dir {}; env = dir {};
run-image = dir { run-image = dir {
@ -150,7 +138,7 @@ let
uncaught-logs = (dir {}) // {mode = "2750";}; uncaught-logs = (dir {}) // {mode = "2750";};
}; };
structure = { etc = dir { s6-linux-init = dir { current = dir { structure = { etc = dir { s6-linux-init = dir { current = dir {
inherit bin scripts env run-image; inherit scripts env run-image;
};};};}; };};};};
in pseudofile "pseudo.s6-init" structure in pseudofile "pseudo.s6-init" structure