Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for different init managers #23

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions recipes-appends/oe-core/busybox_%.bbappend
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
::sysinit:${sbindir}/openrc sysinit
::sysinit:${sbindir}/openrc boot
::wait:${sbindir}/openrc default
::shutdown:${sbindir}/openrc shutdown
::ctrlaltdel:${sbindir}/openrc reboot
45 changes: 45 additions & 0 deletions recipes-init/openrc-inittab-busybox/openrc-inittab-busybox_1.0.bb
Original file line number Diff line number Diff line change
@@ -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"
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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"

Expand All @@ -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"
32 changes: 0 additions & 32 deletions recipes-init/openrc-inittab/openrc-inittab/inittab

This file was deleted.

8 changes: 8 additions & 0 deletions recipes-init/openrc/openrc/getty.confd
Original file line number Diff line number Diff line change
@@ -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=""
30 changes: 30 additions & 0 deletions recipes-init/openrc/openrc/getty.initd
Original file line number Diff line number Diff line change
@@ -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
}
85 changes: 77 additions & 8 deletions recipes-init/openrc/openrc_0.45.2.bb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
mqqc marked this conversation as resolved.
Show resolved Hide resolved
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
Expand All @@ -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 \
Expand All @@ -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"