Re: s6-init script

From: Paul Sopka <psopka_at_sopka.ch>
Date: Wed, 27 Nov 2024 23:09:48 +0100

>  It's generally a bad idea to close fd 2: it makes your system
> non-conformant to POSIX, and umount, if it assumes a conformant
> system, could have undefined behaviour here. If you don't want
> error messages, better redirect fd 2 to /dev/null instead.
> (util-linux's umount doesn't care, but that doesn't mean it's true for
> all other umount implementations.)
Thanks for the heads up I will not do this.

>  This is dangerous, because redirfd -wnb on a fifo will briefly open
> the fifo for reading (yes, it's a hack!) so depending on the scheduler
> your last redirfd can unblock the previous redirfd waiting on the
> catch-all logger, and spawn your rc.init too early.
>  Use fdmove -c 2 1 instead of the last redirfd -wnb to ensure proper
> synchronization of your rc.init.

I learned that the hard way, after about an hour of trial and error xD

>  What init messages?
>  If something floods you, it's probably that some s6-supervise is
> failing to bring a service up, and is trying again one second later.
> So it's likely that you just have something failing in your boot process.
All of the boot messages.
It was due to the logger with the 1 directive duping to stdout which
endet up in the catch all logger, duping it to stdout, ...
Exactly what Guillermo described here, except I forgot the -X fd:

> If I understand correctly, it is the combined effect of:
>
> * s6-linux-init (the program) dup()'ing standard error, and passing
> the resulting file descriptor to s6-svscan using its -X option.
> * s6-svscan acting on the -X option and redirecting the standard error
> of the catch-all logger's s6-supervise process to the console.
> * If using the catch-all logger 'run' script generated by s6-linux-init-maker:
> * The script redirecting standard error to standard output (with
> execline's fdmove)
> * The script invoking s6-log with the '1' action directive (copy
> logged messages to standard output).

I fixed it with s6-svscan -X.

This solves all issues, the current(tested) script looks like this:

| #!/usr/bin/execlineb
|
| export PATH /usr/bin/:/bin
|
| multisubstitute {
|     define UMASK 0022
|     define TMPFSDIR /run
|     define BASEDIR /etc/s6-linux-init/current
|     define RUNLEVEL default
| }
|
| foreground { echo s6-init }
|
| execline-cd /
| execline-umask ${UMASK}
|
| setsid
|
| redirfd -r 0 /dev/null
|
| foreground { redirfd -a 2 /dev/null umount ${TMPFSDIR} }
|
| if { mount -t tmpfs -o mode=0755 tmpfs ${TMPFSDIR} }
|
| if { cp -Rf ${BASEDIR}/run-image/. ${TMPFSDIR}/ }
|
| s6-envdir ${BASEDIR}/env
|
| redirfd -w -nb 1 ${TMPFSDIR}/service/s6-svscan-log/fifo
|
| background {
|     redirfd -w 2 ${TMPFSDIR}/service/s6-svscan-log/fifo
|     ${BASEDIR}/scripts/rc.init ${RUNLEVEL}
| }
|
| fdmove -c 2 1
|
| redirfd -w 3 /dev/console
|
| s6-svscan -X 3 ${TMPFSDIR}/service

Thank you both for your input!

Regards

Paul

Received on Wed Nov 27 2024 - 23:09:48 CET

This archive was generated by hypermail 2.4.0 : Wed Nov 27 2024 - 23:10:21 CET