diff options
author | Laurent Bercot <ska-adelie@skarnet.org> | 2019-05-28 16:49:42 +0000 |
---|---|---|
committer | Laurent Bercot <ska-adelie@skarnet.org> | 2019-05-28 16:49:42 +0000 |
commit | 0b82d071e1d6c87e54e38b8ff5ecd3fb1c5a0c6e (patch) | |
tree | 857bb98173718d5ac1ab9fae804cf11677547c55 /system/s6-linux-init | |
parent | 2f010c77dd84a08136edf3b38dd5974c6f0b750b (diff) | |
download | packages-0b82d071e1d6c87e54e38b8ff5ecd3fb1c5a0c6e.tar.gz packages-0b82d071e1d6c87e54e38b8ff5ecd3fb1c5a0c6e.tar.bz2 packages-0b82d071e1d6c87e54e38b8ff5ecd3fb1c5a0c6e.tar.xz packages-0b82d071e1d6c87e54e38b8ff5ecd3fb1c5a0c6e.zip |
system/s6-linux-init: new package = new init system
This commit touches lots of things at once: it is necessary in order
to maintain consistency. The impacted packages are:
- s6-linux-init: new package. s6-linux-init mechanism plus
booting policy. s6-linux-init conflicts with sysvinit; you can
have one or the other, depending on what init you want to boot on.
* s6-linux-init-common: subpackage of s6-linux-init, containing
files used in the s6 supervision tree in both init cases.
Both s6-linux-init and sysvinit depend on s6-linux-init-common.
- s6: removed s6-svscanboot, which is policy, and only used
in the sysvinit case. The s6 package is pure mechanism now.
- utmps: adapted to the new location of the supervision tree, and
reliable files provided by s6-linux-init-common. It works as is
with both init systems.
- gettys-openrc: had to move its invocation from "openrc sysinit"
to "openrc default", because you can't make early gettys with
s6-linux-init (no control over stage 1), and you can't have a
supervision tree before sysinit with sysvinit (because /run is
mounted very late, in boot), so the only solution that works with
both is to make gettys late services.
- sysvinit: now has s6-svscanboot (starting the s6 supervision
tree from inittab), and a carefully crafted inittab that should
work in all cases. Getting the right order of inittab lines was
NOT easy, and I now hate sysvinit even more than I did before.
Note that with the current version of apk, you cannot switch from
sysvinit to s6-linux-init, or vice-versa, without an error. apk
says files conflict. Because it adds the new files before removing
the old ones. It should still work with apk -f, because the
.apk-new mechanism makes it so that there's no real collision while
you're switching, but it's still ugly as fuck and needs to be fixed
in apk before we make the switch available to users.
Diffstat (limited to 'system/s6-linux-init')
-rw-r--r-- | system/s6-linux-init/APKBUILD | 116 | ||||
-rw-r--r-- | system/s6-linux-init/rc.init | 9 | ||||
-rw-r--r-- | system/s6-linux-init/rc.shutdown | 3 | ||||
-rw-r--r-- | system/s6-linux-init/reboot.sh | 21 | ||||
-rw-r--r-- | system/s6-linux-init/runlevel | 5 | ||||
-rw-r--r-- | system/s6-linux-init/s6-linux-init-common.post-upgrade | 5 | ||||
-rw-r--r-- | system/s6-linux-init/s6-linux-init-common.pre-deinstall | 5 | ||||
-rw-r--r-- | system/s6-linux-init/s6-linux-init.post-install | 25 | ||||
-rw-r--r-- | system/s6-linux-init/s6-linux-init.post-upgrade | 5 | ||||
-rw-r--r-- | system/s6-linux-init/s6-linux-init.pre-deinstall | 5 |
10 files changed, 199 insertions, 0 deletions
diff --git a/system/s6-linux-init/APKBUILD b/system/s6-linux-init/APKBUILD new file mode 100644 index 000000000..70f8bbefa --- /dev/null +++ b/system/s6-linux-init/APKBUILD @@ -0,0 +1,116 @@ +# Contributor: Laurent Bercot <ska-adelie@skarnet.org> +# Maintainer: Laurent Bercot <ska-adelie@skarnet.org> +pkgname=s6-linux-init +pkgver=1.0.1.0 +pkgrel=0 +pkgdesc="A s6-based init system" +url="https://skarnet.org/software/$pkgname/" +arch="all" +options="!check" # No test suite. +license="ISC" +_skalibs_version=2.8.1.0 +depends="execline s6 s6-linux-init-common" +makedepends="skalibs-dev>=$_skalibs_version execline-dev s6-dev utmps-dev" +subpackages="$pkgname-common:common:noarch $pkgname-libs $pkgname-dev $pkgname-libs-dev:libsdev $pkgname-doc" +source="https://skarnet.org/software/$pkgname/$pkgname-$pkgver.tar.gz rc.init runlevel rc.shutdown reboot.sh" +install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-deinstall" +provides="/sbin/init=0" + + +build() { + cd "$builddir" + ./configure \ + --enable-shared \ + --enable-static \ + --enable-allstatic \ + --enable-static-libc \ + --libdir=/usr/lib \ + --libexecdir="/lib/$pkgname" \ + --with-dynlib=/lib \ + --enable-utmps + make +} + +package() { + cd "$builddir" + make DESTDIR="$pkgdir" install + + for i in rc.init runlevel rc.shutdown ; do + cp -f "$srcdir/$i" "$pkgdir/etc/s6-linux-init/skel/" + chmod 0755 "$pkgdir/etc/s6-linux-init/skel/$i" + done + + # static binaries don't work under fakeroot, so build a dynamic one just for us + touch src/init/s6-linux-init-maker.o + make s6-linux-init-maker LDFLAGS_NOSHARED="" + + ./s6-linux-init-maker \ + -u catchlog \ + -1 \ + -L \ + -p "/usr/bin:/usr/sbin:/bin:/sbin" \ + -m 022 \ + -s /run/kernel_env \ + -f "$pkgdir/etc/s6-linux-init/skel" \ + -U "" \ + "$pkgdir/etc/s6-linux-init/current" + mkdir -p -m 0755 "$pkgdir/sbin" "$pkgdir/etc/runlevels/empty" "$pkgdir/etc/sysctl.d" + echo 'kernel.ctrl-alt-del = 0' > "$pkgdir/etc/sysctl.d/ctrlaltdel.conf" + for i in init halt poweroff reboot shutdown telinit ; do + ln -sf "../etc/s6-linux-init/current/bin/$i" "$pkgdir/sbin/$i" + done +} + + +common() { + pkgdesc="Files for an s6 supervision tree, common to s6-linux-init and sysvinit" + depends="execline s6" + runimg="$pkgdir/etc/s6-linux-init/current/run-image" + subrunimg="$subpkgdir/etc/s6-linux-init/current/run-image" + install="$subpkgname.post-upgrade $subpkgname.pre-deinstall" + mkdir -p -m 0755 "$subrunimg/service/.s6-svscan" "$subrunimg/service/s6-svscan-log" "$subpkgdir/usr/share/s6-linux-init-common" + mv "$runimg/uncaught-logs" "$subrunimg/" + mv "$runimg/service/s6-svscan-log" "$subrunimg/service/" + mkdir -m 0755 "$runimg/service/s6-svscan-log" + mv "$subrunimg/service/s6-svscan-log/run" "$runimg/service/s6-svscan-log/" + cp -f "$srcdir/reboot.sh" "$subpkgdir/usr/share/s6-linux-init-common/" +} + + +libs() { + pkgdesc="$pkgdesc (shared libraries)" + depends="skalibs-libs>=$_skalibs_version" + mkdir -p "$subpkgdir/lib" + mv "$pkgdir"/lib/*.so.* "$subpkgdir/lib/" +} + + +dev() { + pkgdesc="$pkgdesc (development files)" + depends="skalibs-dev>=$_skalibs_version" + mkdir -p "$subpkgdir/usr" + mv "$pkgdir/usr/lib" "$pkgdir/usr/include" "$subpkgdir/usr/" +} + + +libsdev() { + pkgdesc="$pkgdesc (development files for dynamic linking)" + depends="$pkgname-dev" + mkdir -p "$subpkgdir/lib" + mv "$pkgdir"/lib/*.so "$subpkgdir/lib/" +} + + +doc() { + pkgdesc="$pkgdesc (documentation)" + depends= + install_if="docs $pkgname=$pkgver-r$pkgrel" + mkdir -p "$subpkgdir/usr/share/doc" + cp -a "$builddir/doc" "$subpkgdir/usr/share/doc/$pkgname" +} + +sha512sums="0b40601b25f88464b5ff63b7eddf6ffa30eb868d2d9652f3d6a608b8f508e46712214d6e674f74136e57dd4504eb71ef585c725ba1a6566cfc0a025e70cfadc9 s6-linux-init-1.0.1.0.tar.gz +756b0cbbe5dabb4631380c3c7ea199cc213224b2e36e50a2d012a61948170078b78bf49b85d886319fecf59843087f937d3d804723b2553ac9f94d088a2f0fd8 rc.init +e73c3c32b118831074288d23fadace2158a2b15d5a13ffa73290b92a9e39c2a21c73d3b0eabea29bcbaa5f6381611fd8d0aaa6aa691ec7de91b8ef6ae404b6da runlevel +7bb050248a5c2ab6a56c50c35f87cde724f97ff9882f5e60b0f0f2f14bd93c1df7d99fedc3d81c8519cf1a1ed90e03f1cbb9bf891c7b3618aa9a5f5738d262f4 rc.shutdown +de702d3a221993cd3192dae4544842402dfbe362bcc4105f3071df15eb0aa6c218bf401bbf221298ee063f6545fe909fd54abf1d1e9222e13bcdc9a29f9a2b19 reboot.sh" diff --git a/system/s6-linux-init/rc.init b/system/s6-linux-init/rc.init new file mode 100644 index 000000000..f96ed4d5e --- /dev/null +++ b/system/s6-linux-init/rc.init @@ -0,0 +1,9 @@ +#!/bin/sh -e + +rl="$1" +shift + +/sbin/openrc sysinit +/sbin/openrc boot + +exec /etc/s6-linux-init/current/scripts/runlevel "$rl" diff --git a/system/s6-linux-init/rc.shutdown b/system/s6-linux-init/rc.shutdown new file mode 100644 index 000000000..6fa64f6bc --- /dev/null +++ b/system/s6-linux-init/rc.shutdown @@ -0,0 +1,3 @@ +#!/bin/sh -e + +exec /sbin/openrc empty diff --git a/system/s6-linux-init/reboot.sh b/system/s6-linux-init/reboot.sh new file mode 100644 index 000000000..d0d87aeb6 --- /dev/null +++ b/system/s6-linux-init/reboot.sh @@ -0,0 +1,21 @@ +#!/bin/sh -e + +# This script performs a "poor man's reboot" when the +# init infrastructures are not there to do a proper one. +# This is the case when the user *just* switched between +# sysvinit and s6-linux-init, and needs to shut down the +# old system but the shutdown binaries are the ones from +# the new system. +# +# Always launch it from a console tty (tty1, ... tty6), +# never from a network terminal or an xterm. + +trap "" INT HUP TERM +mkdir -p -m 0755 /etc/runlevels/empty2 +/sbin/openrc empty2 +rmdir /etc/runlevels/empty2 +sync +/etc/init.d/killprocs start +/etc/init.d/savecache start +/etc/init.d/mount-ro start +/sbin/reboot -f diff --git a/system/s6-linux-init/runlevel b/system/s6-linux-init/runlevel new file mode 100644 index 000000000..f34018ea2 --- /dev/null +++ b/system/s6-linux-init/runlevel @@ -0,0 +1,5 @@ +#!/bin/sh -e + +test "$#" -gt 0 || { echo 'runlevel: fatal: too few arguments' 1>&2 ; exit 100 ; } + +exec /sbin/openrc "$1" diff --git a/system/s6-linux-init/s6-linux-init-common.post-upgrade b/system/s6-linux-init/s6-linux-init-common.post-upgrade new file mode 100644 index 000000000..335559a3c --- /dev/null +++ b/system/s6-linux-init/s6-linux-init-common.post-upgrade @@ -0,0 +1,5 @@ +#!/bin/sh -e + +# apk does not handle fifos correctly. + +exec rm -f /etc/s6-linux-init/current/run-image/service/s6-svscan-log/fifo.apk-new diff --git a/system/s6-linux-init/s6-linux-init-common.pre-deinstall b/system/s6-linux-init/s6-linux-init-common.pre-deinstall new file mode 100644 index 000000000..691e2cca0 --- /dev/null +++ b/system/s6-linux-init/s6-linux-init-common.pre-deinstall @@ -0,0 +1,5 @@ +#!/bin/sh -e + +# apk does not handle fifos correctly. + +exec rm -f /etc/s6-linux-init/current/run-image/service/s6-svscan-log/fifo diff --git a/system/s6-linux-init/s6-linux-init.post-install b/system/s6-linux-init/s6-linux-init.post-install new file mode 100644 index 000000000..8e24f6d42 --- /dev/null +++ b/system/s6-linux-init/s6-linux-init.post-install @@ -0,0 +1,25 @@ +#!/bin/sh -e + +newv="$1" +oldv="$2" + +cat <<EOF + +* +* You installed the s6-linux-init package. If it's your first installation, +* please ignore this message. But if you just removed the sysvinit +* package in order to use s6-linux-init instead, please read on. +* +* In order to complete the switch, you need to reboot your machine. But +* beware: just for this time, the usual shutdown commands won't work, +* because they are designed to work with s6-linux-init but you are still +* running sysvinit until you reboot. So, for your next reboot (and +* only this one), the command you will need to run (as root, FROM A +* CONSOLE TTY - not an xterm, not a network connection) is: +* +* /bin/sh /usr/share/s6-linux-init-common/reboot.sh +* +* Please save your work and perform that reboot as soon as you can. +* + +EOF diff --git a/system/s6-linux-init/s6-linux-init.post-upgrade b/system/s6-linux-init/s6-linux-init.post-upgrade new file mode 100644 index 000000000..322de1e6b --- /dev/null +++ b/system/s6-linux-init/s6-linux-init.post-upgrade @@ -0,0 +1,5 @@ +#!/bin/sh -e + +# apk does not handle fifos correctly. + +exec rm -f /etc/s6-linux-init/current/run-image/service/s6-linux-init-shutdownd/fifo.apk-new diff --git a/system/s6-linux-init/s6-linux-init.pre-deinstall b/system/s6-linux-init/s6-linux-init.pre-deinstall new file mode 100644 index 000000000..bc72c70a0 --- /dev/null +++ b/system/s6-linux-init/s6-linux-init.pre-deinstall @@ -0,0 +1,5 @@ +#!/bin/sh -e + +# apk does not handle fifos correctly. + +exec rm -f /etc/s6-linux-init/current/run-image/service/s6-linux-init-shutdownd/fifo |