rc: Remove rc_fast_and_loose

The rc_fast_and_loose variable allowed rc(8) to start services
by sourcing them into rc's own shell environment. Normally, each rc
service script is started by being sourced into its own subshell
instead.  The feature was meant to speed up rc(8) by avoiding the extra
forking necessary to spawn subshells.

In practice, the feature has been broken for a long time now. One of the
reasons is that some rc service scripts call the exit builtin to return
non-zero error codes, which not only terminates the service subshell
but also rc(8) when rc_fast_and_loose is enabled. For example,
a system running any of the supported FreeBSD releases
with rc_fast_and_loose=yes would abort rc(8) as early as rc.d/hostid,
due to an "exit 0".

Fixing rc_fast_and_loose support would require rewriting some rc scripts
to support being sourced directly into rc(8) process. This would muddy
the code base and also would prove difficult to maintain long term
as this is simply not how rc(8) users write scripts. The potential
performance benefits are unlikely to be significant even for use cases
such as Morello under qemu.

Instead, remove support for rc_fast_and_loose completely from rc(8)
and inform users about the change.

PR:		282255
Reviewed by:	brooks, christos, mhorne
Approved by:	christos (mentor), markj (mentor)
MFC after:	2 weeks
Relnotes:	yes
Differential Revision:	https://reviews.freebsd.org/D47264
This commit is contained in:
Mateusz Piotrowski 2024-10-23 14:57:29 +02:00
parent 10c429016a
commit a5ad360ff9
3 changed files with 20 additions and 43 deletions

View File

@ -27,6 +27,13 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 15.x IS SLOW:
world, or to merely disable the most expensive debugging functionality
at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20241025:
The support for the rc_fast_and_loose variable has been removed from
rc.subr(8). Users setting rc_fast_and_loose on their systems are
advised to make sure their customizations to rc service scripts
do not depend on having a single shell environment shared across
all the rc service scripts during booting and shutdown.
20241013:
The ciss driver was updated to cope better with hotplug events that
caused it to panic before, and to support more than 48 drives attached

View File

@ -1798,9 +1798,6 @@ _run_rc_killcmd()
# return value from the script.
# If `file' ends with `.sh' and lives in /etc/rc.d, ignore it as it's
# an old-style startup file.
# If `file' ends with `.sh' and does not live in /etc/rc.d, it's sourced
# into the current environment if $rc_fast_and_loose is set; otherwise
# it is run as a child process.
# If `file' appears to be a backup or scratch file, ignore it.
# Otherwise if it is executable run as a child process.
#
@ -1836,8 +1833,6 @@ run_rc_script()
if [ -n "$rc_boottrace" ]; then
boottrace_fn "$_file" "$_arg"
elif [ -n "$rc_fast_and_loose" ]; then
set $_arg; . $_file
else
( trap "echo Script $_file interrupted >&2 ; kill -QUIT $$" 3
trap "echo Script $_file interrupted >&2 ; exit 1" 2
@ -1909,19 +1904,8 @@ boottrace_fn()
_file=$1
_arg=$2
if [ -n "$rc_fast_and_loose" ]; then
boottrace_sysctl "$_file start"
set $_arg; . $_file
boottrace_sysctl "$_file done"
else
_boot="${_boot}" rc_fast="${rc_fast}" autoboot="${autoboot}" \
$boottrace_cmd "$_file" "$_arg"
fi
}
boottrace_sysctl()
{
${SYSCTL} kern.boottrace.boottrace="$1"
_boot="${_boot}" rc_fast="${rc_fast}" autoboot="${autoboot}" \
$boottrace_cmd "$_file" "$_arg"
}
#

View File

@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd September 22, 2024
.Dd October 23, 2024
.Dt RC.SUBR 8
.Os
.Sh NAME
@ -1017,41 +1017,27 @@ and
to enable tracing if any of those tags appear in
.Va DEBUG_SH .
.Pp
The startup behaviour of
.Ic run_rc_script
executes
.Ar file
depends upon the following checks:
unless:
.Bl -enum
.It
If
.Ar file
ends in
.Pa .sh ,
it is sourced into the current shell.
.Pa .sh
and lives in
.Pa /etc/rc.d .
.It
If
.Ar file
appears to be a backup or scratch file
(e.g., with a suffix of
.Pa ~ , # , .OLD ,
.Po e.g., with a suffix of
.Pa ~ , # , .OLD , ,v ,
or
.Pa .orig ) ,
ignore it.
.Pa .orig Pc .
.It
If
.Ar file
is not executable, ignore it.
.It
If the
.Xr rc.conf 5
variable
.Va rc_fast_and_loose
is empty,
source
.Ar file
in a sub shell,
otherwise source
.Ar file
into the current shell.
is not executable.
.El
.It Ic run_rc_scripts Oo options Oc file ...
Call