git: eb3e5718bfba - stable/12 - libexec/rc: Add var_run rc script

From: Cy Schubert <cy_at_FreeBSD.org>
Date: Mon, 12 Sep 2022 00:43:56 UTC
The branch stable/12 has been updated by cy:

URL: https://cgit.FreeBSD.org/src/commit/?id=eb3e5718bfba6e39d5dd34238b789ffaed974fad

commit eb3e5718bfba6e39d5dd34238b789ffaed974fad
Author:     Cy Schubert <cy@FreeBSD.org>
AuthorDate: 2022-08-28 12:48:25 +0000
Commit:     Cy Schubert <cy@FreeBSD.org>
CommitDate: 2022-09-12 00:43:42 +0000

    libexec/rc: Add var_run rc script
    
    Users with a tmpfs /var/run will lose the directory tree state of
    /var/run at reboot. This rc script will optionally (by default)
    capture the state of the directory structure in /var/run prior to
    shutdown and recreate it at system boot.
    
    Alternatively a user can save the state of the /var/run directories
    manually using service var_run save and disable the autosaving of
    /var/run state using the var_run_autosave variable, for those
    paranoid SSD users.
    
    PR:                     259585, 259699
    Reported by:            freebsd@walstatt-de.de,
    Reviewed by:            philip, gbe (previous version)
    Differential Revision:  https://reviews.freebsd.org/D36386
    
    (cherry picked from commit 27b9777c28b4e9474bdc500c28d04feec48fbb84)
---
 etc/mtree/BSD.var.dist   |  2 ++
 libexec/rc/rc.conf       |  6 ++++++
 libexec/rc/rc.d/Makefile |  1 +
 libexec/rc/rc.d/var_run  | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 share/man/man5/rc.conf.5 | 28 ++++++++++++++++++++++++++++
 5 files changed, 84 insertions(+)

diff --git a/etc/mtree/BSD.var.dist b/etc/mtree/BSD.var.dist
index 7b54508c7b96..c7b34ab4a1df 100644
--- a/etc/mtree/BSD.var.dist
+++ b/etc/mtree/BSD.var.dist
@@ -46,6 +46,8 @@
         ..
         ipf             mode=0700
         ..
+        mtree
+        ..
         ntp             uname=ntpd gname=ntpd
         ..
         pkg
diff --git a/libexec/rc/rc.conf b/libexec/rc/rc.conf
index e6024cbd9bf6..122033d7fd88 100644
--- a/libexec/rc/rc.conf
+++ b/libexec/rc/rc.conf
@@ -58,6 +58,12 @@ varmfs_flags="-S"	# Extra mount options for the mfs /var
 mfs_type="auto"		# "md", "tmpfs", "auto" to prefer tmpfs with md as fallback
 populate_var="AUTO"	# Set to YES to always (re)populate /var, NO to never
 cleanvar_enable="YES" 	# Clean the /var directory
+var_run_enable="NO" 	# Save/restore /var/run structure at shutdown/reboot
+var_run_autosave="NO" 	# Only restore /var/run structure at shutdown/reboot
+			# The user is expected to issue service var_run save to
+			# manually save the /var/run mtree
+var_run_mtree="/var/db/mtree/BSD.var-run.mtree"
+			# Where to save /var/run mtree
 local_startup="/usr/local/etc/rc.d" # startup script dirs.
 script_name_sep=" "	# Change if your startup scripts' names contain spaces
 rc_conf_files="/etc/rc.conf /etc/rc.conf.local"
diff --git a/libexec/rc/rc.d/Makefile b/libexec/rc/rc.d/Makefile
index 699505f98770..e7d00e3cc15c 100644
--- a/libexec/rc/rc.d/Makefile
+++ b/libexec/rc/rc.d/Makefile
@@ -119,6 +119,7 @@ CONFS=	DAEMON \
 	ugidfw \
 	${_utx} \
 	var \
+	var_run \
 	watchdogd
 
 .if ${MK_NIS} != "no"
diff --git a/libexec/rc/rc.d/var_run b/libexec/rc/rc.d/var_run
new file mode 100755
index 000000000000..8da3f40a0e7c
--- /dev/null
+++ b/libexec/rc/rc.d/var_run
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# PROVIDE: var_run
+# REQUIRE: mountcritlocal
+# BEFORE: cleanvar
+
+. /etc/rc.subr
+
+name=var_run
+rcvar=var_run_enable
+extra_commands="load save"
+start_cmd="_var_run_start"
+load_cmd="_var_run_load"
+save_cmd="_var_run_save"
+stop_cmd="_var_run_stop"
+
+load_rc_config $name
+
+# Set defaults
+: ${var_run_enable:="NO"}
+: ${var_run_mtree:="/var/db/mtree/BSD.var-run.mtree"}
+: ${var_run_autosave:="YES"}
+
+_var_run_load() {
+	test -f ${var_run_mtree} &&
+		mtree -U -i -q -f ${var_run_mtree} -p /var/run > /dev/null
+}
+
+_var_run_save() {
+	if [ ! -d $(dirname ${var_run_mtree}) ]; then
+		mkdir -p ${var_run_mtree}
+	fi
+	mtree -dcbj -p /var/run > ${var_run_mtree}
+}
+
+_var_run_start() {
+	df -ttmpfs /var/run > /dev/null 2>&1 &&
+		_var_run_load
+}
+
+_var_run_stop() {
+	df -ttmpfs /var/run > /dev/null 2>&1 &&
+		checkyesno var_run_autosave &&
+			_var_run_save
+}
+
+run_rc_command "$1"
diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5
index e11b25bcd651..0f82a5df93c6 100644
--- a/share/man/man5/rc.conf.5
+++ b/share/man/man5/rc.conf.5
@@ -447,6 +447,34 @@ is mounted on normal systems.
 Clean the
 .Pa /var
 directory.
+.It Va var_run_enable
+.Pq Vt bool
+Set to "YES" to enable saving of the
+.Pa /var/run
+directory strcucture into an mtree file at shutdown and the reload of the
+.Pa /var/run
+directory structure at boot.
+.It Va var_run_autosave
+.Pq Vt bool
+In some cases it may be undesirable to save
+.Pa /var/run
+at shutdown.
+When set to "NO"
+.Pa /var/run
+is loaded at reboot but not saved at shutdown. Typically in this scenario
+a
+.Pa service
+.Pa var_run
+.Pa save
+would be performed to save a copy of the
+.Pa /var/run
+directory structure once, to be reload during all subsequent reboots.
+.It Va var_run_mtree
+.Pq Vt str
+Where to save the
+.Pa /var/run
+mtree. The default location is
+.Pa /var/db/mtree/BSD.var-run.mtree .
 .It Va local_startup
 .Pq Vt str
 List of directories to search for startup script files.