In Linux systems, directories ending with .d
(short for "directory") follow a special convention for configuration management. These directories serve as:
- Drop-in locations for modular configuration files
- Standardized way to split configuration into manageable parts
- Package-maintainer friendly structure
The standard Apache layout demonstrates this perfectly:
/etc/httpd/conf/httpd.conf # Main configuration
/etc/httpd/conf.d/ # Additional configs
/etc/httpd/conf.modules.d/ # Module-specific configs
The httpd.conf
typically includes directives like:
# In httpd.conf
IncludeOptional conf.d/*.conf
IncludeOptional conf.modules.d/*.conf
Other common .d directories include:
/etc/cron.d/ # System cron jobs
/etc/security/limits.d/ # User limits
/etc/sysctl.d/ # Kernel parameters
/etc/apt/sources.list.d/ # APT repositories
Several technical advantages emerge from this pattern:
- Package Safety - Packages can add configs without modifying main files
- Atomic Changes - Individual files can be safely added/removed
- Version Control - Easier to track changes to discrete files
For your own applications, implement similar behavior:
#!/bin/bash
# Example init script snippet
for f in /etc/myapp/conf.d/*.conf; do
[ -f "$f" ] || continue
source "$f"
done
Or in Python:
import glob
import configparser
config = configparser.ConfigParser()
for conf_file in glob.glob('/etc/myapp/conf.d/*.conf'):
config.read(conf_file)
- Use alphabetical sorting for predictable load order
- Document file naming conventions (e.g. prefix numbers for ordering)
- Include sanity checking in your config parser
- Consider file permissions (usually root:root 644)
In Linux systems, the .d
suffix denotes a directory containing modular configuration files. This convention allows for:
- Clean separation of configuration components
- Easier package management
- Dynamic configuration loading
The key difference between /etc/httpd/conf
and /etc/httpd/conf.d
:
# Main configuration (monolithic approach)
/etc/httpd/conf/httpd.conf
# Example content:
ServerRoot "/etc/httpd"
Listen 80
# Modular configuration (recommended)
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.d/vhosts.conf
# Example ssl.conf content:
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
</VirtualHost>
Directory | Purpose |
---|---|
/etc/init.d | System V init scripts |
/etc/cron.d | System-wide cron jobs |
/etc/apt/sources.list.d | Additional APT repositories |
/etc/systemd/systemd.conf.d | Systemd overrides |
When creating custom configuration files:
- Use descriptive filenames:
myapp.conf
rather thanconfig1.conf
- Include proper file extensions:
.conf
for Apache,.list
for APT - Set correct permissions: typically 644 (-rw-r--r--)
Example cron job creation:
# /etc/cron.d/backup-job
# Run daily backups at 2:30 AM
30 2 * * * root /usr/local/bin/backup-script.sh
Most services include this pattern in their default configuration:
# Typical Apache include directive
IncludeOptional conf.d/*.conf
# Systemd example
[Unit]
Include=/etc/systemd/system.conf.d/*.conf