diff --git a/recipes-appends/oe-core/busybox_%.bbappend b/recipes-appends/oe-core/busybox_%.bbappend index f737e8a..cddce88 100644 --- a/recipes-appends/oe-core/busybox_%.bbappend +++ b/recipes-appends/oe-core/busybox_%.bbappend @@ -20,6 +20,8 @@ SRC_URI += " \ file://busybox-udhcpd.confd \ file://busybox-udhcpd.initd \ " +SRC_URI:remove = "${@oe.utils.conditional('VIRTUAL-RUNTIME_initscripts', 'openrc', 'rcS.default', '', d)}" +RDEPENDS:${PN}:remove = "${@oe.utils.conditional('VIRTUAL-RUNTIME_initscripts', 'openrc', 'busybox-inittab', '', d)}" inherit openrc diff --git a/recipes-init/openrc-inittab-busybox/openrc-inittab-busybox/inittab.in b/recipes-init/openrc-inittab-busybox/openrc-inittab-busybox/inittab.in new file mode 100644 index 0000000..712eea7 --- /dev/null +++ b/recipes-init/openrc-inittab-busybox/openrc-inittab-busybox/inittab.in @@ -0,0 +1,5 @@ +::sysinit:${sbindir}/openrc sysinit +::sysinit:${sbindir}/openrc boot +::wait:${sbindir}/openrc default +::shutdown:${sbindir}/openrc shutdown +::ctrlaltdel:${sbindir}/openrc reboot diff --git a/recipes-init/openrc-inittab-busybox/openrc-inittab-busybox_1.0.bb b/recipes-init/openrc-inittab-busybox/openrc-inittab-busybox_1.0.bb new file mode 100644 index 0000000..fb81386 --- /dev/null +++ b/recipes-init/openrc-inittab-busybox/openrc-inittab-busybox_1.0.bb @@ -0,0 +1,45 @@ +SUMMARY = "BusyBox configuration for OpenRC" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI = "file://inittab.in" +S = "${WORKDIR}" +RPROVIDES:${PN} = "${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'busybox', 'virtual/openrc-inittab', '', d)}" + +INHIBIT_DEFAULT_DEPS = "1" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +USE_VT ?= "1" +SYSVINIT_ENABLED_GETTYS ?= "1" + +sbindir="${@d.getVar(bb.utils.contains('PACKAGECONFIG', 'usrmerge', 'sbindir', 'base_sbindir', d))}" + +do_install() { + install -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/inittab.in ${D}${sysconfdir}/inittab +} + +python update_inittab() { + import pathlib + + dest = pathlib.Path(d.getVar("D")) / d.getVar("sysconfdir").lstrip('/') / "inittab" + lines = dest.read_text().split('\n') + + for baud, dev in (x.split(';') for x in d.getVar("SERIAL_CONSOLES").split()): + lines.append(f"{dev}::askfirst:${{sbindir}}/getty {baud} - vt102") + + if d.getVar("USE_VT") == "1": + lines.append('') + for vt in d.getVar("SYSVINIT_ENABLED_GETTYS").split(): + lines.append(f"tty{vt}::respawn:${{sbindir}}/getty 38400 -") + + lines.append('') + + dest.write_text('\n'.join(d.expand(l) for l in lines)) +} + +do_install[postfuncs] += "update_inittab" + +RCONFLICTS:${PN} = "busybox-inittab sysvinit-inittab openrc-inittab-sysvinit" diff --git a/recipes-init/openrc-inittab-sysvinit/openrc-inittab-sysvinit/inittab.in b/recipes-init/openrc-inittab-sysvinit/openrc-inittab-sysvinit/inittab.in new file mode 100644 index 0000000..578302f --- /dev/null +++ b/recipes-init/openrc-inittab-sysvinit/openrc-inittab-sysvinit/inittab.in @@ -0,0 +1,31 @@ +# /etc/inittab: This file describes how the INIT process should set up +# the system in a certain run-level. + +# Default runlevel. +id:3:initdefault: + +# System initialization, mount local filesystems, etc. +si::sysinit:${sbindir}/openrc sysinit + +# Further system initialization, brings up the boot runlevel. +rc::bootwait:${sbindir}/openrc boot + +l0u:0:wait:${sbindir}/telinit u +l0:0:wait:${sbindir}/openrc shutdown +l0s:0:wait:${sbindir}/halt -dhp +l1:S1:wait:${sbindir}/openrc single +l2:2:wait:${sbindir}/openrc nonetwork +l3:3:wait:${sbindir}/openrc default +l4:4:wait:${sbindir}/openrc default +l5:5:wait:${sbindir}/openrc default +l6u:6:wait:${sbindir}/telinit u +l6:6:wait:${sbindir}/openrc reboot +l6r:6:wait:${sbindir}/reboot -d +#z6:6:respawn:${sbindir}/sulogin + +# new-style single-user +su0:S:wait:${sbindir}/openrc single +su1:S:wait:${sbindir}/sulogin + +# What to do at the "Three Finger Salute". +ca:12345:ctrlaltdel:${sbindir}/shutdown -r now diff --git a/recipes-init/openrc-inittab/openrc-inittab_1.0.bb b/recipes-init/openrc-inittab-sysvinit/openrc-inittab-sysvinit_1.0.bb similarity index 50% rename from recipes-init/openrc-inittab/openrc-inittab_1.0.bb rename to recipes-init/openrc-inittab-sysvinit/openrc-inittab-sysvinit_1.0.bb index db36b9e..900da2c 100644 --- a/recipes-init/openrc-inittab/openrc-inittab_1.0.bb +++ b/recipes-init/openrc-inittab-sysvinit/openrc-inittab-sysvinit_1.0.bb @@ -1,9 +1,10 @@ -SUMMARY = "Inittab configuration for OpenRC" +SUMMARY = "Sysvinit inittab configuration for OpenRC" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" -SRC_URI = "file://inittab" +SRC_URI = "file://inittab.in" S = "${WORKDIR}" +RPROVIDES:${PN} = "${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', 'sysvinit', 'virtual/openrc-inittab', '', d)}" INHIBIT_DEFAULT_DEPS = "1" @@ -13,31 +14,32 @@ do_compile[noexec] = "1" USE_VT ?= "1" SYSVINIT_ENABLED_GETTYS ?= "1" +sbindir="${@d.getVar(bb.utils.contains('PACKAGECONFIG', 'usrmerge', 'sbindir', 'base_sbindir', d))}" + do_install() { install -d ${D}${sysconfdir} - install -m 0644 ${WORKDIR}/inittab ${D}${sysconfdir}/inittab + install -m 0644 ${WORKDIR}/inittab.in ${D}${sysconfdir}/inittab } python update_inittab() { import pathlib - lines = [] + dest = pathlib.Path(d.getVar("D")) / d.getVar("sysconfdir").lstrip('/') / "inittab" + lines = dest.read_text().split('\n') for i, baud, dev in ((i, *x.split(';')) for i, x in enumerate(d.getVar("SERIAL_CONSOLES").split())): - lines.append(f"s{i}:12345:respawn:/sbin/getty {baud} {dev} vt102") + lines.append(f"s{i}:12345:respawn:${{sbindir}}/getty {baud} {dev} vt102") if d.getVar("USE_VT") == "1": lines.append('') for vt in d.getVar("SYSVINIT_ENABLED_GETTYS").split(): - lines.append(f"{vt}:12345:respawn:/sbin/getty 38400 tty{vt}") + lines.append(f"{vt}:12345:respawn:${{sbindir}}/getty 38400 tty{vt}") lines.append('') - dest = pathlib.Path(d.getVar("D")) / d.getVar("sysconfdir").lstrip('/') / "inittab" - with dest.open('a') as fp: - fp.write('\n'.join(lines)) + dest.write_text('\n'.join(d.expand(l) for l in lines)) } do_install[postfuncs] += "update_inittab" -RCONFLICTS:${PN} = "busybox-inittab sysvinit-inittab" +RCONFLICTS:${PN} = "busybox-inittab sysvinit-inittab openrc-inittab-busybox" diff --git a/recipes-init/openrc-inittab/openrc-inittab/inittab b/recipes-init/openrc-inittab/openrc-inittab/inittab deleted file mode 100644 index 9943811..0000000 --- a/recipes-init/openrc-inittab/openrc-inittab/inittab +++ /dev/null @@ -1,32 +0,0 @@ -# /etc/inittab: This file describes how the INIT process should set up -# the system in a certain run-level. - -# Default runlevel. -id:3:initdefault: - -# System initialization, mount local filesystems, etc. -si::sysinit:/sbin/openrc sysinit - -# Further system initialization, brings up the boot runlevel. -rc::bootwait:/sbin/openrc boot - -l0u:0:wait:/sbin/telinit u -l0:0:wait:/sbin/openrc shutdown -l0s:0:wait:/sbin/halt -dhp -l1:S1:wait:/sbin/openrc single -l2:2:wait:/sbin/openrc nonetwork -l3:3:wait:/sbin/openrc default -l4:4:wait:/sbin/openrc default -l5:5:wait:/sbin/openrc default -l6u:6:wait:/sbin/telinit u -l6:6:wait:/sbin/openrc reboot -l6r:6:wait:/sbin/reboot -d -#z6:6:respawn:/sbin/sulogin - -# new-style single-user -su0:S:wait:/sbin/openrc single -su1:S:wait:/sbin/sulogin - -# What to do at the "Three Finger Salute". -ca:12345:ctrlaltdel:/sbin/shutdown -r now - diff --git a/recipes-init/openrc/openrc/getty.confd b/recipes-init/openrc/openrc/getty.confd new file mode 100644 index 0000000..6eaee5d --- /dev/null +++ b/recipes-init/openrc/openrc/getty.confd @@ -0,0 +1,8 @@ +# Set the baud rate of the terminal line +#baud="" + +# set the terminal type +#term_type="linux" + +# extra options to pass to getty for this port +#getty_options="" diff --git a/recipes-init/openrc/openrc/getty.initd b/recipes-init/openrc/openrc/getty.initd new file mode 100644 index 0000000..adfbe1b --- /dev/null +++ b/recipes-init/openrc/openrc/getty.initd @@ -0,0 +1,30 @@ +#!/sbin/openrc-run + +supervisor=supervise-daemon +port="${RC_SVCNAME#*.}" +term_type="${term_type:-linux}" + +description="getty on terminal $port" +command=/sbin/getty +command_args="${getty_options} ${port} ${baud} ${term_type}" + + +depend() { + after local + keyword -prefix +} + +start_pre() { + if [ "$port" = "$RC_SVCNAME" ]; then + eerror "${RC_SVCNAME} cannot be started directly. You must create" + eerror "symbolic links to it for the ports you want to start" + eerror "getty on and add those to the appropriate runlevels." + return 1 + fi + export EINFO_QUIET=yes +} + +stop_pre() +{ + export EINFO_QUIET=yes +} diff --git a/recipes-init/openrc/openrc_0.45.2.bb b/recipes-init/openrc/openrc_0.45.2.bb index e6ed90c..62e9f4a 100644 --- a/recipes-init/openrc/openrc_0.45.2.bb +++ b/recipes-init/openrc/openrc_0.45.2.bb @@ -6,6 +6,8 @@ SRCREV = "3e5420b911922a14dd6b5cc3d2143dc30559caf4" SRC_URI = " \ git://github.com/openrc/openrc.git;nobranch=1;protocol=https \ file://volatiles.initd \ + file://getty.confd \ + file://getty.initd \ " S = "${WORKDIR}/git" @@ -21,17 +23,40 @@ PACKAGECONFIG[selinux] = "-Dselinux=enabled,-Dselinux=disabled,libselinux" PACKAGECONFIG[usrmerge] = "-Drootprefix=/usr,-Drootprefix=/" PACKAGECONFIG[zsh-completions] = "-Dzsh-completions=true,-Dzsh-completions=false" +openrc_sbindir = "${@bb.utils.contains('PACKAGECONFIG', 'usrmerge', '${sbindir}', '${base_sbindir}', d)}" +openrc_libdir = "${@bb.utils.contains('PACKAGECONFIG', 'usrmerge', '${libdir}', '${base_libdir}', d)}" + EXTRA_OEMESON += " \ -Dos=Linux \ -Dpkg_prefix=${prefix} \ + -Dsysvinit=true \ " +USE_VT ?= "1" +SYSVINIT_ENABLED_GETTYS ?= "1" + +add_getty() { + local dev="$1" + local baud="$2" + local term="$3" + ln -snf getty ${D}${OPENRC_INITDIR}/getty.${dev} + ln -snf ${OPENRC_INITDIR}/getty.${dev} ${D}${sysconfdir}/runlevels/default + echo "baud=${baud}" > ${D}${OPENRC_CONFDIR}/getty.${dev} + if [ -n "${term}" ]; then + echo "term_type=${term}" >> ${D}${OPENRC_CONFDIR}/getty.${dev} + fi +} + do_install:append() { # Default sysvinit doesn't do anything with keymaps on a minimal install so # we're not going to either. rm ${D}${sysconfdir}/runlevels/*/keymaps - install -m 755 ${WORKDIR}/volatiles.initd ${D}${OPENRC_INITDIR}/volatiles + for svc in getty volatiles; do + install -m 755 ${WORKDIR}/${svc}.initd ${D}${OPENRC_INITDIR}/${svc} + ! [ -f ${WORKDIR}/${svc}.confd ] || install -m 644 ${WORKDIR}/${svc}.confd ${D}${OPENRC_CONFDIR}/${svc} + sed -i "s|/sbin/openrc-run|${openrc_sbindir}/openrc-run|" ${D}${OPENRC_INITDIR}/${svc} + done ln -snf ${OPENRC_INITDIR}/volatiles ${D}${sysconfdir}/runlevels/boot if ! ${@bb.utils.contains('DISTRO_FEATURES', 'openrc', 'true', 'false', d)}; then @@ -40,18 +65,35 @@ do_install:append() { fi if ${@bb.utils.contains('PACKAGECONFIG', 'usrmerge', 'true', 'false', d)}; then - if [ -f ${D}${base_sbindir}/start-stop-daemon ]; then - mv ${D}${base_sbindir}/start-stop-daemon ${D}${sbindir}/start-stop-daemon.openrc + if [ -f ${D}${openrc_sbindir}/start-stop-daemon ]; then + mv ${D}${openrc_sbindir}/start-stop-daemon ${D}${openrc_sbindir}/start-stop-daemon.openrc fi - sed -i "s|/sbin/openrc-run|${sbindir}/openrc-run|" ${D}${OPENRC_INITDIR}/volatiles + fi + + # Remove bonus TTY scripts installed when -Dsysvinit=true is selected, and add the correct ones. + for x in 1 2 3 4 5 6; do + rm ${D}${OPENRC_INITDIR}/agetty.tty${x} ${D}${sysconfdir}/runlevels/default/agetty.tty${x} + done + consoles="$(echo "${SERIAL_CONSOLES}" | tr ';' ',')" + for entry in ${consoles}; do + dev="$(echo "${entry}" | cut -d, -f2-)" + baud="$(echo "${entry}" | cut -d, -f1)" + add_getty ${dev} ${baud} vt102 + done + if [ "${USE_VT}" = 1 ]; then + for vt in ${SYSVINIT_ENABLED_GETTYS}; do + add_getty "tty${vt}" 38400 + done fi } +PACKAGES =+ "${PN}-init" + RDEPENDS:${PN} = " \ kbd \ - ${@bb.utils.contains('DISTRO_FEATURES', 'openrc', 'openrc-inittab', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'openrc', 'virtual/openrc-inittab', '', d)} \ procps-sysctl \ - sysvinit \ + ${VIRTUAL-RUNTIME_init_manager} \ util-linux-fsck \ util-linux-mount \ util-linux-umount \ @@ -61,12 +103,39 @@ RCONFLICTS:${PN} = " \ init-ifupdown \ modutils-initscripts \ " +RCONFLICTS:${PN}-init = " \ + ${@oe.utils.str_filter_out(d.expand('${PN}-init'), d.getVar('VIRTUAL-RUNTIME_init_manager'), d)} \ +" + +RPROVIDES:${PN}-init = " \ + ${@oe.utils.conditional('VIRTUAL-RUNTIME_init_manager', d.expand('${PN}-init'), 'virtual/openrc-inittab', '', d)} \ +" FILES:${PN}-doc:append = " ${datadir}/${BPN}/support" -FILES:${PN}:append = " ${@bb.utils.contains('PACKAGECONFIG', 'usrmerge', '${libdir}/rc/', '${base_libdir}/rc/', d)}" +FILES:${PN}:append = " ${openrc_libdir}/rc/" +FILES:${PN}-init = " \ + ${openrc_sbindir}/init \ + ${openrc_sbindir}/halt \ + ${openrc_sbindir}/poweroff \ + ${openrc_sbindir}/reboot \ + ${openrc_sbindir}/shutdown \ + ${openrc_sbindir}/openrc-init \ + ${openrc_sbindir}/openrc-shutdown \ + ${OPENRC_CONFDIR}/getty \ + ${OPENRC_CONFDIR}/getty.* \ + ${OPENRC_INITDIR}/getty \ + ${OPENRC_INITDIR}/getty.* \ + ${sysconfdir}/runlevels/default/getty.* \ +" inherit update-alternatives ALTERNATIVE_PRIORITY = "100" ALTERNATIVE:${PN} = "start-stop-daemon" -ALTERNATIVE_LINK_NAME[start-stop-daemon] = "${@bb.utils.contains('PACKAGECONFIG', 'usrmerge', '${sbindir}', '${base_sbindir}', d)}/start-stop-daemon" +ALTERNATIVE:${PN}-init = "init halt poweroff reboot shutdown" +ALTERNATIVE_LINK_NAME[start-stop-daemon] = "${openrc_sbindir}/start-stop-daemon" +ALTERNATIVE_LINK_NAME[init] = "${openrc_sbindir}/init" +ALTERNATIVE_LINK_NAME[halt] = "${openrc_sbindir}/halt" +ALTERNATIVE_LINK_NAME[poweroff] = "${openrc_sbindir}/poweroff" +ALTERNATIVE_LINK_NAME[reboot] = "${openrc_sbindir}/reboot" +ALTERNATIVE_LINK_NAME[shutdown] = "${openrc_sbindir}/shutdown"