Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Oct 2013 12:47:44 -0700
From:      Colin Percival <cperciva@freebsd.org>
To:        Ian Lepore <ian@FreeBSD.org>
Cc:        FreeBSD current <freebsd-current@FreeBSD.org>, freebsd-rc@FreeBSD.org, Nick Hibma <nick@van-laarhoven.org>
Subject:   Re: RFC: support for "first boot" rc.d scripts
Message-ID:  <525EED60.2000404@freebsd.org>
In-Reply-To: <1381770007.42859.82.camel@revolution.hippie.lan>
References:  <525B258F.3030403@freebsd.org>	 <41F1219E-4DCC-4B04-A1DC-40038809556B@van-laarhoven.org>	 <525C210A.2000306@freebsd.org> <1381770007.42859.82.camel@revolution.hippie.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------060902050507040600000606
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

On 10/14/13 10:00, Ian Lepore wrote:
> 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).

New patch attached.  This one re-probes for the firstboot sentinel
after ${early_late_divider}, so you can set firstboot_sentinel to
/path/to/my/writable/storage as long as that's available once the
boot process reaches FILESYSTEMS (or NETWORKING, or whatever you
set early_late_divider to).  I figure that if we can assume all the
local rc.d scripts are available at that point we can assume that
wherever people decide to put the firstboot sentinel will also be
available at that point.

Does anyone see any problems with this?

-- 
Colin Percival
Security Officer Emeritus, FreeBSD | The power to serve
Founder, Tarsnap | www.tarsnap.com | Online backups for the truly paranoid


--------------060902050507040600000606
Content-Type: text/plain; charset=us-ascii;
 name="firstboot.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="firstboot.patch"

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)
@@ -82,10 +82,15 @@
 	fi
 fi
 
+# If the firstboot sentinel doesn't exist, we want to skip firstboot scripts.
+if ! [ -e ${firstboot_sentinel} ]; then
+	skip_firstboot="-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
 #
-files=`rcorder ${skip} /etc/rc.d/* 2>/dev/null`
+files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* 2>/dev/null`
 
 _rc_elem_done=' '
 for _rc_elem in ${files}; do
@@ -107,7 +112,13 @@
 *)	find_local_scripts_new ;;
 esac
 
-files=`rcorder ${skip} /etc/rc.d/* ${local_rc} 2>/dev/null`
+# The firstboot sentinel might be on a newly mounted filesystem; look for it
+# again and unset skip_firstboot if we find it.
+if [ -e ${firstboot_sentinel} ]; then
+	skip_firstboot=""
+fi
+
+files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} 2>/dev/null`
 for _rc_elem in ${files}; do
 	case "$_rc_elem_done" in
 	*" $_rc_elem "*)	continue ;;
@@ -116,6 +127,15 @@
 	run_rc_script ${_rc_elem} ${_boot}
 done
 
+# Remove the firstboot sentinel, and reboot if it was requested.
+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

--------------060902050507040600000606--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?525EED60.2000404>