Bug 197152 - rc(8) config files under /usr/local/etc/rc.d/rc.conf.d/ are not sourced at startup
Summary: rc(8) config files under /usr/local/etc/rc.d/rc.conf.d/ are not sourced at st...
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: conf (show other bugs)
Version: 10.1-RELEASE
Hardware: Any Any
: --- Affects Only Me
Assignee: freebsd-rc (Nobody)
Depends on:
Reported: 2015-01-28 10:26 UTC by Jason Mann
Modified: 2015-07-18 14:04 UTC (History)
1 user (show)

See Also:

patch-share_man_man5_rc.subr.5 (777 bytes, patch)
2015-07-18 14:04 UTC, Jamie Landeg-Jones
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Jason Mann 2015-01-28 10:26:48 UTC

The rc.conf(5) man page states the following:

"In addition to /etc/rc.conf.local you can also place smaller configuration files for each rc(8) script in the /etc/rc.conf.d directory or <dir>/rc.conf.d directories specified in local_startup, which will be included by the load_rc_config function."

I have successfully split the contents of my /etc/rc.conf file into multiple files under /etc/rc.conf.d/ and these are all sourced and correctly acted upon at system startup.

However, if I relocate the port/package specific files to /usr/local/etc/rc.d/rc.conf.d/, but they are not acted upon at startup.

The default value of local_startup is "/usr/local/etc/rc.d", as defined in /etc/defaults/rc.conf.

This departs from the expected behaviour as described in rc.conf(5).


- Relocate a working rc config file from /etc/rc.conf.d/ to /usr/local/etc/rc.d/rc.conf.d/
- Reboot the system.
- Verify whether the service in question starts on boot.


- Service is not started at system startup.


- Service should be started at system startup.


I tested this on my system with the openntpd and dnsmasq packages.  Both started fine when their rc config files were under /etc/rc.conf.d/.  Neither started when those files were moved to /usr/local/etc/rc.d/rc.conf.d/.
Comment 1 Jason Mann 2015-01-28 11:21:23 UTC
Examination of the 'load_rc_config' function in /etc/subr reveals that any "rc.d" suffix would be removed from any paths specified in the local_startup parameter.

This means that the default local_startup value of /usr/local/etc/rc.d/ would instead result in rc config files being sourced from /usr/local/etc/rc.conf.d/, not /usr/local/etc/rc.d/rc.conf.d/.

The wording of the rc.conf(5) man page is misleading regarding this.  It states that scripts can be placed in "<dir>/rc.conf.d", where <dir> is the path specified in local_startup.  It follows that /usr/local/etc/rc.d/rc.conf.d would be where rc config scripts should be put.

I tested this by moving the rc config files from /usr/local/etc/rc.d/rc.conf.d/ to /usr/local/etc/rc.conf.d/ and rebooted.  Services then started as expected.

This bug might be reclassified as a documentation bug if this was the intended behaviour.
Comment 2 Jamie Landeg-Jones 2015-07-18 14:01:09 UTC
Yeah, it's a documentation bug - the rc.conf.d directory sits alongside rather than within any rc.d directory - as demonstrated by an example a few lines after the text you quoted.

However, this example is also buggy, in that a "/etc" is missing!

Attached is a proposed fix for both issues

cheers, Jamir
Comment 3 Jamie Landeg-Jones 2015-07-18 14:04:53 UTC
Created attachment 158941 [details]