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

Colin Percival cperciva at freebsd.org
Sun Oct 13 22:59:20 UTC 2013

Hi all,

I've attached a very simple patch which makes /etc/rc:

1. Skip any rc.d scripts with the "firstboot" keyword if /var/db/firstboot
does not exist,

2. If /var/db/firstboot and /var/db/firstboot-reboot exist after running rc.d
scripts, reboot.

3. Delete /var/db/firstboot (and firstboot-reboot) after the first boot.

The purpose of this is to support "run on first boot" rc.d scripts.  These can
be useful for both virtual machines and embedded systems; unlike conventional
desktops and servers, these may have a lengthy gap between "installing" and
"turning on" the system.

As examples of what such scripts could do:

* In Amazon EC2, I use a "first boot" script to download an SSH public key
from EC2 so that users can log in to newly provisioned EC2 instances.

* Now that (starting from 10.0-BETA1) it is possible to use FreeBSD Update
to update everything on EC2 instances, I'm planning on writing a script which
runs 'freebsd-update fetch install' when the system first boots, and then
reboots if there were updates installed.  (I imagine this would be useful
to other embedded / VM providers too.)

* Once packages are provided (properly) for 10.0 I'd like to allow people to
specify a list of packages they want installed onto an EC2 instance and have
them downloaded and installed when the EC2 instance launches.

I'd like to get this into HEAD in the near future in the hope that I can
convince re@ that this is a simple enough (and safe enough) change to merge
before 10.0-RELEASE.


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/rc
--- etc/rc	(revision 256432)
+++ etc/rc	(working copy)
@@ -81,6 +81,9 @@
 		skip="$skip -s nojailvnet"
+if ! [ -e /var/db/firstboot ]; then
+	skip="$skip -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
@@ -116,6 +119,13 @@
 	run_rc_script ${_rc_elem} ${_boot}
+if [ -e /var/db/firstboot ]; then
+	rm /var/db/firstboot
+	if [ -e /var/db/firstboot-reboot ]; then
+		rm /var/db/firstboot-reboot
+		kill -INT 1
+	fi
 echo ''
 exit 0

More information about the freebsd-current mailing list