Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

MFC r256775,r256776:

  Add support for "first boot" rc.d scripts.

  Document this new functionality in rc.conf(5) and rc(8).

  Bump __FreeBSD_version so that ports can make use of this.

Approved by:	re (gjb)
  • Loading branch information...
commit 287864b1a7317cf7568bd46c04a058a453c45509 1 parent bb4ca79
@cperciva cperciva authored
3  etc/defaults/rc.conf
@@ -619,6 +619,9 @@ quotacheck_flags="-a" # Check all file system quotas (if enabled)
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).
24 etc/rc
@@ -82,10 +82,15 @@ if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then
+# If the firstboot sentinel doesn't exist, we want to skip firstboot scripts.
+if ! [ -e ${firstboot_sentinel} ]; then
+ skip_firstboot="-s firstboot"
# 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 @@ case ${local_startup} in
*) find_local_scripts_new ;;
-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=""
+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 @@ for _rc_elem in ${files}; do
run_rc_script ${_rc_elem} ${_boot}
+# 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
echo ''
exit 0
19 share/man/man5/rc.conf.5
@@ -24,7 +24,7 @@
.\" $FreeBSD$
-.Dd October 12, 2013
+.Dd October 19, 2013
@@ -3675,6 +3675,23 @@ and if
is set to
.Dq Li YES ,
this specifies a list of additional iBCS2 loaders to enable.
+.It Va firstboot_sentinel
+.Pq Vt str
+This variable specifies the full path to a
+.Dq first boot
+sentinel file.
+If a file exists with this path,
+.Pa rc.d
+scripts with the
+.Dq firstboot
+keyword will be run on startup and the sentinel file will be deleted
+after the boot process completes.
+The sentinel file must be located on a writable file system which is
+mounted no later than
+.Va early_late_divider
+to function properly.
+The default is
+.Pa /firstboot .
.It Va linux_enable
.Pq Vt bool
Set to
21 share/man/man8/rc.8
@@ -35,7 +35,7 @@
.\" @(#)rc.8 8.2 (Berkeley) 12/11/93
.\" $FreeBSD$
-.Dd September 23, 2013
+.Dd October 19, 2013
.Dt RC 8
@@ -129,6 +129,13 @@ and add
(only allow vnet-enabled jails) to the list of KEYWORDS to skip in
.Xr rcorder 8 .
+If the file
+.Va ${firstboot_sentinel}
+does not exist, add
+.Dq Li firstboot
+to the list of KEYWORDS to skip in
+.Xr rcorder 8 .
.Xr rcorder 8
to order the files in
@@ -156,6 +163,11 @@ Stop processing when the script that is the value of the
.Va $early_late_divider
has been run.
+Check again to see if the file
+.Va ${firstboot_sentinel}
+exists (in case it is located on a newly mounted file system)
+and adjust the list of KEYWORDs to skip appropriately.
.Xr rcorder 8 ,
this time including the scripts in the
@@ -164,6 +176,13 @@ directories.
Ignore everything up to the
.Va $early_late_divider ,
then start executing the scripts as described above.
+If the file
+.Va ${firstboot_sentinel}
+exists, delete it.
+If the file
+.Va ${firstboot_sentinel}-reboot
+also exists (because it was created by a script), then delete it and reboot.
.Ss Operation of Nm rc.shutdown
.Bl -enum
2  sys/sys/param.h
@@ -58,7 +58,7 @@
* in the range 5 to 9.
#undef __FreeBSD_version
-#define __FreeBSD_version 1000500 /* Master, propagated to newvers */
+#define __FreeBSD_version 1000501 /* Master, propagated to newvers */
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,

0 comments on commit 287864b

Please sign in to comment.
Something went wrong with that request. Please try again.