Splux Linux

source-based Linux using SPS

sps-extra · log · files · refs · tags · releases · people · languages · GitHub · commit

fa02731


Add s6, runit, dinit, and Shepherd as first-class inits.

Date
Commitfa0273194d4c43570a8c2b728a3bac8770eff11a
GitHubmirror

Parents

Stat

 devel/guile-fibers/recipe                | 13 +++++++
 devel/guile/recipe                       | 23 ++++++++++++
 libs/gc/recipe                           | 10 ++++++
 libs/libunistring/recipe                 | 10 ++++++
 libs/skalibs/recipe                      | 10 ++++++
 sys/dinit/recipe                         | 15 ++++++++
 sys/execline/recipe                      | 11 ++++++
 sys/init-dinit/files/agetty-tty1         |  3 ++
 sys/init-dinit/files/agetty-tty2         |  3 ++
 sys/init-dinit/files/agetty-ttyS0        |  3 ++
 sys/init-dinit/files/boot                |  3 ++
 sys/init-dinit/recipe                    | 25 +++++++++++++
 sys/init-openrc/recipe                   |  9 +++--
 sys/init-runit/files/1                   | 18 ++++++++++
 sys/init-runit/files/2                   |  5 +++
 sys/init-runit/files/3                   |  7 ++++
 sys/init-runit/files/sv/agetty-tty1/run  |  3 ++
 sys/init-runit/files/sv/agetty-tty2/run  |  3 ++
 sys/init-runit/files/sv/agetty-ttyS0/run |  3 ++
 sys/init-runit/recipe                    | 25 +++++++++++++
 sys/init-s6/files/s6-pid1                | 41 +++++++++++++++++++++
 sys/init-s6/files/sv/agetty-tty1/run     |  3 ++
 sys/init-s6/files/sv/agetty-tty2/run     |  3 ++
 sys/init-s6/files/sv/agetty-ttyS0/run    |  3 ++
 sys/init-s6/recipe                       | 24 +++++++++++++
 sys/init-shepherd/files/init.scm         | 61 ++++++++++++++++++++++++++++++++
 sys/init-shepherd/files/shepherd-init    |  2 ++
 sys/init-shepherd/recipe                 | 19 ++++++++++
 sys/init-systemd/recipe                  |  9 +++--
 sys/openrc/recipe                        |  6 +++-
 sys/runit/recipe                         | 17 +++++++++
 sys/s6-linux-init/recipe                 | 18 ++++++++++
 sys/s6/recipe                            | 17 +++++++++
 sys/shepherd/recipe                      | 20 +++++++++++
 sys/systemd/recipe                       |  6 +++-
 term/fastfetch/recipe                    |  1 +
 36 files changed, 444 insertions(+), 8 deletions(-)

Diff

diff --git a/devel/guile-fibers/recipe b/devel/guile-fibers/recipe
new file mode 100644
index 0000000..8e2c2c4
--- /dev/null
+++ b/devel/guile-fibers/recipe
@@ -0,0 +1,13 @@
+name        guile-fibers
+version     1.3.1
+release     1
+description guile-fibers: concurrent ML-style fibers for Guile
+source      https://github.com/wingo/fibers/releases/download/v1.3.1/fibers-1.3.1.tar.gz
+hash        sha256:a5e1a9c49c0efe7ac6f355662041430d4b64e59baa538d2b8fb5ef7528d81dbf
+depend      filesystem
+depend      guile
+builddep    guile
+builddep    pkgconf
+configure   ./configure --prefix=/usr
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/devel/guile/recipe b/devel/guile/recipe
new file mode 100644
index 0000000..bde9e56
--- /dev/null
+++ b/devel/guile/recipe
@@ -0,0 +1,23 @@
+name        guile
+version     3.0.10
+release     1
+description guile: GNU Ubiquitous Intelligent Language for Extensions
+source      https://ftp.gnu.org/gnu/guile/guile-3.0.10.tar.xz
+hash        sha256:bd7168517fd526333446d4f7ab816527925634094fbd37322e17e2b8d8e76388
+depend      filesystem
+depend      gmp
+depend      libffi
+depend      libunistring
+depend      gc
+depend      libtool
+depend      readline
+depend      ncurses
+builddep    pkgconf
+builddep    gmp
+builddep    libffi
+builddep    libunistring
+builddep    gc
+builddep    libtool
+configure   ./configure --prefix=/usr --disable-static --disable-error-on-warning
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/libs/gc/recipe b/libs/gc/recipe
new file mode 100644
index 0000000..833a21d
--- /dev/null
+++ b/libs/gc/recipe
@@ -0,0 +1,10 @@
+name        gc
+version     8.2.8
+release     1
+description gc: Boehm-Demers-Weiser conservative garbage collector
+source      https://github.com/ivmai/bdwgc/releases/download/v8.2.8/gc-8.2.8.tar.gz
+hash        sha256:7649020621cb26325e1fb5c8742590d92fb48ce5c259b502faf7d9fb5dabb160
+depend      filesystem
+configure   ./configure --prefix=/usr --disable-static --enable-cplusplus
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/libs/libunistring/recipe b/libs/libunistring/recipe
new file mode 100644
index 0000000..5820e98
--- /dev/null
+++ b/libs/libunistring/recipe
@@ -0,0 +1,10 @@
+name        libunistring
+version     1.3
+release     1
+description libunistring: Unicode string library
+source      https://ftp.gnu.org/gnu/libunistring/libunistring-1.3.tar.xz
+hash        sha256:f245786c831d25150f3dfb4317cda1acc5e3f79a5da4ad073ddca58886569527
+depend      filesystem
+configure   ./configure --prefix=/usr --disable-static
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/libs/skalibs/recipe b/libs/skalibs/recipe
new file mode 100644
index 0000000..acd1d7f
--- /dev/null
+++ b/libs/skalibs/recipe
@@ -0,0 +1,10 @@
+name        skalibs
+version     2.15.1.0
+release     1
+description skalibs: skarnet.org C support library
+source      https://skarnet.org/software/skalibs/skalibs-2.15.1.0.tar.gz
+hash        sha256:f9c905e74935c6fe911c7e344e3e89d5fbd2014c1a04650b524b15ce9b5635d1
+depend      filesystem
+configure   ./configure --prefix=/usr --libdir=/usr/lib64 --dynlibdir=/usr/lib64 --sysdepdir=/usr/lib64/skalibs/sysdeps --enable-shared --disable-allstatic
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/sys/dinit/recipe b/sys/dinit/recipe
new file mode 100644
index 0000000..9e8f927
--- /dev/null
+++ b/sys/dinit/recipe
@@ -0,0 +1,15 @@
+name        dinit
+version     0.19.4
+release     1
+description dinit: service manager and init
+source      https://github.com/davmac314/dinit/releases/download/v0.19.4/dinit-0.19.4.tar.xz
+hash        sha256:a7d472186c9e8b19a8b88019a99c64c417c59abee244b1893b6c2ae03024df1e
+depend      filesystem
+conflict    systemd
+conflict    openrc
+conflict    s6
+conflict    runit
+conflict    shepherd
+configure   ./configure --prefix=/usr --exec-prefix=/usr --sbindir=/usr/sbin --enable-shutdown --shutdown-prefix=dinit-
+build       make -j"$MAKEJOBS"
+install     make DESTDIR="$PKG" install
diff --git a/sys/execline/recipe b/sys/execline/recipe
new file mode 100644
index 0000000..db1fed7
--- /dev/null
+++ b/sys/execline/recipe
@@ -0,0 +1,11 @@
+name        execline
+version     2.9.9.2
+release     1
+description execline: non-interactive scripting language
+source      https://skarnet.org/software/execline/execline-2.9.9.2.tar.gz
+hash        sha256:908ed4db3a6b3a23a205d8fd4cf2a71089156f2aeae0f54656045aafad2dee32
+depend      filesystem
+depend      skalibs
+configure   ./configure --prefix=/usr --libdir=/usr/lib64 --dynlibdir=/usr/lib64 --bindir=/usr/bin --libexecdir=/usr/libexec --enable-shared --disable-allstatic --with-sysdeps="${SPS_ROOT:-}/usr/lib64/skalibs/sysdeps"
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/sys/init-dinit/files/agetty-tty1 b/sys/init-dinit/files/agetty-tty1
new file mode 100644
index 0000000..1d3cbb5
--- /dev/null
+++ b/sys/init-dinit/files/agetty-tty1
@@ -0,0 +1,3 @@
+type = process
+command = /sbin/agetty --noclear tty1 linux
+restart = true
diff --git a/sys/init-dinit/files/agetty-tty2 b/sys/init-dinit/files/agetty-tty2
new file mode 100644
index 0000000..f7ec76b
--- /dev/null
+++ b/sys/init-dinit/files/agetty-tty2
@@ -0,0 +1,3 @@
+type = process
+command = /sbin/agetty tty2 linux
+restart = true
diff --git a/sys/init-dinit/files/agetty-ttyS0 b/sys/init-dinit/files/agetty-ttyS0
new file mode 100644
index 0000000..14a930c
--- /dev/null
+++ b/sys/init-dinit/files/agetty-ttyS0
@@ -0,0 +1,3 @@
+type = process
+command = /sbin/agetty -L 115200 ttyS0 vt100
+restart = true
diff --git a/sys/init-dinit/files/boot b/sys/init-dinit/files/boot
new file mode 100644
index 0000000..6479f2c
--- /dev/null
+++ b/sys/init-dinit/files/boot
@@ -0,0 +1,3 @@
+type = internal
+restart = false
+waits-for.d = /etc/dinit.d/boot.d
diff --git a/sys/init-dinit/recipe b/sys/init-dinit/recipe
new file mode 100644
index 0000000..05e421c
--- /dev/null
+++ b/sys/init-dinit/recipe
@@ -0,0 +1,25 @@
+name        init-dinit
+version     1.0
+release     1
+arch        any
+description init-dinit: dinit as PID 1, with eudev and elogind
+depend      filesystem
+depend      dinit
+depend      eudev
+depend      elogind
+conflict    init-systemd
+conflict    init-openrc
+conflict    init-s6
+conflict    init-runit
+conflict    init-shepherd
+install     mkdir -p "$PKG/usr/share/sps/sets" "$PKG/etc/sps" "$PKG/sbin" "$PKG/etc/dinit.d/boot.d"
+install     printf '%s\n' "init-dinit" >"$PKG/usr/share/sps/sets/init-dinit"
+install     printf '%s\n' dinit >"$PKG/etc/sps/init"
+install     install -m 0644 "$SRC/files/boot" "$PKG/etc/dinit.d/boot"
+install     install -m 0644 "$SRC/files/agetty-tty1" "$PKG/etc/dinit.d/agetty-tty1"
+install     install -m 0644 "$SRC/files/agetty-tty2" "$PKG/etc/dinit.d/agetty-tty2"
+install     install -m 0644 "$SRC/files/agetty-ttyS0" "$PKG/etc/dinit.d/agetty-ttyS0"
+install     ln -sf ../agetty-tty1 "$PKG/etc/dinit.d/boot.d/agetty-tty1"
+install     ln -sf ../agetty-tty2 "$PKG/etc/dinit.d/boot.d/agetty-tty2"
+install     ln -sf ../agetty-ttyS0 "$PKG/etc/dinit.d/boot.d/agetty-ttyS0"
+install     ln -sf /usr/sbin/dinit "$PKG/sbin/init"
diff --git a/sys/init-openrc/recipe b/sys/init-openrc/recipe
index ee63295..75436b2 100644
--- a/sys/init-openrc/recipe
+++ b/sys/init-openrc/recipe
@@ -1,14 +1,17 @@
 name        init-openrc
 version     1.0
-release     1
+release     2
 arch        any
 description init-openrc: OpenRC plus eudev and elogind
-
 depend      filesystem
 depend      openrc
 depend      eudev
 depend      elogind
-
+conflict    init-systemd
+conflict    init-s6
+conflict    init-runit
+conflict    init-dinit
+conflict    init-shepherd
 install     mkdir -p "$PKG/usr/share/sps/sets" "$PKG/etc/sps"
 install     printf '%s\n' "init-openrc" >"$PKG/usr/share/sps/sets/init-openrc"
 install     printf '%s\n' openrc >"$PKG/etc/sps/init"
diff --git a/sys/init-runit/files/1 b/sys/init-runit/files/1
new file mode 100755
index 0000000..1f94f1e
--- /dev/null
+++ b/sys/init-runit/files/1
@@ -0,0 +1,18 @@
+#!/bin/sh
+PATH=/usr/bin:/usr/sbin:/bin:/sbin
+export PATH
+mount -t proc proc /proc 2>/dev/null || :
+mount -t sysfs sysfs /sys 2>/dev/null || :
+mount -t devtmpfs devtmpfs /dev 2>/dev/null || :
+mkdir -p /dev/pts /dev/shm /run
+mount -t devpts devpts /dev/pts 2>/dev/null || :
+mount -t tmpfs shm /dev/shm 2>/dev/null || :
+mount -t tmpfs tmpfs /run 2>/dev/null || :
+if [ -r /etc/hostname ]; then
+	hostname "$(cat /etc/hostname)" 2>/dev/null || :
+fi
+if [ -x /sbin/udevd ] || [ -x /usr/sbin/udevd ]; then
+	udevd --daemon 2>/dev/null || /usr/sbin/udevd --daemon 2>/dev/null || :
+	udevadm trigger --action=add 2>/dev/null || :
+	udevadm settle --timeout=8 2>/dev/null || :
+fi
diff --git a/sys/init-runit/files/2 b/sys/init-runit/files/2
new file mode 100755
index 0000000..31fd2d8
--- /dev/null
+++ b/sys/init-runit/files/2
@@ -0,0 +1,5 @@
+#!/bin/sh
+PATH=/usr/bin:/usr/sbin:/bin:/sbin
+export PATH
+mkdir -p /etc/runit/runsvdir/default
+exec runsvdir -P /etc/runit/runsvdir/default
diff --git a/sys/init-runit/files/3 b/sys/init-runit/files/3
new file mode 100755
index 0000000..c1a7b3c
--- /dev/null
+++ b/sys/init-runit/files/3
@@ -0,0 +1,7 @@
+#!/bin/sh
+PATH=/usr/bin:/usr/sbin:/bin:/sbin
+export PATH
+sv force-shutdown /etc/runit/runsvdir/default/* >/dev/null 2>&1 || :
+udevadm control --exit >/dev/null 2>&1 || :
+swapoff -a >/dev/null 2>&1 || :
+umount -a -r >/dev/null 2>&1 || :
diff --git a/sys/init-runit/files/sv/agetty-tty1/run b/sys/init-runit/files/sv/agetty-tty1/run
new file mode 100755
index 0000000..d37fbb6
--- /dev/null
+++ b/sys/init-runit/files/sv/agetty-tty1/run
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec 2>&1
+exec /sbin/agetty --noclear tty1 linux
diff --git a/sys/init-runit/files/sv/agetty-tty2/run b/sys/init-runit/files/sv/agetty-tty2/run
new file mode 100755
index 0000000..57b0d2e
--- /dev/null
+++ b/sys/init-runit/files/sv/agetty-tty2/run
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec 2>&1
+exec /sbin/agetty tty2 linux
diff --git a/sys/init-runit/files/sv/agetty-ttyS0/run b/sys/init-runit/files/sv/agetty-ttyS0/run
new file mode 100755
index 0000000..1f2725f
--- /dev/null
+++ b/sys/init-runit/files/sv/agetty-ttyS0/run
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec 2>&1
+exec /sbin/agetty -L 115200 ttyS0 vt100
diff --git a/sys/init-runit/recipe b/sys/init-runit/recipe
new file mode 100644
index 0000000..c5de062
--- /dev/null
+++ b/sys/init-runit/recipe
@@ -0,0 +1,25 @@
+name        init-runit
+version     1.0
+release     1
+arch        any
+description init-runit: runit as PID 1, with eudev and elogind
+depend      filesystem
+depend      runit
+depend      eudev
+depend      elogind
+conflict    init-systemd
+conflict    init-openrc
+conflict    init-s6
+conflict    init-dinit
+conflict    init-shepherd
+install     mkdir -p "$PKG/usr/share/sps/sets" "$PKG/etc/sps" "$PKG/sbin" "$PKG/etc/runit" "$PKG/etc/sv" "$PKG/etc/runit/runsvdir/default"
+install     printf '%s\n' "init-runit" >"$PKG/usr/share/sps/sets/init-runit"
+install     printf '%s\n' runit >"$PKG/etc/sps/init"
+install     install -m 0755 "$SRC/files/1" "$PKG/etc/runit/1"
+install     install -m 0755 "$SRC/files/2" "$PKG/etc/runit/2"
+install     install -m 0755 "$SRC/files/3" "$PKG/etc/runit/3"
+install     ln -sf /usr/bin/runit-init "$PKG/sbin/init"
+install     cp -a "$SRC/files/sv/." "$PKG/etc/sv/"
+install     ln -sf /etc/sv/agetty-tty1 "$PKG/etc/runit/runsvdir/default/agetty-tty1"
+install     ln -sf /etc/sv/agetty-tty2 "$PKG/etc/runit/runsvdir/default/agetty-tty2"
+install     ln -sf /etc/sv/agetty-ttyS0 "$PKG/etc/runit/runsvdir/default/agetty-ttyS0"
diff --git a/sys/init-s6/files/s6-pid1 b/sys/init-s6/files/s6-pid1
new file mode 100755
index 0000000..d3ca7b6
--- /dev/null
+++ b/sys/init-s6/files/s6-pid1
@@ -0,0 +1,41 @@
+#!/bin/sh
+# Stage 1 for s6: mounts, udev, seed /run/service, then exec s6-svscan as PID 1.
+PATH=/usr/bin:/usr/sbin:/bin:/sbin
+export PATH
+
+mount -t proc proc /proc 2>/dev/null || :
+mount -t sysfs sysfs /sys 2>/dev/null || :
+mount -t devtmpfs devtmpfs /dev 2>/dev/null || :
+mkdir -p /dev/pts /dev/shm /run /run/service
+mount -t devpts devpts /dev/pts 2>/dev/null || :
+mount -t tmpfs shm /dev/shm 2>/dev/null || :
+mount -t tmpfs tmpfs /run 2>/dev/null || :
+mkdir -p /run/service
+
+if [ -r /etc/hostname ]; then
+	hostname "$(cat /etc/hostname)" 2>/dev/null || :
+fi
+
+if [ -x /sbin/udevd ] || [ -x /usr/sbin/udevd ]; then
+	udevd --daemon 2>/dev/null || /usr/sbin/udevd --daemon 2>/dev/null || :
+	udevadm trigger --action=add 2>/dev/null || :
+	udevadm settle --timeout=8 2>/dev/null || :
+fi
+
+seed() {
+	_src=$1
+	_name=${_src##*/}
+	[ -d "$_src" ] || return 0
+	[ -f "$_src/run" ] || return 0
+	rm -rf "/run/service/$_name"
+	cp -a "$_src" "/run/service/$_name"
+}
+
+if [ -d /etc/s6/enabled ]; then
+	for _svc in /etc/s6/enabled/*; do
+		[ -e "$_svc" ] || continue
+		seed "$_svc"
+	done
+fi
+
+exec /usr/bin/s6-svscan /run/service
diff --git a/sys/init-s6/files/sv/agetty-tty1/run b/sys/init-s6/files/sv/agetty-tty1/run
new file mode 100755
index 0000000..d37fbb6
--- /dev/null
+++ b/sys/init-s6/files/sv/agetty-tty1/run
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec 2>&1
+exec /sbin/agetty --noclear tty1 linux
diff --git a/sys/init-s6/files/sv/agetty-tty2/run b/sys/init-s6/files/sv/agetty-tty2/run
new file mode 100755
index 0000000..57b0d2e
--- /dev/null
+++ b/sys/init-s6/files/sv/agetty-tty2/run
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec 2>&1
+exec /sbin/agetty tty2 linux
diff --git a/sys/init-s6/files/sv/agetty-ttyS0/run b/sys/init-s6/files/sv/agetty-ttyS0/run
new file mode 100755
index 0000000..1f2725f
--- /dev/null
+++ b/sys/init-s6/files/sv/agetty-ttyS0/run
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec 2>&1
+exec /sbin/agetty -L 115200 ttyS0 vt100
diff --git a/sys/init-s6/recipe b/sys/init-s6/recipe
new file mode 100644
index 0000000..c3a21b3
--- /dev/null
+++ b/sys/init-s6/recipe
@@ -0,0 +1,24 @@
+name        init-s6
+version     1.0
+release     1
+arch        any
+description init-s6: s6 as PID 1, with eudev and elogind
+depend      filesystem
+depend      s6
+depend      s6-linux-init
+depend      execline
+depend      eudev
+depend      elogind
+conflict    init-systemd
+conflict    init-openrc
+conflict    init-runit
+conflict    init-dinit
+conflict    init-shepherd
+install     mkdir -p "$PKG/usr/share/sps/sets" "$PKG/etc/sps" "$PKG/sbin" "$PKG/etc/s6/sv" "$PKG/etc/s6/enabled"
+install     printf '%s\n' "init-s6" >"$PKG/usr/share/sps/sets/init-s6"
+install     printf '%s\n' s6 >"$PKG/etc/sps/init"
+install     install -m 0755 "$SRC/files/s6-pid1" "$PKG/sbin/init"
+install     cp -a "$SRC/files/sv/." "$PKG/etc/s6/sv/"
+install     ln -sf /etc/s6/sv/agetty-tty1 "$PKG/etc/s6/enabled/agetty-tty1"
+install     ln -sf /etc/s6/sv/agetty-tty2 "$PKG/etc/s6/enabled/agetty-tty2"
+install     ln -sf /etc/s6/sv/agetty-ttyS0 "$PKG/etc/s6/enabled/agetty-ttyS0"
diff --git a/sys/init-shepherd/files/init.scm b/sys/init-shepherd/files/init.scm
new file mode 100644
index 0000000..3922883
--- /dev/null
+++ b/sys/init-shepherd/files/init.scm
@@ -0,0 +1,61 @@
+;; SPS PID 1 config for GNU Shepherd.
+(use-modules (ice-9 ftw)
+             (shepherd service))
+
+(define (directory? path)
+  (and (file-exists? path)
+       (eq? 'directory (stat:type (stat path)))))
+
+(define (scm-name? name)
+  (and (string-suffix? ".scm" name)
+       (not (string-prefix? "." name))))
+
+(define (name->symbol name)
+  (string->symbol (substring name 0 (- (string-length name) 4))))
+
+(define (load-service-dir dir)
+  (when (directory? dir)
+    (for-each
+     (lambda (name)
+       (when (scm-name? name)
+         (primitive-load (string-append dir "/" name))))
+     (or (scandir dir) '()))))
+
+(define agetty-tty1
+  (service '(agetty-tty1)
+           #:documentation "getty on tty1"
+           #:start (make-forkexec-constructor
+                    '("/sbin/agetty" "--noclear" "tty1" "linux"))
+           #:stop (make-kill-destructor)
+           #:respawn? #t))
+
+(define agetty-tty2
+  (service '(agetty-tty2)
+           #:documentation "getty on tty2"
+           #:start (make-forkexec-constructor
+                    '("/sbin/agetty" "tty2" "linux"))
+           #:stop (make-kill-destructor)
+           #:respawn? #t))
+
+(define agetty-ttyS0
+  (service '(agetty-ttyS0)
+           #:documentation "serial getty"
+           #:start (make-forkexec-constructor
+                    '("/sbin/agetty" "-L" "115200" "ttyS0" "vt100"))
+           #:stop (make-kill-destructor)
+           #:respawn? #t))
+
+(register-services (list agetty-tty1 agetty-tty2 agetty-ttyS0))
+(load-service-dir "/etc/shepherd.d")
+(start-in-the-background '(agetty-tty1 agetty-tty2 agetty-ttyS0))
+
+(let ((dir "/etc/shepherd.d"))
+  (when (directory? dir)
+    (for-each
+     (lambda (name)
+       (when (scm-name? name)
+         (catch #t
+           (lambda ()
+             (start-in-the-background (list (name->symbol name))))
+           (lambda args #f))))
+     (or (scandir dir) '()))))
diff --git a/sys/init-shepherd/files/shepherd-init b/sys/init-shepherd/files/shepherd-init
new file mode 100755
index 0000000..dcfab1b
--- /dev/null
+++ b/sys/init-shepherd/files/shepherd-init
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /usr/bin/shepherd --config=/etc/shepherd/init.scm "$@"
diff --git a/sys/init-shepherd/recipe b/sys/init-shepherd/recipe
new file mode 100644
index 0000000..1495c47
--- /dev/null
+++ b/sys/init-shepherd/recipe
@@ -0,0 +1,19 @@
+name        init-shepherd
+version     1.0
+release     1
+arch        any
+description init-shepherd: GNU Shepherd as PID 1, with eudev and elogind
+depend      filesystem
+depend      shepherd
+depend      eudev
+depend      elogind
+conflict    init-systemd
+conflict    init-openrc
+conflict    init-s6
+conflict    init-runit
+conflict    init-dinit
+install     mkdir -p "$PKG/usr/share/sps/sets" "$PKG/etc/sps" "$PKG/sbin" "$PKG/etc/shepherd" "$PKG/etc/shepherd.d"
+install     printf '%s\n' "init-shepherd" >"$PKG/usr/share/sps/sets/init-shepherd"
+install     printf '%s\n' shepherd >"$PKG/etc/sps/init"
+install     install -m 0644 "$SRC/files/init.scm" "$PKG/etc/shepherd/init.scm"
+install     install -m 0755 "$SRC/files/shepherd-init" "$PKG/sbin/init"
diff --git a/sys/init-systemd/recipe b/sys/init-systemd/recipe
index 7d0726f..d27857e 100644
--- a/sys/init-systemd/recipe
+++ b/sys/init-systemd/recipe
@@ -1,12 +1,15 @@
 name        init-systemd
 version     1.0
-release     1
+release     2
 arch        any
 description init-systemd: systemd as PID 1, with udev and logind
-
 depend      filesystem
 depend      systemd
-
+conflict    init-openrc
+conflict    init-s6
+conflict    init-runit
+conflict    init-dinit
+conflict    init-shepherd
 install     mkdir -p "$PKG/usr/share/sps/sets" "$PKG/etc/sps"
 install     printf '%s\n' "init-systemd" >"$PKG/usr/share/sps/sets/init-systemd"
 install     printf '%s\n' systemd >"$PKG/etc/sps/init"
diff --git a/sys/openrc/recipe b/sys/openrc/recipe
index b1bf519..8485c44 100644
--- a/sys/openrc/recipe
+++ b/sys/openrc/recipe
@@ -1,6 +1,6 @@
 name        openrc
 version     0.62.6
-release     1
+release     2
 description openrc: dependency-based init scripts
 
 source      https://github.com/OpenRC/openrc/archive/refs/tags/0.62.6.tar.gz
@@ -9,6 +9,10 @@ hash        sha256:d5c15b37533e2b5d247d9fbab8b41f312614784b9ea11239ddcfe8e4528e7
 depend      filesystem
 depend      busybox
 conflict    systemd
+conflict    s6
+conflict    runit
+conflict    dinit
+conflict    shepherd
 builddep    meson
 builddep    ninja
 builddep    pkgconf
diff --git a/sys/runit/recipe b/sys/runit/recipe
new file mode 100644
index 0000000..95b6eee
--- /dev/null
+++ b/sys/runit/recipe
@@ -0,0 +1,17 @@
+name        runit
+version     2.2.0
+release     1
+description runit: process supervision and init
+source      http://smarden.org/runit/runit-2.2.0.tar.gz
+hash        sha256:95ef4d2868b978c7179fe47901e5c578e11cf273d292bd6208bd3a7ccb029290
+depend      filesystem
+conflict    systemd
+conflict    openrc
+conflict    s6
+conflict    dinit
+conflict    shepherd
+configure   printf '%s\n' 'gcc -O2 -Wall' > runit-2.2.0/src/conf-cc
+configure   printf '%s\n' 'gcc -s' > runit-2.2.0/src/conf-ld
+build       cd runit-2.2.0 && package/compile
+install     mkdir -p "$PKG/usr/bin"
+install     install -m755 runit-2.2.0/command/* "$PKG/usr/bin"
diff --git a/sys/s6-linux-init/recipe b/sys/s6-linux-init/recipe
new file mode 100644
index 0000000..e014cbc
--- /dev/null
+++ b/sys/s6-linux-init/recipe
@@ -0,0 +1,18 @@
+name        s6-linux-init
+version     1.2.0.2
+release     1
+description s6-linux-init: tools to build an s6 PID 1
+source      https://skarnet.org/software/s6-linux-init/s6-linux-init-1.2.0.2.tar.gz
+hash        sha256:6fad014da162c0c81924197c57d16e1a75c133b34a20e423431a1b741e907b1d
+depend      filesystem
+depend      s6
+depend      execline
+depend      skalibs
+conflict    systemd
+conflict    openrc
+conflict    runit
+conflict    dinit
+conflict    shepherd
+configure   ./configure --prefix=/usr --libdir=/usr/lib64 --dynlibdir=/usr/lib64 --bindir=/usr/bin --libexecdir=/usr/libexec --enable-shared --disable-allstatic --with-sysdeps="${SPS_ROOT:-}/usr/lib64/skalibs/sysdeps"
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/sys/s6/recipe b/sys/s6/recipe
new file mode 100644
index 0000000..b007b01
--- /dev/null
+++ b/sys/s6/recipe
@@ -0,0 +1,17 @@
+name        s6
+version     2.15.1.0
+release     1
+description s6: skarnet.org supervision suite
+source      https://skarnet.org/software/s6/s6-2.15.1.0.tar.gz
+hash        sha256:eab9c46e22b66b16135f9a05ec68a0ea287d9060b84d10defaaa2caad158ab52
+depend      filesystem
+depend      skalibs
+depend      execline
+conflict    systemd
+conflict    openrc
+conflict    runit
+conflict    dinit
+conflict    shepherd
+configure   ./configure --prefix=/usr --libdir=/usr/lib64 --dynlibdir=/usr/lib64 --bindir=/usr/bin --libexecdir=/usr/libexec --enable-shared --disable-allstatic --with-sysdeps="${SPS_ROOT:-}/usr/lib64/skalibs/sysdeps"
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/sys/shepherd/recipe b/sys/shepherd/recipe
new file mode 100644
index 0000000..6bef21f
--- /dev/null
+++ b/sys/shepherd/recipe
@@ -0,0 +1,20 @@
+name        shepherd
+version     1.0.8
+release     1
+description shepherd: GNU service manager and PID 1
+source      https://ftp.gnu.org/gnu/shepherd/shepherd-1.0.8.tar.gz
+hash        sha256:3beb005370bf0339c567d068a7ad9fb69f0e8850894db01c34635955f7717ff5
+depend      filesystem
+depend      guile
+depend      guile-fibers
+conflict    systemd
+conflict    openrc
+conflict    s6
+conflict    runit
+conflict    dinit
+builddep    guile
+builddep    guile-fibers
+builddep    pkgconf
+configure   ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
+build       make -j"$MAKEJOBS"
+install     make install DESTDIR="$PKG"
diff --git a/sys/systemd/recipe b/sys/systemd/recipe
index 9d66515..6bbe689 100644
--- a/sys/systemd/recipe
+++ b/sys/systemd/recipe
@@ -1,6 +1,6 @@
 name        systemd
 version     257.9
-release     1
+release     2
 description systemd: init, udev, logind, and service manager
 
 source      https://github.com/systemd/systemd/archive/refs/tags/v257.9.tar.gz
@@ -16,6 +16,10 @@ depend      openssl
 conflict    openrc
 conflict    eudev
 conflict    elogind
+conflict    s6
+conflict    runit
+conflict    dinit
+conflict    shepherd
 builddep    meson
 builddep    ninja
 builddep    pkgconf
diff --git a/term/fastfetch/recipe b/term/fastfetch/recipe
index 4b74cd2..f625104 100644
--- a/term/fastfetch/recipe
+++ b/term/fastfetch/recipe
@@ -7,6 +7,7 @@ source      https://github.com/fastfetch-cli/fastfetch/archive/refs/tags/2.67.1.
 hash        sha256:52489550d1fdeac8bde8b3442064e3bc78d28fda752a171dc46a6cd97454f237
 
 depend      filesystem
+# Branding (os-release, logos). cmake is a builddep and pulls openssl.
 depend      splux-base
 builddep    cmake
 builddep    ninja