From 13744710e120a8bbdea432ec1fb82f13ecc66a22 Mon Sep 17 00:00:00 2001 From: "Z. Liu" Date: Wed, 18 Dec 2024 11:37:24 +0800 Subject: [PATCH] sys-process/runit: remove dependency on openrc runit can be used either as a replacement of init (pid 1) or as a process supervisor. We're discussing the first case here. Currently, Gentoo use openrc to handle service startup and stop in runit's stage 1 & 3, which might be too heavy for a lighweight init. Most people who choose runit as init will likely to write their own scripts. Therefore, the call of openrc is changed to a template script, and won't be called by default. Additionally, to provide users with more options, a new USE "scripts" is added. If disabled, no script(s) will be installed into /etc/runit. 1. remove dependency on openrc, add USE scripts (enabled by default), if disabled, will keep /etc/runit clean. 2. replace /bin/sh w/ /bin/bash for stage 1 & 3 scripts. 3. add /etc/runit/rc.sh to call user-defined scripts during stage 1 & 3 4. move the call of openrc in /etc/runit/{1,3} to /etc/runit/rc/{1,3}.openrc.example Closes: https://bugs.gentoo.org/611846 Reviewed-by: Alex Efros Signed-off-by: Z. Liu Closes: https://github.com/gentoo/gentoo/pull/39776 Signed-off-by: Sam James --- sys-process/runit/files/{1-2.1.2 => 1-r1} | 0 sys-process/runit/files/1-r2 | 11 ++ sys-process/runit/files/1.openrc.example | 6 + sys-process/runit/files/{2-2.1.2 => 2-r1} | 0 sys-process/runit/files/{3-2.1.2 => 3-r1} | 0 sys-process/runit/files/3-r2 | 15 ++ sys-process/runit/files/3.openrc.example | 7 + sys-process/runit/files/rc.sh | 16 ++ .../files/{run.getty-2.1.2 => run.getty} | 0 sys-process/runit/metadata.xml | 3 + sys-process/runit/runit-2.1.2-r6.ebuild | 8 +- sys-process/runit/runit-2.1.2-r7.ebuild | 169 ++++++++++++++++++ ...nit-2.2.0.ebuild => runit-2.2.0-r1.ebuild} | 44 +++-- 13 files changed, 259 insertions(+), 20 deletions(-) rename sys-process/runit/files/{1-2.1.2 => 1-r1} (100%) create mode 100644 sys-process/runit/files/1-r2 create mode 100644 sys-process/runit/files/1.openrc.example rename sys-process/runit/files/{2-2.1.2 => 2-r1} (100%) rename sys-process/runit/files/{3-2.1.2 => 3-r1} (100%) create mode 100644 sys-process/runit/files/3-r2 create mode 100644 sys-process/runit/files/3.openrc.example create mode 100644 sys-process/runit/files/rc.sh rename sys-process/runit/files/{run.getty-2.1.2 => run.getty} (100%) create mode 100644 sys-process/runit/runit-2.1.2-r7.ebuild rename sys-process/runit/{runit-2.2.0.ebuild => runit-2.2.0-r1.ebuild} (76%) diff --git a/sys-process/runit/files/1-2.1.2 b/sys-process/runit/files/1-r1 similarity index 100% rename from sys-process/runit/files/1-2.1.2 rename to sys-process/runit/files/1-r1 diff --git a/sys-process/runit/files/1-r2 b/sys-process/runit/files/1-r2 new file mode 100644 index 0000000000000..0ca4cc880e91d --- /dev/null +++ b/sys-process/runit/files/1-r2 @@ -0,0 +1,11 @@ +#!/bin/bash +# system one time tasks + +PATH=/sbin:/usr/sbin:/bin:/usr/bin + +. /etc/runit/rc.sh + +run_rc_stage 1 + +touch /etc/runit/stopit +chmod 0 /etc/runit/stopit diff --git a/sys-process/runit/files/1.openrc.example b/sys-process/runit/files/1.openrc.example new file mode 100644 index 0000000000000..816c33d26372c --- /dev/null +++ b/sys-process/runit/files/1.openrc.example @@ -0,0 +1,6 @@ +#!/bin/sh + +# example script in stage 1 using openrc, sys-apps/openrc must be installed + +RUNLEVEL=S /sbin/openrc sysinit +RUNLEVEL=S /sbin/openrc boot diff --git a/sys-process/runit/files/2-2.1.2 b/sys-process/runit/files/2-r1 similarity index 100% rename from sys-process/runit/files/2-2.1.2 rename to sys-process/runit/files/2-r1 diff --git a/sys-process/runit/files/3-2.1.2 b/sys-process/runit/files/3-r1 similarity index 100% rename from sys-process/runit/files/3-2.1.2 rename to sys-process/runit/files/3-r1 diff --git a/sys-process/runit/files/3-r2 b/sys-process/runit/files/3-r2 new file mode 100644 index 0000000000000..0b757c01fe223 --- /dev/null +++ b/sys-process/runit/files/3-r2 @@ -0,0 +1,15 @@ +#!/bin/bash +exec >/dev/console 2>&1 +PATH=/sbin:/usr/sbin:/bin:/usr/bin + +echo 'Waiting for getties to stop...' +sv -w 10 force-shutdown /etc/service/getty-* + +echo 'Waiting for services to stop...' +sv -w 300 force-shutdown /etc/service/* + +echo 'Shutdown...' + +. /etc/runit/rc.sh + +run_rc_stage 3 diff --git a/sys-process/runit/files/3.openrc.example b/sys-process/runit/files/3.openrc.example new file mode 100644 index 0000000000000..2e4cb44f08eff --- /dev/null +++ b/sys-process/runit/files/3.openrc.example @@ -0,0 +1,7 @@ +#!/bin/sh + +# example script in stage 3 using openrc, sys-apps/openrc must be installed + +test -x /etc/runit/reboot && LAST=6 || LAST=0 +test -x /etc/runit/reboot && RC=reboot || RC=shutdown +RUNLEVEL=$LAST /sbin/openrc $RC diff --git a/sys-process/runit/files/rc.sh b/sys-process/runit/files/rc.sh new file mode 100644 index 0000000000000..6e382ff9b7129 --- /dev/null +++ b/sys-process/runit/files/rc.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# run script(s) at /etc/runit/rc/, suffix must be .sh, prefix +# must be [1|3] which denote stage 1 or 3. +run_rc_stage() { + local prefix="${1}" + local prev_opt=$(shopt -p nullglob) + shopt -s nullglob + for file in /etc/runit/rc/"${prefix}".*.sh; do + if [[ ! -x "${file}" ]] || [[ ! -s "${file}" ]] ; then + continue + fi + . "${file}" + done + ${prev_opt} +} diff --git a/sys-process/runit/files/run.getty-2.1.2 b/sys-process/runit/files/run.getty similarity index 100% rename from sys-process/runit/files/run.getty-2.1.2 rename to sys-process/runit/files/run.getty diff --git a/sys-process/runit/metadata.xml b/sys-process/runit/metadata.xml index 73e765e89483f..b959aa013a8bd 100644 --- a/sys-process/runit/metadata.xml +++ b/sys-process/runit/metadata.xml @@ -12,4 +12,7 @@ clan/runit + + Install boot scripts into /etc/runit/. + diff --git a/sys-process/runit/runit-2.1.2-r6.ebuild b/sys-process/runit/runit-2.1.2-r6.ebuild index 3cc37408a6eec..2e67b0119a0d5 100644 --- a/sys-process/runit/runit-2.1.2-r6.ebuild +++ b/sys-process/runit/runit-2.1.2-r6.ebuild @@ -69,15 +69,15 @@ src_install() { exeinto /etc/runit doexe "${FILESDIR}"/ctrlaltdel - newexe "${FILESDIR}"/1-${PV} 1 - newexe "${FILESDIR}"/2-${PV} 2 - newexe "${FILESDIR}"/3-${PV} 3 + newexe "${FILESDIR}"/1-r1 1 + newexe "${FILESDIR}"/2-r1 2 + newexe "${FILESDIR}"/3-r1 3 dodir /etc/sv for tty in tty1 tty2 tty3 tty4 tty5 tty6; do exeinto /etc/sv/getty-$tty/ newexe "${FILESDIR}"/finish.getty finish - newexe "${FILESDIR}"/run.getty-${PV} run + newexe "${FILESDIR}"/run.getty run for script in finish run; do sed -i -e "s:TTY:${tty}:g" "${ED}"/etc/sv/getty-$tty/$script done diff --git a/sys-process/runit/runit-2.1.2-r7.ebuild b/sys-process/runit/runit-2.1.2-r7.ebuild new file mode 100644 index 0000000000000..1ef4c5e2877db --- /dev/null +++ b/sys-process/runit/runit-2.1.2-r7.ebuild @@ -0,0 +1,169 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit toolchain-funcs flag-o-matic + +DESCRIPTION="A UNIX init scheme with service supervision" +HOMEPAGE="https://smarden.org/runit/" +PATCH_VER=20240905 +SRC_URI=" + https://smarden.org/runit/${P}.tar.gz + https://github.com/clan/runit/releases/download/${PV}-r5/${P}-patches-${PATCH_VER}.tar.xz +" +S=${WORKDIR}/admin/${P}/src + +LICENSE="BSD" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~m68k ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86" +IUSE="+scripts split-usr static" + +src_unpack() { + unpack ${P}.tar.gz + unpack ${P}-patches-${PATCH_VER}.tar.xz +} + +src_prepare() { + default + + cd "${S}"/.. || die + eapply -p3 "${WORKDIR}"/patches + cd "${S}" || die + + # We either build everything or nothing static + sed -i -e 's:-static: :' Makefile || die + + # see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726008 + [[ ${COMPILER} == "diet" ]] && + use ppc && + filter-flags "-mpowerpc-gpopt" +} + +src_configure() { + use static && append-ldflags -static + + append-flags -std=gnu17 # XXX https://bugs.gentoo.org/946137, workaround for gcc15 + echo "$(tc-getCC) ${CFLAGS}" > conf-cc || die + echo "$(tc-getCC) ${LDFLAGS}" > conf-ld || die + sed -i -e "s:ar cr:$(tc-getAR) cr:" print-ar.sh || die + sed -i -e "s:ranlib :$(tc-getRANLIB) :" print-ar.sh || die +} + +src_install() { + dobin $(<../package/commands) + dodir /sbin + mv "${ED}"/usr/bin/{runit-init,runit,utmpset} "${ED}"/sbin/ || die "dosbin" + if use split-usr ; then + dosym ../etc/runit/2 /sbin/runsvdir-start + else + dosym ../../etc/runit/2 /sbin/runsvdir-start + fi + + DOCS=( ../package/{CHANGES,README,THANKS,TODO} ) + HTML_DOCS=( ../doc/*.html ) + einstalldocs + doman ../man/*.[18] + + if use scripts ; then + exeinto /etc/runit + doexe "${FILESDIR}"/ctrlaltdel + newexe "${FILESDIR}"/1-r2 1 + newexe "${FILESDIR}"/2-r1 2 + newexe "${FILESDIR}"/3-r2 3 + doexe "${FILESDIR}"/rc.sh + insinto /etc/runit/rc + doins "${FILESDIR}"/1.openrc.example + doins "${FILESDIR}"/3.openrc.example + fi + + dodir /etc/sv + for tty in tty1 tty2 tty3 tty4 tty5 tty6; do + exeinto /etc/sv/getty-$tty/ + newexe "${FILESDIR}"/finish.getty finish + newexe "${FILESDIR}"/run.getty run + for script in finish run; do + sed -i -e "s:TTY:${tty}:g" "${ED}"/etc/sv/getty-$tty/$script + done + done + + # make sv command work + newenvd - 20runit <<- EOF + #/etc/env.d/20runit + SVDIR="/etc/service/" + EOF +} + +default_config() { + local sv="${EROOT}"/etc/sv + local service="${EROOT}"/etc/service + mkdir -p "${service}" || die + for x in tty1 tty2 tty3 tty4 tty5 tty6; do + ln -sf "${sv}"/getty-$x "${service}"/getty-$x || die + done + einfo "The links to services runit will supervise are installed" + einfo "in $service." + einfo "If you need multiple runlevels, please see the documentation" + einfo "for how to set them up." + einfo +} + +migrate_from_211() { + # Create /etc/service and /var/service if requested + if [[ -e "${T}"/make_var_service ]]; then + ln -sf "${EROOT}"/etc/runit/runsvdir/current "${EROOT}"/etc/service || die + ln -sf "${EROOT}"/etc/runit/runsvdir/current "${EROOT}"/var/service || die + fi + if [[ -d "${T}"/runsvdir ]]; then + cp -a "${T}"/runsvdir "${EROOT}"/etc/runit || die + fi + return 0 +} + +pkg_preinst() { + if has_version '