RFC: support for "first boot" rc.d scripts

Colin Percival cperciva at freebsd.org
Mon Oct 14 19:12:07 UTC 2013


On 10/14/13 10:00, Ian Lepore wrote:
> On Mon, 2013-10-14 at 09:51 -0700, Colin Percival wrote:
>> Yes, it's hard to store state on diskless systems... but I figured
>> that anyone building a diskless system would know to not create a
>> "run firstboot scripts" marker.  And not all embedded systems are
>> diskless...
> 
> The embedded systems we create at $work have readonly root and mfs /var,
> but we do have writable storage on another filesystem.  It would work
> for us (not that we need this feature right now) if there were an rcvar
> that pointed to the marker file.  Of course to make it work, something
> would have to get the alternate filesystem mounted early enough to be
> useful (that is something we do already with a custom rc script).

Indeed... the way my patch currently does things, it looks for the
firstboot sentinel at the start of /etc/rc, which means it *has* to
be on /.  Making the path an rcvar is a good idea (updated patch
attached) but we still need some way to re-probe for that file after
mounting extra filesystems.

> Note that I'm not asking for any changes here, just babbling.

Babbling is good.  Between us we might babble a useful solution. ;-)

-- 
Colin Percival
Security Officer Emeritus, FreeBSD | The power to serve
Founder, Tarsnap | www.tarsnap.com | Online backups for the truly paranoid
-------------- next part --------------
Index: etc/defaults/rc.conf
===================================================================
--- etc/defaults/rc.conf	(revision 256432)
+++ etc/defaults/rc.conf	(working copy)
@@ -619,6 +619,9 @@
 accounting_enable="NO"	# Turn on process accounting (or NO).
 ibcs2_enable="NO"	# Ibcs2 (SCO) emulation loaded at startup (or NO).
 ibcs2_loaders="coff"	# List of additional Ibcs2 loaders (or NO).
+firstboot_sentinel="/firstboot"	# Scripts with "firstboot" keyword are run if
+			# this file exists.  Should be on a R/W filesystem so
+			# the file can be deleted after the boot completes.
 
 # Emulation/compatibility services provided by /etc/rc.d/abi
 sysvipc_enable="NO"	# Load System V IPC primitives at startup (or NO).
Index: etc/rc
===================================================================
--- etc/rc	(revision 256432)
+++ etc/rc	(working copy)
@@ -81,6 +81,9 @@
 		skip="$skip -s nojailvnet"
 	fi
 fi
+if ! [ -e ${firstboot_sentinel} ]; then
+	skip="$skip -s firstboot"
+fi
 
 # Do a first pass to get everything up to $early_late_divider so that
 # we can do a second pass that includes $local_startup directories
@@ -116,6 +119,13 @@
 	run_rc_script ${_rc_elem} ${_boot}
 done
 
+if [ -e ${firstboot_sentinel} ]; then
+	rm ${firstboot_sentinel}
+	if [ -e ${firstboot_sentinel}-reboot ]; then
+		rm ${firstboot_sentinel}-reboot
+		kill -INT 1
+	fi
+fi
 echo ''
 date
 exit 0


More information about the freebsd-rc mailing list