Table of Contents
As of NetBSD 1.5, the startup of the system changed to using rc-scripts for controlling services, similar to the init-system System V and Linux use, but without runlevels. This chapter is an overview of the rc-system and its configuration on NetBSD.
The startup files for the system reside under
      /etc, they are:
/etc/rc
/etc/rc.conf
/etc/rc.d/*
/etc/rc.lkm
/etc/rc.local
/etc/rc.shutdown
/etc/rc.subr
/etc/defaults/*
/etc/rc.conf.d/*
First, a look at controlling and supporting scripts, also documented in rc(8):
When the kernel has initialized all devices on
	  startup, it usually starts init(8), which in turn runs
	  /etc/rc
/etc/rc sorts the scripts in
	  /etc/rc.d using rcorder(8), and
	  runs them in that order. See the rcorder(8)
	  manpage for more details on how the order of
	  /etc/rc.d scripts is determined.
/etc/rc.subr
	  contains common functions used by many
	  /etc/rc.d/* scripts.
When shutting down the system with shutdown(8),
	  /etc/rc.shutdown is run which runs the
	  scripts in /etc/rc.d in reverse
	  order (as defined by rcorder(8)).
Additional scripts outside of the rc.d
      directory:
/etc/rc.lkm loads or unloads
	  Loadable Kernel Modules (LKMs), see modload(8) and
	  /etc/rc.d/lkm[123]. 
/etc/rc.local is almost the last
	  script called at boot up. This script can be edited by the
	  administrator to start local daemons that don't follow the
	  rc-concept.
For example, packages installed pkgsrc usually add their
	  startup files to /usr/pkg/etc/rc.d, and
	  it's left as a decision to the system administrator on
	  enabling them, either by manually copying/linking them to
	  /etc/rc.d, or by adding them to
	  /etc/rc.local. The following is the
	  example from the system for an apache web server added to
	  /etc/rc.local:
if [ -f /usr/pkg/etc/rc.d/apache ]; then /usr/pkg/etc/rc.d/apache start fi
There's a central config file for bootscripts, rc.conf(5)
      located in
      /etc/rc.conf.
      /etc/rc.conf loads its defaults from
      /etc/defaults/rc.conf, the latter of which
      should not be touched. In order to alter a default setting,
      an override may be installed in
      /etc/rc.conf.
For example, if you wanted to enable the Secure Shell Daemon:
#cd /etc; grep ssh defaults/rc.confsshd=NO sshd_flags=""#echo "sshd=YES" >> rc.conf
Or just edit /etc/rc.conf with your
      favorite editor. The same can be done with any default that
      needs to be changed. A common sequence often done after
      installing a fresh NetBSD system is:
#cat /etc/defaults/rc.conf >>/etc/rc.conf#vi /etc/rc.conf
Be careful to use “>>” and not
      “>” else you will destroy the default contents
      in /etc/rc.conf, which are critical to
      remain there! After you have copied the defaults that way,
      modify anything you need to in
      /etc/rc.conf. Be sure to consult the
      rc.conf(5) manpage to explain all the settings in
      detail.
Last and not least, the /etc/rc.conf.d/
      directory can be used for scripts-snippets from third party
      software, allowing setting only one or few settings per file.
The actual scripts that control services are in
      /etc/rc.d. Once a service has been activated
      or told not to activate in /etc/rc.conf it
      can be also be modified by calling the rc script from the command
      line, for example if an administrator needed to start the secure
      shell daemon:
#/etc/rc.d/sshd startStarting sshd.
The rc scripts must receive one of the following arguments:
start
stop
restart
kill
An example might be when a new record has been added to the named database on a named server:
#/etc/rc.d/named restartStopping named. Starting named.
A slightly more complex example is when a series of settings have been changed, for instance a firewall's ipfilter rules, ipnat configuration, and the secure shell server has switched encryption type:
#sh /etc/rc.d/ipfilter restart#sh /etc/rc.d/ipnat restart#sh /etc/rc.d/sshd restart
The startup system of every Unix system basically determines
      the order in which services are started one way or another.  On
      some Unix systems this is done by numbering the files and/or
      putting them in separate run level directories. (Solaris relies
      on wildcards like /etc/rc[23].d/S* being
      sorted numerically when expanded.) Or they simply put all the
      commands that should be started at system boot time into a
      single monolithic script, which can be messy. (This is what ancient
      BSD and NetBSD did before the rc-system).  On NetBSD this is done
      by the rc-scripts and their contents. Please note that NetBSD does
      not have multiple runlevels as found e.g. in System V systems
      like Solaris, or Linux. 
At the beginning of each of the rc-scripts in
      /etc/rc.d/*, there is a series of
      comment-lines that have one of the following items in them:
REQUIRE
PROVIDE
BEFORE
KEYWORD
These dictate the dependencies of that particular rc script and
      hence rcorder can easily work either “up” or
      “down” as the situation requires. Following is
      an example of the /etc/rc.d/nfsd
      script:
... PROVIDE: nfsd REQUIRE: mountd . /etc/rc.subr ...
Here we can see that this script provides the “nfsd” service, however, it requires “mountd” to be running first. The rcorder(8) utility will be used at system startup time to read through all the rc-scripts, and determine the correct order in which to run the rc-scripts (hence its name).
There are other resources available pertaining to the rc.d system:
One of the principal designers of rc.d, Luke Mewburn, gave a presentation on the system at USENIX 2001. It is available in PDF format.
Will Andrews wrote a Daemonnews article called The NetBSD rc.d System.